1

テーブルに値を挿入する方法を教えてください。テーブルは PurchaseOrder_objtab と呼ばれます。テーブルのタイプは次のとおりです。

CREATE TYPE PurchaseOrder_objtyp AUTHID CURRENT_USER AS OBJECT
(
  PONo NUMBER,
  CUST_ref REF Customer_objtyp,
  OrderDate DATE,
  ShipDate DATE,
  LineItemList_ntab LineItemList_ntabtyp,
  ShipToAddr_obj Address_objtyp
)
/

LineItemList_ntab は、ネストされたテーブルです。

LineItemList_ntabtyp の作成コードは次のとおりです。

CREATE TYPE LineItem_objtyp AS OBJECT (
  LineItemNo NUMBER,
  Stock_ref REF StockItem_objtyp,
  Quantity NUMBER,
  Discount NUMBER
)
/

CREATE TYPE LineItemList_ntabtyp AS TABLE of LineItem_objtyp
/

動作する挿入コードを次に示します。

INSERT INTO PurchaseOrder_objtab
SELECT 1008, REF(C),
SYSDATE, '12-MAY-1999',
LineItemList_ntabtyp(),
NULL
FROM Customer_objtab C 
WHERE C.CustNo = 1;

上記のコードでは、LineItemList_ntab は空の LineItemList_ntabtyp です。INSERT INTO コードで空にするのではなく、このネストされたテーブルに値を追加したいと考えています。

値を挿入しようとしたコードの一部を次に示します。

INSERT INTO PurchaseOrder_objtab
SELECT 1008, REF(C),
SYSDATE, '12-MAY-1999',
LineItemList_ntabtyp(1, REF(StckItem), 10, 1) FROM Stock_objtab StckItem WHERE StckItem.StockNo = 1004,
NULL
FROM Customer_objtab C 
WHERE C.CustNo = 1;

INSERT INTO PurchaseOrder_objtab
SELECT 1008, REF(C),
SYSDATE, '12-MAY-1999',
INSERT INTO LineItemList_ntab SELECT 1, REF(StckItem),10,1 FROM Stock_objtab StckItem WHERE StckItem.StockNo = 1004, 
NULL
FROM Customer_objtab C 
WHERE C.CustNo = 1;

上記の最初の挿入ステートメントは、次のエラーを生成します。

SQL エラー: ORA-00933: SQL コマンドが正しく終了していません

上記の 2 番目の挿入ステートメントでは、次のエラーが発生します。

SQL エラー: ORA-00936: 式がありません

LineItemList_ntab ネストされたテーブルに値を正常に挿入するための助けをお願いできますか?

アップデート

データを挿入するための次のコードがあります。

INSERT INTO PurchaseOrder_objtab
SELECT 
1008, 
REF(C),
SYSDATE, 
'12-MAY-1999',
(SELECT LineItemList_ntabtyp(LineItem_objtyp(1, REF(StckItem), 10, 1)) FROM Stock_objtab StckItem WHERE StckItem.StockNo = 1004),
NULL
FROM Customer_objtab C 
WHERE C.CustNo = 1;

次のエラーが表示されます。

SQL エラー: ORA-22979: オブジェクト ビュー REF またはユーザー定義 REF を INSERT できません 22979. 00000 - "オブジェクト ビュー REF またはユーザー定義 REF を INSERT できません" *原因: オブジェクト ビュー REF またはユーザー定義 REF をシステム生成のREF値を格納するために作成されたREF列" *処置: 挿入するREFがオブジェクト・ビューまたはユーザー定義のREF列からのものでないことを確認してください

このエラーは、テーブルを間違って作成した可能性があるためだと確信しています。 PurchaseOrder_objtab のテーブル作成コードは次のとおりです。

CREATE TABLE PurchaseOrder_objtab OF PurchaseOrder_objtyp(
PRIMARY KEY (PONo),
FOREIGN KEY (Cust_ref) REFERENCES Customer_objtab)
OBJECT ID PRIMARY KEY

  NESTED TABLE LineItemList_ntab STORE AS PoLine_ntab(
(PRIMARY KEY(NESTED_TABLE_ID, LineItemNo))
ORGANIZATION INDEX COMPRESS)
RETURN AS LOCATOR
/

ネストされたテーブルを作成するコードは次のとおりです。

CREATE TYPE LineItemList_ntabtyp AS TABLE of LineItem_objtyp
/

更新2

このコードは、テーブルに情報を正常に追加します。

INSERT INTO PurchaseOrder_objtab
SELECT 1009, REF(C),
SYSDATE, '10-MAY-1999',
LineItemList_ntabtyp(),
NULL
FROM Customer_objtab C 
WHERE C.CustNo = 1;

したがって、エラーは LineItemList_ntabtyp と関係があります。

テーブル作成コードは次のとおりです。

CREATE TABLE PurchaseOrder_objtab OF PurchaseOrder_objtyp(
PRIMARY KEY (PONo),
FOREIGN KEY (Cust_ref) REFERENCES Customer_objtab)
OBJECT ID PRIMARY KEY

NESTED TABLE LineItemList_ntab STORE AS PoLine_ntab((PRIMARY KEY(NESTED_TABLE_ID,LineItemNo)) ORGANIZATION INDEX COMPRESS) RETURN AS LOCATOR/

エラーは、上記のテーブルの OBJECT IDENTIFIER IS PRIMARY KEY と関係があると確信しています。

更新3

コードをありがとう。ネストされたテーブルに複数の値を挿入するのはどうですか。

1 つのアイテムのコード行は次のとおりです。

(SELECT LineItemList_ntabtyp(LineItem_objtyp(1, REF(StckItem), 10, 1)) FROM Stock_objtab WHERE StockNo = 1004),
NULL)

StockNo 1004と1005の2点を追加したいのですが?それは次のようなものですか:

(SELECT LineItemList_ntabtyp(LineItem_objtyp(1, REF(StckItem), 10, 1)) FROM Stock_objtab WHERE StockNo = 1004) AND (SELECT LineItemList_ntabtyp(LineItem_objtyp(2, REF(StckItem), 10, 1)) FROM Stock_objtab WHERE StockNo = 1005),
NULL)

更新4

入れ子になったテーブルに 3 つの項目を追加した場合、"FROM DUAL" ステートメントは "FROM DUAL" のままですか、それとも 3 つの項目を反映したものに変更されますか? また、「UNION ALL」ステートメントは次のように表示されますか。

(
SELECT LineItemList_ntabtyp(
    SELECT LineItem_objtyp(1, REF(StckItem), 10, 1) FROM Stock_objtab WHERE StockNo = 1004         
    UNION ALL 
    SELECT LineItem_objtyp(2, REF(StckItem), 10, 1) FROM Stock_objtab WHERE StockNo = 1005 
    UNION ALL 
    SELECT LineItem_objtyp(3, REF(StckItem), 10, 1) FROM Stock_objtab WHERE StockNo = 1006
)
FROM DUAL
)
4

1 に答える 1