ORA-O6531:引用未初始化的集合错误

问题描述 投票:0回答:1

在我的PLSQL过程中,我试图传递一个名为FRAUD_IP_ARRAY的数组。当我编译该过程时,我没有得到任何错误。但是,当我尝试测试它时,我得到了错误"ORA-O6531:Reference to uninitialized collection error"。我的数组创建,过程和测试代码如下。

1)阵列创建

   CREATE OR REPLACE TYPE FRAUD_IP_ARRAY AS VARRAY(50) OF 
 VARCHAR2(11);

2)程序(SPEC&BODY)

    PROCEDURE PR_IP_ONAYLA  (P_SIRA_NO_ARR IN FRAUD_IP_ARRAY, 
                          P_GUNC_KULLA_KOD IN VARCHAR2); 


    PROCEDURE PR_IP_ONAYLA  (P_SIRA_NO_ARR IN FRAUD_IP_ARRAY, 
                          P_GUNC_KULLA_KOD IN VARCHAR2) IS 

    BEGIN 
    FOR i IN P_SIRA_NO_ARR.FIRST .. P_SIRA_NO_ARR.LAST 
    LOOP 
      UPDATE WEB_FRAUD_IP_LOG@T_INTERNET_TERS WIP 
      SET WIP.IP_ONAY_DURUMU='A', 
          WIP.GUNC_TAR = SYSDATE, 
          WIP.GUNC_KULLA_KOD = P_GUNC_KULLA_KOD 
          WHERE WIP.SIRA_NO = P_SIRA_NO_ARR(i); 
  END LOOP; 

  END  PR_IP_ONAYLA;    

3)测试代码

declare 
    -- Non-scalar parameters require additional processing 
    p_sira_no_arr fraud_ip_array; 
  BEGIN 
    p_sira_no_arr(1):='1'; 
    p_sira_no_arr(2):='2'; 
  --  p_sira_no_arr(1,1):=1; 
  --  p_sira_no_arr(1,2):=1; 

    -- Call the procedure 
      pck_web_fraud_manager.pr_ip_onayla(p_sira_no_arr => p_sira_no_arr, 
                                     p_gunc_kulla_kod => 
  :p_gunc_kulla_kod); 
  end; 

那么它的原因是什么?如何解决即将出现的问题呢?非常感谢 :)

database oracle stored-procedures plsql
1个回答
1
投票

您必须先初始化VARRAY才能使用它。例如这样:

DECLARE  
    p_sira_no_arr fraud_ip_array := fraud_ip_array('1', '2'); 
BEGIN

要么

DECLARE  
    p_sira_no_arr fraud_ip_array := fraud_ip_array(); 
BEGIN 
    p_sira_no_arr.extend(2);
    p_sira_no_arr(1):='1'; 
    p_sira_no_arr(2):='2'; 
end;

出于性能原因,您应该更喜欢FORALL声明:

FORALL i IN INDICES OF P_SIRA_NO_ARR
UPDATE WEB_FRAUD_IP_LOG@T_INTERNET_TERS WIP 
  SET WIP.IP_ONAY_DURUMU='A', 
      WIP.GUNC_TAR = SYSDATE, 
      WIP.GUNC_KULLA_KOD = P_GUNC_KULLA_KOD 
      WHERE WIP.SIRA_NO = P_SIRA_NO_ARR(i); 
© www.soinside.com 2019 - 2024. All rights reserved.