0

请问我可以帮助您将值插入表中。该表称为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 Error: ORA-00933: SQL command not properly ended

第二插入语句的上方产生以下错误:

SQL Error: ORA-00936: missing expression

请问我可以帮助您成功inser t值到LineItemList_ntab嵌套表中?

UPDATE

我有这样的代码来插入数据:

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 Error: ORA-22979: cannot INSERT object view REF or user-defined REF 22979. 00000 - "cannot INSERT object view REF or user-defined REF" *Cause: Attempt to insert an object view REF or user-defined REF in a REF column created to store system generated REF values" *Action: Make sure the REF to be inserted is not from an object view or from a user-defined REF column

我敢肯定,这个错误是因为我可能不正确地创建表,下面是我的表为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 
/

UPDATE2

此代码成功地将信息添加到表:

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/ 

我相信错误有事情做与对象标识符对上述表的主键。

UPDATE3

谢谢你的代码。如何将多个值插入到嵌套表中。

你对一个项目的代码行是:

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

怎么样,如果我想补充两个项目,这两个StockNo 1004,1005?它是这样的:

(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) 

UPDATE4

如果,我添加三个项目嵌套表,做了“FROM DUAL”语句逗留“FROM DUAL”,还是将其更改为反映三个项目的东西?此外,没有了“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 
) 

回答

1

您应该使用类型构造在选择子查询,填补了嵌套表中的场合:

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 WHERE StockNo = 1004), 
    NULL 
FROM Customer_objtab C 
WHERE C.CustNo = 1; 

UPDATE:

我不确定你是否正确地完成了这项任务(我的意思是把对象类型当作表格存储在我的脑海中是没用的,我会使用可管理的普通表格而不是这样的结构)

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

更新2:

如果你急于插入多个值到嵌套表,使用枚举(如果该值是通过手写)或子查询:

(
    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 
    ) 
    FROM DUAL 
) 
+0

谢谢你的代码。你可以看看我的OP更新。 – user2381256

+0

查看我更新的帖子,我强烈建议你摆脱所有这些对象,并使用普通表格。并且仅从前端级别的数据创建对象,而不是在数据库中创建对象,这不是目的。 – ZZa

+0

您的代码生成此错误:SQL错误:ORA-00904:“STCKITEM”:无效的标识符。我的更新修复了这个问题,但引用错误发生。另外,我需要使用从对象创建的表格。这是在我的简报中这样做。 – user2381256