Я вызываю функцию Oracle из моего кода C #, например:
string spName = "ANALYZERS.NEXT_COUNTER";
OracleCommand oracleCommand = new OracleCommand(spName, Utils.Connection)
{
CommandType = System.Data.CommandType.StoredProcedure
};
oracleCommand.Parameters.Add("P_COUNTER_TYPE", OracleDbType.Varchar2).Value = "ANALYZERS.STRING_COUNTER";
oracleCommand.Parameters.Add("P_WHERE_CLAUSE", OracleDbType.Varchar2).Value = "RCH04";
oracleCommand.Parameters.Add("P_CALLING_OBJECT", OracleDbType.Varchar2).Value = null;
oracleCommand.Parameters.Add("P_CALLING_USER", OracleDbType.Varchar2).Value = null;
oracleCommand.Parameters.Add("P_CAlLING_EVENT", OracleDbType.Varchar2).Value = null;
oracleCommand.Parameters.Add("P_ERROR", OracleDbType.Varchar2);
oracleCommand.Parameters["P_ERROR"].Direction = System.Data.ParameterDirection.Output;
oracleCommand.Parameters.Add("RETURN_VALUE", OracleDbType.Varchar2);
oracleCommand.Parameters["RETURN_VALUE"].Size = 4000;
oracleCommand.Parameters["RETURN_VALUE"].Direction = System.Data.ParameterDirection.ReturnValue;
if (Utils.Connection.State != System.Data.ConnectionState.Open)
{
Utils.Connection.Open();
}
try
{
oracleCommand.ExecuteNonQuery();
var retValue = oracleCommand.Parameters["RETURN_VALUE"].Value;
stringId = retValue.ToString();
Console.WriteLine(stringId);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
Utils.Connection.Close();
}
Когда я его выполняю, я получаю Неизвестный тип счетчика .... сообщение в retValue
, что неверно. Это потому, что значение параметра P_COUNTER_TYPE
является неправильным, что означает, что значение не передано должным образом.
Любая помощь? Как можно передать значение VARCHAR2 в функции Oracle? Обратите внимание, что я использую OracleDbType
вместо OracleType
.
Я видел статьи, в которых используется OracleType
. Есть ли проблема использования OracleDbType
вместо OracleType
?
Кусок функции Oracle:
CREATE OR REPLACE FUNCTION ANALYZERS.NEXT_COUNTER(P_COUNTER_TYPE IN VARCHAR2,
P_WHERE_CLAUSE IN VARCHAR2 DEFAULT NULL,
P_CALLING_OBJECT IN VARCHAR2,
P_CALLING_USER IN VARCHAR2,
P_CAlLING_EVENT IN VARCHAR2,
P_ERROR OUT VARCHAR2)
RETURN VARCHAR2 IS
.....
IF P_COUNTER_TYPE = 'ANALYZERS.STRING_COUNTER' THEN
-- Old Code
-- SELECT ANALYZERS.SEQ_STRING_COUNTER.NEXTVAL INTO V_RESULT FROM DUAL;
--
-- RETURN(SUBSTR(V_RESULT, -10));
SELECT CURRENT_YEAR
INTO V_CURR_YEAR
FROM ANALYZERS.SYSTEM_CURRENT_YEAR CY;
SELECT ANALYZERS.SEQ_STRING_COUNTER.NEXTVAL INTO V_RESULT FROM DUAL;
IF NVL(LENGTH(V_RESULT), 0) >= 8 THEN
V_NEXT_NUM := SUBSTR(V_RESULT, -8);
ELSE
V_NEXT_NUM := V_RESULT;
END IF;
V_RESULT := P_CALLING_LOCATION_ID || V_CURR_YEAR ||
LPAD(V_NEXT_NUM, 8, '0');
RETURN V_RESULT;
ELSE
P_ERROR := 'Unknown counter type....';
V_RESULT := NULL;
END IF;
RETURN V_RESULT;