ORA-00900:使用循环插入行时无效的SQL语句

时间:2015-02-12 14:51:59

标签: plsql oracle11g

我试图通过在Aqua Data Studio(版本15.0.11)中运行以下内容,将多行插入到Oracle 11g表中,使用:

BEGIN
    FOR i IN 1..700 LOOP
        INSERT INTO lims.stock_template (
            stock_template_id,
            name,
            group_id,
            version,
            version_status,
            workflow_id,
            amount,
            stock_type_id,
            aliquot_template_id,
            auto_authorise,
            reorder_amount
            )
        VALUES (
            lims.sq_stock_template.nextval,
            lims.sq_stock_template.currval,
            21,
            1,
            'A',
            51881,
            0,
            103,
            2362,
            'F',
            0
            );
    END LOOP;
END;
/

但是我收到以下错误:

>[Error] Script lines: 30-30 ------------------------
 ORA-00900: invalid SQL statement
 Script line 30, statement line 1, column 0 

如果我只运行INSERT语句,它可以正常工作,但我希望能够在一个操作中插入多行。

我确信我过去曾经做过类似的事情,但我看不出有什么问题。

任何帮助都非常感激。

由于

2 个答案:

答案 0 :(得分:0)

在您的示例中,您包含了一个BEGIN和END子句,该子句将其转换为" Anonymous PL / SQL Block"

http://docstore.mik.ua/orelly/oracle/prog2/ch15_03.htm

在PL / SQL块中,您无法直接执行SQL语句。您必须只使用PL / SQL。请参阅附带的示例。enter image description here

现在您可以创建一个存储过程来执行插入并使用Script Object to Window As - >执行或执行绑定。请参见下面的屏幕截图。enter image description here

答案 1 :(得分:0)

在包中的存储过程或存储过程中,您可以做任何您喜欢的事情!

create or replace procedure testMe as

begin

    FOR i IN 1..700 LOOP
        INSERT INTO lims.stock_template (
            stock_template_id,
            name,
            group_id,
            version,
            version_status,
            workflow_id,
            amount,
            stock_type_id,
            aliquot_template_id,
            auto_authorise,
            reorder_amount
            )
        VALUES (
            lims.sq_stock_template.nextval,
            lims.sq_stock_template.currval,
            21,
            1,
            'A',
            51881,
            0,
            103,
            2362,
            'F',
            0
            );
    END LOOP;

end; 

完全类似于在SQL提示符处键入每一行,从单词开始到单词 end;

更可能绊倒你的是底部的斜线。在CLI sqlPlus中,带有分号(;)的行尾导致它运行该进程,因此:

select 'A' from dual;

分号告诉它执行。

另一方面,如果你输入单词开始,那么它会转换模式并在任何地方接受分号,只是继续将字符串添加到缓冲区。在A BLANK LINE上输入/并返回,它将尝试执行您的代码。

我认为如果删除斜杠,它会很好地执行。