2017-10-11 38 views
1

我們有接受表值的Oracle存儲過程的參數最後一行覆蓋所有記錄的結果C#甲骨文

在包裝說明:

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 ,RED
RULE_ID = 154,ADDL_ID = 3,field_code = ABCD
RULE_ID = 154,ADDL_ID = 4,field_code = TRS
RULE_ID = 154,ADDL_ID = 5,field_code = EDR
RULE_ID = 155,ADDL_ID = 34 ,field_co DE = TRE
RULE_ID = 155,ADDL_ID = 5,field_code = EW
RULE_ID = 155,ADDL_ID = 34,field_code = RED

我在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(); 
    } 

數據表被填充的值::用於獲取值

C#代碼
155,34,RED
155,34,RED
155,34,RED
155 ,34,RED
155,34,RED
155,34,RED

最後一行被覆蓋的其它值。這裏有什麼問題?

+0

唔...只是一個普遍的問題:不'oraadap.Fill'返回一個數據集,而不是一個表?我想你應該使用類似'oraadap.Fill(DS)'然後'dt_getRules = DS [0]'? – Tyron78

+0

這也給出了相同的結果:( – RKM

回答

0

固定它,其實循環內的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;