Имам две процедури в пакет (TEST_PAK), които са претоварени на Oracle 9i. Като параметри се приема низ, а другият масив. Проблемът, с който се сблъсквам, е, когато се опитвам да извикам с null като параметър. Използвам C# и ODP.NET за извикване на процедурите.
Ето главата на двата процеса:
PROCEDURE get_requests_with_files
(
o_results OUT sys_refcursor,
in_communicator IN VARCHAR2,
in_state IN VARCHAR2 -- State of requests wanted (use NULL for ALL records)
)
и
PROCEDURE get_requests_with_files
(
o_results OUT SYS_REFCURSOR,
in_communicator IN VARCHAR2,
in_states IN flagTableType
)
FlagTypeTable е начинът, по който предавам PLSQLAssociativeArray към моята процедура и всъщност не е част от проблема (мисля).
Ето C# кода, който използвам за извикване на proc.
private static DataSet GetRequests(String consumer, List<string> states)
{
try
{
const string query = "TEST_PAK.get_requests_with_files";
var retVal = new DataSet();
var oComm = new OracleCommand(query, _oConn);
var oDa = new OracleDataAdapter(oComm);
oComm.CommandType = CommandType.StoredProcedure;
oComm.CommandTimeout = CommandTimeout;
//Parameters
oComm.Parameters.Add("o_results", OracleDbType.RefCursor);
oComm.Parameters["o_results"].Direction = ParameterDirection.Output;
oComm.Parameters.Add("in_communicator", OracleDbType.Varchar2);
oComm.Parameters["in_communicator"].Value = consumer;
if (states.Count != 0)
{
oComm.Parameters.Add(new OracleParameter("in_states", OracleDbType.Varchar2)
{
CollectionType = OracleCollectionType.PLSQLAssociativeArray,
Value = states.ToArray()
});
}
else
{
oComm.Parameters.Add("in_state", OracleDbType.Varchar2);
oComm.Parameters["in_state"].Value = null;
}
_oConn.Open();
oDa.Fill(retVal);
return retVal;
}
catch (Exception ex)
{
Console.WriteLine(ex);
return null;
}
finally
{
if (_oConn.State != ConnectionState.Closed) _oConn.Close();
}
}
Опитах да поставя двоеточия пред параметрите, мислейки, че посочените параметри ще свършат работа без успех.
Знам, че мога да извикам кода в SQLDeveloper така:
variable o_results refcursor;
execute Apps.Base_communicator.get_requests_with_files(:o_results, in_communicator => 'MYCOMM', in_state => null);
print o_results;
Така че знам, че претоварванията работят, но не и как да ги извикам в c#
oComm.Parameters["in_state"].Value = null;
да бъдеoComm.Parameters["in_state"].Value = DBNull.value;
? msdn.microsoft.com/en-us/library/system.dbnull. aspx - person Shannon Severance   schedule 07.02.2013