Oracle 将表变量的内容插入表中
我有下表,基于下表的两种类型,以及从下表读取的函数:Oracle 将表变量的内容插入表中,oracle,oracle11gr2,Oracle,Oracle11gr2,我有下表,基于下表的两种类型,以及从下表读取的函数: 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
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
,但并不完全相同
我的目标是根据myFunction
的结果将行插入myTable
天真的做法是只写:
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
因此,我必须从insert语句中拆分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似乎并不理解tbl的子句。它显示了错误
ORA-00942: table or view does not exist
< > >强> >如何将“<代码> TBL < /代码>中的行插入<代码> MyTabe< /Cord>?<强> >/P>< P>,因为不能使用本地定义的嵌套表作为<代码>表< /C>函数的参数,您可能会考虑使用<代码> FALLU/<代码>批量插入吗?我看到您正在使用Oracle 11g,因此您将能够访问myRowType
的字段。然后将PL/SQL块中的INSERT
替换为以下内容:
FORALL v_i IN tbl.FIRST..tbl.LAST
INSERT INTO myTable VALUES (sys_guid(), tbl(v_i).name, tbl(v_i).entityid);
我推荐Tim Hall的这篇伟大的文章: