1

以下のタイプを作成しました。

CREATE OR REPLACE TYPE OBJ_TYPE AS OBJECT
  ( FLAG      DATE
  , NUMB      NUMBER(2,0)
  , VARC      VARCHAR2(40 BYTE));
/
CREATE OR REPLACE TYPE TBL_OBJ_TYPE AS TABLE OF OBJ_TYPE;
/

データセットをテーブルに挿入したいだけです。

DECLARE
  DATA_SET TBL_OBJ_TYPE := TBL_OBJ_TYPE();
BEGIN
  FOR REC IN (SELECT * FROM TBL_01)
  LOOP
    DATA_SET.EXTEND;
    DATA_SET(DATA_SET.COUNT) :=
    OBJ_TYPE( 1
            , REC.TBL_01_COL1
            , REC.TBL_01_COL2);
  END LOOP;

  FORALL REC IN DATA_SET.FIRST..DATA_SET.LAST
    INSERT INTO TBL_02 
    VALUES ( DATA_SET(REC).FLAG --listed column
           , DATA_SET(REC).NUMB --listed column
           , DATA_SET(REC).VARC); --listed column
END;

これは問題なく動作しますが、「VALUES」句を変更して、ソース オブジェクトの各属性に名前を付けないようにすることはできますか? 私はこのようなものが欲しいです:

VALUES DATA_SET(REC)

どんな助けでも大歓迎です。

4

3 に答える 3

1

オブジェクト型定義を使用してテーブルを作成できます。

SQL> create table TBL_02 of OBJ_TYPE
  2  /

Table created.

SQL> 

これを行う正当な理由はあまりありませんが、プログラムで型を操作できます。

テストデータから始まる小さな例を次に示します

SQL> select * from tbl_01
  2  /

     COL_1 COL_2
---------- ----------------------------------------
        23 ABC
        42 XYZ

SQL> DECLARE
  2     DATA_SET TBL_OBJ_TYPE := TBL_OBJ_TYPE();
  3  BEGIN
  4     FOR REC IN (SELECT * FROM TBL_01)
  5     LOOP
  6      DATA_SET.EXTEND;
  7      DATA_SET(DATA_SET.COUNT) :=
  8      OBJ_TYPE( sysdate
  9              , REC.COL_1
 10               , REC.COL_2);
 11     END LOOP;
 12
 13      FORALL REC IN DATA_SET.FIRST..DATA_SET.LAST
 14        INSERT INTO TBL_02 
 15        VALUES DATA_SET(REC)
 16        ; 
 17  END;
 18  /    

PL/SQL procedure successfully completed.

SQL> select * from tbl_02;

FLAG            NUMB VARC
--------- ---------- ----------------------------------------
20-MAR-16         23 ABC
20-MAR-16         42 XYZ

SQL> 

あるいは、ターゲット表に対して定義された PL/SQL オブジェクトを使用できます。これは、TBL_02 に通常のヒープ テーブルを使用します。

DECLARE
  type tgt_nt is table of TBL_02%rowtype;
  data_set tgt_nt;
BEGIN
  SELECT sysdate, COL_1, COL_2 
  bulk collect into data_set
  FROM TBL_01;

  FORALL REC IN DATA_SET.FIRST..DATA_SET.LAST
    INSERT INTO TBL_02 
    VALUES DATA_SET(REC)
    ; 
END;
/
于 2016-03-20T14:42:04.730 に答える
0

テーブル内の列がTBL_01オブジェクト宣言内の名前と同じ名前であると仮定します。

DECLARE
  DATA_SET TBL_OBJ_TYPE := TBL_OBJ_TYPE();
BEGIN
    SELECT OBJ_TYPE( sysdate, numb, varc )  BULK COLLECT INTO  DATA_SET
    FROM TBL_01;

    INSERT INTO TBL_02( flag, numb, varc )
    SELECT * FROM Table( DATA_SET );
END;
/

TBL_01X、Y、Z など、列の名前が異なる場合は、それぞれ次の行を変更します。
SELECT OBJ_TYPE( X, Y, Z ) BULK COLLECT ...


1注:ここで最初のフィールドに代入することはできません。

OBJ_TYPE( 1
        , REC.TBL_01_COL1
        , REC.TBL_01_COL2);

最初のフィールドがオブジェクト宣言FLAGの型として宣言されているためです。私の例で は に置き換えました。date
1sysdate

于 2016-03-20T10:51:19.640 に答える