我有下表,基于它的两种类型,以及从该表中读取的函数:
CREATE TABLE myTable (
ID RAW(16) NULL,
NAME NVARCHAR2(200) NULL,
ENTITYID RAW(16) NOT NULL
);
CREATE TYPE myRowType AS OBJECT (
NAME NVARCHAR2(200),
ENTITYID RAW(16)
);
CREATE TYPE myTableType IS TABLE OF myRowType;
CREATE FUNCTION myFunction(...) RETURN myTableType ...
如您所见,类型myRowType
类似于myTable
,但不完全一样。
我的目标是myTable
根据myFunction
.
天真的方法是只写:
INSERT INTO myTable(ID, NAME, ENTITYID)
SELECT sys_guid(), NAME, ENTITYID
FROM TABLE(myFunction(...));
但是由于从myFunction
读取myTable
,这会导致以下错误:
ORA-04091: table myTable is mutating, trigger/function may not see it
所以我必须将myFunction
调用从插入语句中分离出来。我试过这样:
DECLARE
tbl myTableType;
BEGIN
SELECT myRowType(x.NAME, x.ENTITYID)
BULK COLLECT INTO tbl
FROM TABLE(myFunction(...)) x;
INSERT INTO myTable
(ID, NAME, ENTITYID)
SELECT sys_guid(), x.NAME, x.ENTITYID
FROM tbl x;
END;
但是在这里,Oracle 似乎并不理解该FROM tbl
子句。它显示错误
ORA-00942: table or view does not exist
如何将行插入tbl
到myTable
?