2016-11-04 60 views
0

我正在使用oracle,並從C#中獲得關聯數組。在我的PL/SQL包的代碼是:關聯數組循環和調用存儲過程PL/SQL

PROCEDURE SG_DATA_ARRAY (PROVA IN T_ASSOCIATIVE_ARRAY, P_RESULT OUT VARCHAR2) AS 

    BEGIN 

    SAVEPOINT SP1; 

    FOR indx IN 1..PROVA.count 
    LOOP 
     TA_DATA.TA_TABLE_INS (PROVA(indx), INDX); 
    END LOOP; 

    P_RESULT:='SUCCESS INS'; 

    EXCEPTION 
     WHEN OTHERS THEN 
     ROLLBACK TO SAVEPOINT SP1; 

      P_RESULT:='ERROR INS'; 

    END SG_DATA_ARRAY; 

我做關聯數組的循環,然後我打電話給我的存儲過程TA_TABLE_INS從包裝TA_DATA。在我調用的程序中,我將關聯數組中的數據保存到多個變量中:

PROCEDURE TA_TABLE_INS (PROVA IN T_ASSOCIATIVE_ARRAY, P_DESCR IN NUMBER) AS 

     P_ID_TMS NUMBER; 

     D1 NVARCHAR2 (20); 
     DESCRIPTION NVARCHAR2 (255); 
     D3 NVARCHAR2(20); 
     D4 NVARCHAR2 (255); 
     D5 NVARCHAR2(1000); 
     D6_REV_N NUMBER; 
     D7_REV_N NUMBER; 
     D8 NVARCHAR2(20); 
     D9 NVARCHAR2(1000); 
     D10 NUMBER; 

     INSERT INTO TA_TABLE1 
     VALUES (D1, D2, D3, D4, D5, D6, D7, D8, D9, D10); 

這是保存數據的正確方法嗎?

+1

您的代碼似乎沒有什麼意義。正如所寫,它不應該編譯。您對'TA_TABLE_INS'的調用會傳遞該集合的一個元素和一個索引。該過程被定義爲將't_associative_array'作爲第一個參數,而不是該集合的一個元素。你的過程似乎沒有對輸入參數做任何事情,它只是向表中插入10個NULL值。您尚未發佈收藏的定義。如果它是一個關聯數組,則你的代碼假定它是由一個整數和密集索引的。這是可能的,但在關聯數組中不太可能。 –

+0

TYPE T_ASSOCIATIVE_ARRAY是VARCHAR(4000)的索引PLS_INTEGER的索引。代碼編譯,但我做錯了我知道。我不想undestrand如何將集合的元素插入到TA_TABLE1中。我該怎麼做? –

+0

如果這是定義,則代碼無法成功編譯。你正在向'TA_TABLE_INS'過程傳遞'varchar(4000)'。該過程需要一個't_associative_array'。這不會編譯。您的收藏只有一個字符串。你的表格有10列,有許多不同的數據類型。你想如何把一個字符串插入一個10列的表格中? –

回答

0

您的第二個過程TA_TABLE_INS不是必需的。您可以使用批量插入而不是將您的關聯數組行傳遞給過程。

希望,下面的代碼將有助於

PROCEDURE SG_DATA_ARRAY (PROVA IN T_ASSOCIATIVE_ARRAY, P_RESULT OUT VARCHAR2) AS 
BEGIN 

    SAVEPOINT SP1; 

    INSERT INTO TA_TABLE1 
    SELECT SEQUENCE.NETXVAL, --You may use a seq number instead of your prova associative array order 
     tmp.d1, tmp.d2, tmp.d3, 
    FROM TABLE(CAST(PROVA AS T_ASSOCIATIVE_ARRAY) tmp; -- You can directly cast an associative array into a table  


    P_RESULT:='SUCCESS INS'; 

    EXCEPTION 
    WHEN OTHERS THEN 
     ROLLBACK TO SAVEPOINT SP1; 

     P_RESULT:='ERROR INS'; 

END SG_DATA_ARRAY;