sql >> データベース >  >> RDS >> Oracle

PL / SQLのnull連想配列のこのチェックが失敗するのはなぜですか?

    これにより、「Null連想配列」が出力されるはずです。 この仮定は、連想配列では間違っています。それらは宣言されたときに存在しますが、空です。他のタイプのPL/SQLコレクションの場合は正しいでしょう:

    比較:

    SQL> declare
      2      type varchar2_100_aa is table of varchar2(100) index by binary_integer;
      3      test varchar2_100_aa;
      4  begin
      5      test(1) := 'Hello';
      6      dbms_output.put_line(test(1));
      7  end;
      8  /
    Hello
    
    PL/SQL procedure successfully completed.
    
    SQL> declare
      2      type varchar2_100_va is varray(100) of varchar2(100);
      3      test varchar2_100_va;
      4  begin
      5      test(1) := 'Hello';
      6      dbms_output.put_line(test(1));
      7  end;
      8  /
    declare
    *
    ERROR at line 1:
    ORA-06531: Reference to uninitialized collection
    ORA-06512: at line 5
    

    変数配列が正しく実行されました:

    SQL> declare
      2      type varchar2_100_va is varray(10) of varchar2(100);
      3      test varchar2_100_va;
      4  begin
      5      test := varchar2_100_va(); -- not needed on associative array
      6      test.extend; -- not needed on associative array
      7      test(1) := 'Hello';
      8      dbms_output.put_line(test(1));
      9  end;
     10  /
    Hello
    
    PL/SQL procedure successfully completed.
    

    連想配列が空であるためfirst およびlast がnullであるため、2番目の例ではORA-06502: PL/SQL: Numeric or value errorが発生します。 :

    SQL> declare
      2      type varchar2_100_aa is table of varchar2(100) index by binary_integer;
      3      test varchar2_100_aa;
      4  begin
      5      dbms_output.put_line(test.count);
      6      dbms_output.put_line(coalesce(to_char(test.first), 'NULL'));
      7      dbms_output.put_line(coalesce(to_char(test.last), 'NULL'));
      8      test(1) := 'Hello';
      9      dbms_output.new_line;
     10      dbms_output.put_line(test.count);
     11      dbms_output.put_line(coalesce(to_char(test.first), 'NULL'));
     12      dbms_output.put_line(coalesce(to_char(test.last), 'NULL'));
     13  end;
     14  /
    0
    NULL
    NULL
    
    1
    1
    1
    
    PL/SQL procedure successfully completed.
    

    編集 また、連想配列はスパースである可能性があることに注意してください。 first間の数値をループする およびlast スパースなコレクションに対しては例外が発生します。代わりにfirstを使用してください および next そのように:(Last およびprev 反対方向にループします。)

    SQL> declare
      2      type varchar2_100_aa is table of varchar2(100) index by binary_integer;
      3      test varchar2_100_aa;
      4      i binary_integer;
      5  begin
      6      test(1) := 'Hello';
      7      test(100) := 'Good bye';
      8      dbms_output.put_line(test.count);
      9      dbms_output.put_line(coalesce(to_char(test.first), 'NULL'));
     10      dbms_output.put_line(coalesce(to_char(test.last), 'NULL'));
     11      dbms_output.new_line;
     12  --
     13      i := test.first;
     14      while (i is not null) loop
     15          dbms_output.put_line(to_char(i, '999')  || ' - ' || test(i));
     16          i := test.next(i);
     17      end loop;
     18  end;
     19  /
    2
    1
    100
    
       1 - Hello
     100 - Good bye
    
    PL/SQL procedure successfully completed.
    


    1. mysqldumpはテーブル'table1'のダンプデータをスキップして失敗します。フィールドがありません

    2. リレーション内の別の属性の値に基づいて複数のタプルの属性を比較するSQLクエリ

    3. マルチパート識別子をバインドできませんでした

    4. Webサイトのインストーラーを作成する方法。 PHPmysql