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

oracle程序ORA-00905:缺少关键字,oracle,plsql,dynamic-sql,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 IMMEDIAT

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

程序:

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:“TGC100发展增量”第6行

ORA-06512:在第1行

脚本在第16行终止


但我不知道怎么解决。任何建议都会很有帮助。

您应该将
放在查询之外的
子句中:

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;
从“| |表| | | | |”.| | | | id|列| |”将立即“选择最大值(“| | | |”)”从“| |表|名称”

这在语法上是不正确的。INTO子句应该在executeimmediate语句之外

大概

使用value将立即的“yoursql语句”执行到变量中

UPDATE最好将动态SQL作为变量,以避免与executeimmediate语句本身中的许多单引号和串联混淆

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


对于开发人员来说,在实际执行动态SQL之前,最好先使用DBMS输出检查动态SQL。因此,调试整组PL/SQL代码可以节省大量时间。一旦确认形成的动态SQL是正确的,请删除DBMS_输出并执行PL/SQL代码。

INTO
子句不能在
execute IMMEDIATE
语句中。看看我的答案。谢谢你的解答!嗨,@LalitKumarB,我不明白,我想它是固定的两个立即执行,请你能更具体一点吗?谢谢你,我很困惑。这就是为什么最好将动态查询作为变量形成以避免混淆的原因。是的,我明白了。我也更喜欢使用动态sql,如上面所示。