テーブルに値を挿入する方法を教えてください。テーブルは 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
)