Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 将表变量的内容插入表中_Oracle_Oracle11gr2 - Fatal编程技术网

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的这篇伟大的文章: