oracle程序给ORA-00905:缺少关键字

时间:2015-02-12 13:03:22

标签: oracle plsql dynamic-sql

我试图创建一个通用程序来同步序列。 我想调用该过程并传递表,列和序列的名称,但由于错误,我的程序无法运行。

步骤:

CREATE OR REPLACE PROCEDURE INCREMENT_SEQ(table_name in varchar2 , id_column in varchar2 , sequence_name in varchar2) 
AS
current_value  number;
seq_val number := -1;
begin
EXECUTE IMMEDIATE 'select max(' || table_name || '.' || id_column || ') into current_value  from ' || table_name ;
WHILE current_value  >= seq_val
LOOP
 EXECUTE IMMEDIATE 'select ' || sequence_name || '.nextval into seq_val from dual';
end loop;
end;

当我运行脚本时,我遇到以下错误:

  

第2行的错误

     

ORA-00905:缺少关键字

     

ORA-06512:at" TGC100_DEV.INCREMENT_SEQ",第6行

     

ORA-06512:第1行

     

脚本终止于第16行。

但我不知道如何解决。任何建议都会有所帮助。

2 个答案:

答案 0 :(得分:2)

您应该将INTO子句置于查询之外:

CREATE OR REPLACE PROCEDURE INCREMENT_SEQ(table_name in varchar2 , id_column in varchar2 , sequence_name in varchar2) 
AS
current_value  number;
seq_val number := -1;
begin
EXECUTE IMMEDIATE 'select max(' || table_name || '.' || id_column || ')   from ' || table_name into current_value;
WHILE current_value  >= seq_val
LOOP
 EXECUTE IMMEDIATE 'select ' || sequence_name || '.nextval from dual' into seq_val;
end loop;
end;

答案 1 :(得分:2)

  

EXECUTE IMMEDIATE'从'||中选择max('|| table_name ||'。'|| id_column ||')到current_value table_name;

语法不正确。 INTO 子句应在 EXECUTE IMMEDIATE 语句之外。

类似的东西,

EXECUTE IMMEDIATE 'your SQL statement' INTO variable USING value;

UPDATE 最好将动态SQL作为变量,以避免在EXECUTE IMMEDIATE语句本身中出现如此多的单引号和串联混淆。

Aramilo的另一个答案是在我的回答之前发布的,但我很困惑地看到INTO条款已经在声明之外了。

对于开发人员,在实际执行之前首先使用 DBMS OUTPUT 检查动态SQL始终是一个好习惯。因此,它节省了大量时间来调试整个PL / SQL代码。确认形成的动态SQL正确后,删除DBMS_OUTPUT并执行PL / SQL代码。