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

Posted

技术标签:

【中文标题】ORA-O6531: 引用未初始化的集合错误【英文标题】:ORA-O6531:Reference to uninitialized collection error 【发布时间】:2017-12-22 13:21:46 【问题描述】:

在我的 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; 

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

【问题讨论】:

【参考方案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); 

【讨论】:

是的,我意识到 VARRAY 也必须在测试部分声明。谢谢你的观点。

以上是关于ORA-O6531: 引用未初始化的集合错误的主要内容,如果未能解决你的问题,请参考以下文章

获取对关联数组的未初始化集合的错误引用

为啥我会收到 ORA-06531:对未初始化集合的引用?

错误:对象引用未初始化

pl/sql 对象类型“ORA-06530:引用未初始化的复合”错误

将“m_Mutex”声明为引用但未初始化错误

ORA-06530: "引用未初始化的复合" 即使已初始化