C# 调用Oracle存储过程,使参数输入从C变为数组#
我在Oracle中有一个存储过程,它接收类型为C# 调用Oracle存储过程,使参数输入从C变为数组#,c#,oracle,stored-procedures,varray,paramarray,C#,Oracle,Stored Procedures,Varray,Paramarray,我在Oracle中有一个存储过程,它接收类型为varchar2variang array的输入参数。这个过程可以工作,如果从SQL调用它,我需要的是从C#调用 我的剧本是这样的: CREATE OR REPLACE PROCEDURE INTEGRATOR.PRC_TEST_PARAM_ARRAY (p_nros_moviles integrator.NROMOVIL_ARRAY) IS BEGIN FOR i IN 1..p_nros_moviles.count LOOP IF
varchar2
variang array的输入参数。这个过程可以工作,如果从SQL调用它,我需要的是从C#调用
我的剧本是这样的:
CREATE OR REPLACE PROCEDURE INTEGRATOR.PRC_TEST_PARAM_ARRAY (p_nros_moviles integrator.NROMOVIL_ARRAY) IS
BEGIN
FOR i IN 1..p_nros_moviles.count LOOP
IF p_nros_moviles(i) IS NOT NULL THEN
INSERT INTO INTEGRATOR.TEST_PARAM_ARRAY VALUES (p_nros_moviles(i));
END IF;
END LOOP;
END;
/
我的用户类型:
CREATE OR REPLACE TYPE INTEGRATOR.NROMOVIL_ARRAY AS
VARYING ARRAY(100) OF VARCHAR2(15);
/
我的PLSQL调用
DECLARE
v_array integrator.NROMOVIL_ARRAY;
BEGIN
v_array := integrator.NROMOVIL_ARRAY('9999999', '66666666');
integrator.prc_test_param_array(v_array);
END;
我试着从c#
有人可以指导我,我需要改变才能让它发挥作用耐心等待。。这需要很长时间。。这是我的经验我不确定,但我认为System.Data.OracleClient并不真正支持用户定义的数组 我将尝试编写一个帮助存储函数,它以逗号分隔的字符串(这些将是varray类型的值)为例,并使用WHILE循环和SUBSTR将其拆分为值。然后在每次迭代中,它使用EXTEND(1)将实际的VARCHAR2添加到临时integrator.NROMOVIL_数组类型变量中,以替换新值
最后,该函数返回临时integrator.NROMOVIL_数组,该值可在存储过程中使用 实际上,Microsoft驱动程序不支持param array,但我使用的是ODP,使用的是Oracle.DataAccess.Client;使用Oracle.DataAccess.Types;现在我已经解决了这个问题,调用了一个纯文本SQL命令,但我会按照CommandType.StoredProcedure执行
try
{
using (OracleConnection connection = new OracleConnection())
{
connection.ConnectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST=10.10.10.10)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)" +
"(SID=PORTANODE)));User Id=user;Password=*****;";
using (OracleCommand cmd = new OracleCommand("INTEGRATOR.PRC_TEST_PARAM_ARRAY", connection))
{
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter p = new OracleParameter();
p.ParameterName = "P_NROS_MOVILES";
p.OracleDbType = OracleDbType.Array;
p.Direction = ParameterDirection.Input;
p.UdtTypeName = "INTEGRATOR.NROMOVIL_ARRAY";
//p.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p.Value = new string[] { "XXXX", "YYYY" };
cmd.Parameters.Add(p);
connection.Open();
cmd.ExecuteNonQuery();
MessageBox.Show("Ejecutado");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}