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

コレクションの操作

    少なくとも、2番目のケースではテーブル定義が失われました。このステートメント:

    create or replace TYPE tbl_list2 IS OBJECT (l_owner  VARCHAR2(64),l_name  VARCHAR2(64));
    

    テーブルではなく、オブジェクト(またはレコード)タイプのみを宣言します。

    したがって、2つのステップでそれを行う必要があります:

    create or replace TYPE tbl_list_rec IS OBJECT (l_owner  VARCHAR2(64),l_name  VARCHAR2(64));
    /
    
    create or replace TYPE tbl_list2 as table of tbl_list_rec;
    /
    

    その後、スクリプトで構文を修正する必要があります:

    declare
      l_object tbl_list2;
      i        number;
    begin
      -- for list initialization it must be filled with constructed objects
      l_object := tbl_list2( tbl_list_rec('','') );
    
      for i in 1..100000 loop          
    
        -- 1. select values to variable
        -- 2. Fix constructor for list 
        select 
          l_object MULTISET UNION DISTINCT tbl_list2(tbl_list_rec('myOwner','MyTable'))
        into 
          l_object 
        from 
          dual;
    
        end loop;
    
        for i in l_object.first ..  l_object.last loop
          -- output separate fields, there are now default conversion from 
          -- user-defined objects to varchar2.
          dbms_output.put_line(l_object(i).l_owner || ',' || l_object(i).l_name);
        end loop;  
    
    end;
    /
    

    更新

    コンテキストスイッチの数が多いため、上記のソリューションは比較的遅くなります。ただし、複雑なオブジェクトタイプインスタンスの比較は、追加の作業なしにPL / SQLで直接実行することはできません。
    オブジェクトインスタンスが同じか異なるかをOracleに認識させるには、オブジェクト・タイプのマッピングまたは順序付け方法 。どちらのタイプの方法も許可されていないため、適切な方法を選択する必要があります。 MAPメソッドはより高速に実行され、この場合は注文する必要がないので、それを実行してください:

    create or replace TYPE tbl_list_rec2 AS OBJECT (
      l_owner  VARCHAR2(64),
      l_name  VARCHAR2(64),
      map member function get_key return varchar2
    );
    /
    

    実装:

    create or replace TYPE BODY tbl_list_rec2 AS 
    
      map member function get_key return varchar2
      is
      begin
        return l_owner||chr(1)||l_name;
      end;
    
    end;
    /
    

    その後、単純なvarchar2のようなPL/SQLコードでオブジェクトが等しいかどうかをテストすることができます。 質問の最初の例:

    declare
      l_object tbl_list2a;
      i        number; 
    begin
      l_object := tbl_list2a( tbl_list_rec2('','') );
    
      for i in 1..100000 loop          
        l_object := l_object MULTISET UNION DISTINCT tbl_list2a(tbl_list_rec2('myOwner','MyTable'));
      end loop;
    
      for i in l_object.first..  l_object.last loop
        dbms_output.put_line(l_object(i).l_owner || ',' || l_object(i).l_name);
      end loop;  
    
    end;
    /
    



    1. MySQL列を解析してデータを抽出する

    2. エラーで失敗するクエリの更新:1175

    3. OracleシンドライバとOCIドライバ。長所と短所?

    4. Pythonmysqlの動的な列の追加と新しい列の値の更新