最后一行覆盖结果c#oracle中的所有记录
我们有一个Oracle存储过程,它接受表值参数 在包说明中:最后一行覆盖结果c#oracle中的所有记录,c#,oracle,C#,Oracle,我们有一个Oracle存储过程,它接受表值参数 在包说明中: create or replace PACKAGE CRUD_FIELDS IS TYPE tableParam IS TABLE OF "owner".tablename.columnname%TYPE index by pls_integer; TYPE Param_Array is table OF VARCHAR2(400) index by binary_integer; PROCEDURE USP_G
create or replace
PACKAGE CRUD_FIELDS IS
TYPE tableParam IS TABLE OF "owner".tablename.columnname%TYPE index by pls_integer;
TYPE Param_Array is table OF VARCHAR2(400) index by binary_integer;
PROCEDURE USP_GET_BULK_FIELDS ( pi_table_param tableParam, po_out_param out sys_refcursor);
包体:
PROCEDURE USP_GET_BULK_FIELDS ( pi_table_param tableParam, po_out_param
out sys_refcursor ) AS
Fields_Arr Param_Array;
trRec recFieldType;
trRecTable FieldRecTable := FieldRecTable();
n integer := 1;
arrIdx integer := 1;
BEGIN
for rul in 1..pi_table_param.count loop
for fld in (select ruleid, addlid, code from "owner"."T_FIELDS" where ruleid = pi_table_param(rul))
loop
trRecTable.extend;
trRec := recFieldType(fld.rule_id, fld.ADDL_ID, fld.field_code);
trRecTable(n):=trRec;
Fields_Arr(arrIdx):=fld.rule_id || ',' || fld.ADDL_ID|| ',' ||fld.field_code;
arrIdx := arrIdx + 1;
n := n + 1;
DBMS_OUTPUT.put_line (fld.rule_id || ',' || fld.ADDL_ID|| ',' ||fld.field_code );
end loop;
end loop;
FOR i IN trRecTable.FIRST .. trRecTable.LAST
LOOP
open po_out_param for
SELECT trRecTable(i).rule_id|| ',' || trRecTable(i).ADDL_ID|| ',' ||trRecTable(i).field_code FROM Table (Cast(trRecTable As FieldRecTable));
END LOOP;
DECLARE
CURSOR c1 IS select * from Table (Cast(trRecTable As FieldRecTable));
begin
FOR item IN c1
LOOP
DBMS_OUTPUT.PUT_LINE
('rule_id = ' || item.rule_id || ', ADDL_ID = ' || item.ADDL_ID || ', field_code = ' || item.field_code);
END LOOP;
end;
END USP_GET_BULK_FIELDS;
在Sql developer中执行此操作时,我得到了一个正确的结果:
我是这样执行的
DECLARE
pi_table_param owner.CRUD_FIELDS.tableParam;
po_out_param sys_refcursor;
BEGIN
pi_table_param(1) := 154;
pi_table_param(2) := 153;
CRUD_FIELDS.USP_GET_BULK_FIELDS(
pi_table_param => pi_table_param,
po_out_param => po_out_param
);
END;
我得到的结果如下:154,3,ABCD
154,4,TRS
154,5,EDR
155,34,TRE
155,5,EW
155,34,红色
规则id=154,地址id=3,字段代码=ABCD
规则id=154,地址id=4,字段代码=TRS
规则id=154,地址id=5,字段代码=EDR
规则id=155,地址id=34,字段代码=TRE
规则id=155,地址id=5,字段代码=EW
规则id=155,地址id=34,字段代码=红色 我已经用C语言编写了一个程序来获取值,但是我在那里得到了一个奇怪的输出 C#获取值的代码:
public void GetFieldsfoRules()
{
string connSt = ConfigurationManager.ConnectionStrings["QuickStarts Instance"].ConnectionString;
Oracle.DataAccess.Client.OracleConnection oraconnection = new Oracle.DataAccess.Client.OracleConnection(connSt);
oraconnection.Open();
Oracle.DataAccess.Client.OracleCommand cmd = oraconnection.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "CRUD_FIELDS.USP_GET_BULK_FIELDS";
Oracle.DataAccess.Client.OracleParameter oraparam = new Oracle.DataAccess.Client.OracleParameter();
Oracle.DataAccess.Client.OracleParameter oraParamOut = new Oracle.DataAccess.Client.OracleParameter();
oraparam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
oraparam.Size = 35;
oraparam.ParameterName = "pi_table_param";
oraparam.OracleDbType = OracleDbType.Int32;
oraparam.Value = new int[2] { 154, 155 };
oraparam.Direction = ParameterDirection.Input;
oraParamOut.ParameterName = "po_out_param";
oraParamOut.OracleDbType = OracleDbType.RefCursor;
oraParamOut.Value = 0;
oraParamOut.Direction = ParameterDirection.Output;
cmd.Parameters.Add(oraparam);
cmd.Parameters.Add(oraParamOut);
Oracle.DataAccess.Client.OracleDataAdapter oraadap = new Oracle.DataAccess.Client.OracleDataAdapter(cmd);
DataTable dt_getRules = new DataTable();
oraadap.Fill(dt_getRules);
dt_getRules.Load(dr);
cmd.Dispose();
oraconnection.Close();
}
数据表中充满了值:155,34,红色
155,34,红色
155,34,红色
155,34,红色
155,34,红色
155,34,红色
最后一行正在覆盖其他值。这里出了什么问题?修复了它,实际上循环中的Select语句正在创建问题,因此修改了SP
open po_out_paramfor select * from Table (Cast(trRecTable As FieldRecTable));
注释掉该部分并添加了上述行:
FOR i IN trRecTable.FIRST .. trRecTable.LAST
LOOP
open po_out_param for
SELECT trRecTable(i).rule_id|| ',' || trRecTable(i).ADDL_ID|| ',' ||trRecTable(i).field_code FROM Table (Cast(trRecTable As FieldRecTable));
END LOOP;
修复了它,实际上循环中的Select语句正在创建问题,因此修改了SP
open po_out_paramfor select * from Table (Cast(trRecTable As FieldRecTable));
注释掉该部分并添加了上述行:
FOR i IN trRecTable.FIRST .. trRecTable.LAST
LOOP
open po_out_param for
SELECT trRecTable(i).rule_id|| ',' || trRecTable(i).ADDL_ID|| ',' ||trRecTable(i).field_code FROM Table (Cast(trRecTable As FieldRecTable));
END LOOP;
陛下只是一个一般性问题:
oraadap.Fill
是否返回数据集而不是表?我想你应该使用类似于oraadap.Fill(ds)
,然后使用dt_getRules=ds[0]
?这也会给出同样的结果:(嗯……只是一个一般性的问题:oraadap.Fill
不是返回一个数据集而不是一个表吗?我想你应该使用类似于oraadap.Fill(ds)
,然后使用dt_getRules=ds[0]
?这也给出了相同的结果:(