给定一个我可以访问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语句
我缺少明显的东西吗?有没有办法使该语句起作用?
答案 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;
/