在c#中调用存储过程oracle并非所有数据都绑定
Calling stored procedure oracle in c# not all data bound
我需要在 c# 中使用 oracle 存储过程。存储过程定义如下d:
CREATE OR REPLACE PACKAGE MGRWS10.test_mp
as
type tab_assoc_array is table of varchar2(2000) index by binary_integer;
function f_loten(p_item number) return tab_assoc_array;
procedure p_loten(p_item number, o_result out tab_assoc_array);
end;
/
在 c# 中我调用过程:
using (var cmd = _connection.CreateCommand()){
OracleParameter stringArray = new OracleParameter();
stringArray.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
stringArray.Direction = ParameterDirection.Output;
stringArray.ParameterName = "o_result";
stringArray.Size = 5;
stringArray.ArrayBindSize = new int[5];
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
cmd.CommandText = "test_mp.p_loten(:p_item, :o_result)";
cmd.Parameters.Add("p_item", 12942);
cmd.Parameters.Add(stringArray);
_connection.Open();
await cmd.ExecuteNonQueryAsync();
var x = (string[]) stringArray.Value;
}
执行cmd时,出现以下错误:
RA-01008:并非所有变量都绑定
试试这个:
cmd.CommandType = CommandType.Text;
cmd.CommandText = "BEGIN :o_result := test_mp.p_loten(:p_item); END;";
par = cmd.Parameters.Add("o_result", OracleDbType.Varchar2, ParameterDirection.ReturnValue)
par.CollectionType = OracleCollectionType.PLSQLAssociativeArray
cmd.Parameters.Add("p_item", OracleDbType.Int32, ParameterDirection.Input).Value = 12942;
但是,我从未使用 PLSQLAssociativeArray
作为 return 值,所以我不知道这段代码是否有效。
也许 return 一个 SYS_REFCURSOR
而不是 PLSQLAssociativeArray
,这肯定有效。
在这种情况下,您的 C# 代码可能如下所示:
cmd.CommandType = CommandType.Text;
cmd.CommandText = "BEGIN :o_result := test_mp.p_loten(:p_item); END;";
cmd.Parameters.Add("o_result", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
cmd.Parameters.Add("p_item", OracleDbType.Int32, ParameterDirection.Input).Value = 12942;
var da = new OracleDataAdapter(cmd); // or cmd.ExecuteNonQueryAsync();
var dt = new DataTable();
da.Fill(dt);
我需要在 c# 中使用 oracle 存储过程。存储过程定义如下d:
CREATE OR REPLACE PACKAGE MGRWS10.test_mp
as
type tab_assoc_array is table of varchar2(2000) index by binary_integer;
function f_loten(p_item number) return tab_assoc_array;
procedure p_loten(p_item number, o_result out tab_assoc_array);
end;
/
在 c# 中我调用过程:
using (var cmd = _connection.CreateCommand()){
OracleParameter stringArray = new OracleParameter();
stringArray.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
stringArray.Direction = ParameterDirection.Output;
stringArray.ParameterName = "o_result";
stringArray.Size = 5;
stringArray.ArrayBindSize = new int[5];
cmd.CommandType = CommandType.StoredProcedure;
cmd.BindByName = true;
cmd.CommandText = "test_mp.p_loten(:p_item, :o_result)";
cmd.Parameters.Add("p_item", 12942);
cmd.Parameters.Add(stringArray);
_connection.Open();
await cmd.ExecuteNonQueryAsync();
var x = (string[]) stringArray.Value;
}
执行cmd时,出现以下错误: RA-01008:并非所有变量都绑定
试试这个:
cmd.CommandType = CommandType.Text;
cmd.CommandText = "BEGIN :o_result := test_mp.p_loten(:p_item); END;";
par = cmd.Parameters.Add("o_result", OracleDbType.Varchar2, ParameterDirection.ReturnValue)
par.CollectionType = OracleCollectionType.PLSQLAssociativeArray
cmd.Parameters.Add("p_item", OracleDbType.Int32, ParameterDirection.Input).Value = 12942;
但是,我从未使用 PLSQLAssociativeArray
作为 return 值,所以我不知道这段代码是否有效。
也许 return 一个 SYS_REFCURSOR
而不是 PLSQLAssociativeArray
,这肯定有效。
在这种情况下,您的 C# 代码可能如下所示:
cmd.CommandType = CommandType.Text;
cmd.CommandText = "BEGIN :o_result := test_mp.p_loten(:p_item); END;";
cmd.Parameters.Add("o_result", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
cmd.Parameters.Add("p_item", OracleDbType.Int32, ParameterDirection.Input).Value = 12942;
var da = new OracleDataAdapter(cmd); // or cmd.ExecuteNonQueryAsync();
var dt = new DataTable();
da.Fill(dt);