我正在尝试从 Oracle 托管数据访问客户端调用以下 Oracle 存储过程
PROCEDURE CLONE_PRODUCT(p_f_cloned_prod_id IN product.product_id%TYPE,
p_f_name IN product.name%TYPE,
p_f_desc IN product.presentation_value%TYPE,
p_f_sys_issue IN product.product_reference%TYPE,
p_f_feature_names IN T_CHAR_TAB,
p_f_feature_values IN T_CHAR_TAB,
p_f_audit_user IN product.last_updated_by%TYPE,
p_f_product_id OUT product.product_id%TYPE)
在哪里
TYPE t_char_tab IS TABLE OF VARCHAR2(1000) INDEX BY BINARY_INTEGER;
使用此 C# 代码:
using (var cloneProductCmd = new OracleCommand("SPF_SQL.CLONE_PRODUCT", con))
{
cloneProductCmd.BindByName = true;
cloneProductCmd.CommandType = System.Data.CommandType.StoredProcedure;
cloneProductCmd.Parameters.Add("P_F_CLONED_PROD_ID", 1);
cloneProductCmd.Parameters.Add("P_F_NAME", "bob");
cloneProductCmd.Parameters.Add("P_F_DESC", "bob smith");
cloneProductCmd.Parameters.Add("P_F_SYS_ISSUE", 123);
var featureNames = new OracleParameter()
{
ParameterName = "P_F_FEATURE_NAMES",
Direction = System.Data.ParameterDirection.Input,
OracleDbType = OracleDbType.Varchar2,
Value = new string[] { "feature 1" }
};
cloneProductCmd.Parameters.Add(featureNames);
var featureValues = new OracleParameter()
{
ParameterName = "P_F_FEATURE_VALUES",
Direction = System.Data.ParameterDirection.Input,
OracleDbType = OracleDbType.Varchar2,
Value = new string[] { "value 1" }
};
cloneProductCmd.Parameters.Add(featureValues);
cloneProductCmd.Parameters.Add("P_F_AUDIT_USER", "me");
cloneProductCmd.Parameters.Add("P_F_PRODUCT_ID", OracleDbType.Decimal, System.Data.ParameterDirection.Output);
cloneProductCmd.ArrayBindCount = 1;
var reader = await cloneProductCmd.ExecuteNonQueryAsync();
newProductId = Convert.ToInt32(cloneProductCmd.Parameters["P_F_PRODUCT_ID"].Value.ToString());
}
我尝试将 更改ArraybindCount
为 2(2 个长度为 1 的数组),并尝试指定数组参数collectionType
具有PLSQLAssociativeArray
.
我总是收到一条异常消息:
无法将“System.Int32”类型的对象转换为“System.Array”类型
这个答案和这篇文章表明该ArrayBindCount
属性意味着客户端期望所有参数的数组。
我的问题是如何调用传入多个标量值和多个数组(所有数组具有相同数量的元素)以及输出参数(标量)的存储过程?