2

以下のPL/SQLコードが何をしているのか、誰かが明確にすることができますか? assets_type が base_Asset のテーブルのように見えます。それはテーブルオブテーブルになりますか?

データを入力するときにこれを視覚化するのに苦労しています:

assets(v_ref_key)(dbfields(i).field) := rtrim(replace(strbuf_long2,'''',''''''));

これは二次元配列に似ていますか?これは、資産 (一時) テーブルのフィールド列に v_ref_key のインデックスを設定することを意味しますか?

 PROCEDURE LOAD 
 IS

 TYPE dbfields_rec IS RECORD (field         dbfields.field%TYPE,
                         article_title dbfields.title%TYPE,  
                         image_title   dbfields.title%TYPE); 
 TYPE dbfields_type IS TABLE OF dbfields_rec INDEX BY BINARY_INTEGER;
 TYPE base_Asset IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(32);
 TYPE assets_type IS TABLE OF asset_type INDEX BY VARCHAR2(4000);
 dbfields                       dbfields_type;
 assets                  assets_type;
 v_ref_key               assets.ref_key%TYPE;


 -- CLIPPED Populate dbfields array code 
 -- It correctly populates

  FOR i IN 1..dbfields.COUNT LOOP
    BEGIN
        sqlbuf := '(select rtrim(ufld3), ' || dbfields(i).field ||
                  ' as col_label from assetstable ' ||
                        '  where  rtrim(ufld3) = ' || '''' || in_id || '''' || ' )';
       OPEN assets_cur FOR  
            sqlbuf;
       LOOP
          FETCH assets_cur INTO v_ref_key, strbuf_long2; 
          EXIT WHEN assets_cur%NOTFOUND;                 

          IF (trim(strbuf_long2) is not null and dbfields(i).field is not null) THEN
             assets(v_ref_key) (dbfields(i).field)
               := rtrim(replace(strbuf_long2,'''',''''''));
          END IF;
       END LOOP;
       close assets_cur;
    END;
  END LOOP;
END LOAD;
4

1 に答える 1

4

PL / SQLは実際には1次元配列のみを提供しますが、多次元配列のように機能する配列を作成する場合は、配列の各要素を別の配列にすることができます。

これは、説明するためにひどく考案された例です。

DECLARE

  TYPE rows_type IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(4000);

  TYPE spreadsheet_type IS TABLE OF row_type INDEX BY VARCHAR2(4000);

  spreadsheet spreadsheet_type;

BEGIN

  spreadsheet ('row 1') ('column A') := 'XYZ';

END;

1つ目('row 1')は、特定の「行」のすべての列を保持するspreadsheet_type配列へのインデックスです。2つ目('column A')は、rows_type配列へのインデックスです。

ただし、この実装の「多次元」の側面は完全ではありません。必要に応じて行全体を操作できます。例:

my_row rows_type;
...
my_row := spreadsheet ('row 1');

特定の列を選択することはできません。特定のインデックスの行にあるすべての要素のセットをrows_typeに参照する方法はありません。別の型を作成して最初の配列をループするようなことをする必要があります。

于 2013-03-20T03:28:20.667 に答える