我试图创建一个通用程序来同步序列。 我想调用该过程并传递表,列和序列的名称,但由于错误,我的程序无法运行。
步骤:
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行。
但我不知道如何解决。任何建议都会有所帮助。
答案 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代码。