我正在测试一个简单的Oracle过程,并以某种方式收到一个错误,但我看不出为什么。
using (var dbConnection = new OracleConnection(ConfigurationManager.ConnectionStrings["KWC"].ConnectionString))
{
using (var command = dbConnection.CreateCommand())
{
var data = new List<Tuple<int, string, string, string>>
{
Tuple.Create(1, "hello", "kitty", "empty1"),
Tuple.Create(2, "mike", "perry", "empty2")
};
int listCount = data.Count;
command.CommandText = "KWC_Test_Output";
command.CommandType = CommandType.StoredProcedure;
command.BindByName = true;
command.ArrayBindCount = listCount;
command.Parameters.Add("string1", OracleDbType.Varchar2, data.Select(t=>t.Item2).ToArray(), ParameterDirection.Input);
command.Parameters.Add("string2", OracleDbType.Varchar2, data.Select(t=>t.Item3).ToArray(), ParameterDirection.Input);
var returnParam = new OracleParameter("result", OracleDbType.Varchar2, null, ParameterDirection.Output) { ArrayBindSize = new int[2] { 255, 255 } };
command.Parameters.Add(returnParam);
//command.Parameters[2].ArrayBindSize = new int[data.Count()];
//command.Parameters[2].ArrayBindSize[0] = 100;
//command.Parameters[2].ArrayBindSize[1] = 100;
var myParams = command.Parameters; // for debugging
dbConnection.Open();
command.ExecuteNonQuery(); // gets exception here
Console.WriteLine("returned value from oracle procedure: " + command.Parameters["result"].Value);
}
}
我得到的错误是:
Oracle.ManagedDataAccess.Client.OracleException:'ORA-06550:linje 1,kolonne 7:PLS-00306:对“ KWC_TEST_OUTPUT”的调用中参数的数量或类型错误ORA-06550:linje 1,kolonne 7:PL / SQL:语句被忽略'
这是步骤:
CREATE OR REPLACE PROCEDURE KWC_Test_Output(p_string1 IN VARCHAR2, p_string2 IN VARCHAR2, result OUT VARCHAR2)
AS
BEGIN
IF p_string1 = 'exception' THEN
DBMS_OUTPUT.PUT_LINE(p_string1);
DBMS_OUTPUT.PUT_LINE(p_string2);
RAISE_APPLICATION_ERROR(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
ELSE
result := CONCAT(p_string1, p_string2);
DBMS_OUTPUT.PUT_LINE(result);
END IF;
EXCEPTION
WHEN OTHERS THEN
result := SQLERRM;
DBMS_OUTPUT.PUT_LINE(result);
END KWC_Test_Output;
有人可以告诉我为什么它失败了吗?预先感谢!
如果您有合适的TYPE定义,则可以传递数组。
create type kwc_result is table of varchar2(100);
create or replace procedure kwc_test_output(
p_string1 in varchar2
, p_string2 in varchar2
, result out kwc_result
)
as
...
end kwc_test_output;
我想用Oracle术语来说实际上是一个嵌套表。但是,由于当前不需要构建过程,因此只需一个简单的字符串即可。我想它可能是出于演示目的而精简的版本。