我可以对多个记录类型变量使用INSERT ALL吗?

时间:2019-07-10 12:31:49

标签: oracle plsql bulkinsert

给定一个我可以访问2个recordtype变量的PL / SQL块,我想在一条语句中将这2条记录插入同一表中,但是到目前为止,我使用INSERT ALL的尝试都失败了。可以将INSERT ALL与记录变量一起使用吗?

以下是使用专用插入的有效代码:

DECLARE
    mProperty1 MyTable%ROWTYPE;
    mProperty2 MyTable%ROWTYPE;
    ...
BEGIN
    ...
    INSERT INTO MyTable VALUES mProperty1;
    INSERT INTO MyTable VALUES mProperty2;
    ...
END;

如果我尝试将语句转换为INSERT ALL,它将失败并显示错误消息:

DECLARE
    mProperty1 MyTable%ROWTYPE;
    mProperty2 MyTable%ROWTYPE;
    ...
BEGIN
    ...
    INSERT ALL
          INTO MyTable VALUES mProperty1
          INTO MyTable VALUES mProperty2
          SELECT 1 FROM DUAL;
    ...
END;
  

ORA-06550:第14行,第60栏:   PLS-00382:表达式的类型错误   ORA-06550:第13行,第60列:   PLS-00382:表达式的类型错误   ORA-06550:第13行,第60列:   PL / SQL:ORA-00904::无效的标识符   ORA-06550:第12行,第7列:   PL / SQL:忽略了SQL语句

我缺少明显的东西吗?有没有办法使该语句起作用?

1 个答案:

答案 0 :(得分:1)

我尝试使用其他方法,但仅以下一项获得成功:

方法1:

使用%ROWTYPE字段中的特定记录名称

DECLARE
    mProperty1 MyTable%ROWTYPE;
    mProperty2 MyTable%ROWTYPE;
BEGIN
    mProperty1.COL1 := 1;
    mProperty2.COL1 := 2;
    INSERT ALL 
    INTO  MyTable VALUES (mProperty1.col1)
    INTO  MyTable VALUES (mProperty2.col1)
    SELECT 1 FROM DUAL;
END;
/
-- may be bad choice but you can use like this

方法2:

如果您担心性能,那么也可以使用此方法:

DECLARE
    TYPE mProperty_TYPE IS TABLE OF MyTable%ROWTYPE;
    mProperty mProperty_TYPE;
BEGIN
    mProperty := mProperty_TYPE();
    mProperty.EXTEND(2);
    mProperty(1).COL1 := 3;
    mProperty(2).COL1 := 4;
    FORALL I IN 1..mProperty.COUNT 
    INSERT INTO MyTable VALUES mProperty(I);
END;
/

db<>fiddle demo