动态SQL中引用变量报错ORA-00933

时间:2022-03-07 01:02:17
create or replace procedure aaa Authid  Current_User
as
v_d1   date;
v_d2   date;
str varchar2(500);

v_d1:=trunc(sysdate)-30;
v_d2:=trunc(sysdate);

str:= 'CREATE TABLE table1 as Select USER_NO,Max(join_date) join_date from xxx aa where aa.JOIN_DATE>='||v_d1||'   And aa.JOIN_DATE<'||v_d2||'  group by USER_NO ';
execute  immediate  str;

end aaa;

为什么总报错,ORA-00933: SQL 命令未正确结束
ORA-06512: 在 "aaa", line 12
ORA-06512: 在 line 1
动态SQL变量不能这样引用吗?本人菜鸟,求高手解答!!

6 个解决方案

#1


str varchar2(500);
 --变量定义完后 ,后面开始
 begin  

#2


  加上 begin 就不会报错了!

#3


不好意思,我没粘全,本来有begin,没有就不会编译通过了吧。主要是ORA-00933: SQL 命令未正确结束,还是动态SQL的问题啊

#4


create or replace procedure aaa Authid Current_User
as
v_d1 date;
v_d2 date;
str varchar2(500);

begin

v_d1:=trunc(sysdate)-30;
v_d2:=trunc(sysdate);

str:= 'CREATE TABLE table1 as Select USER_NO,Max(join_date) join_date from xxx@db_link aa where aa.JOIN_DATE>='||v_d1||' And aa.JOIN_DATE<'||v_d2||' group by USER_NO ';
execute immediate str;

end aaa;


就是这个,报错ORA-00933: SQL 命令未正确结束
ORA-06512: 在 "aaa", line 43
ORA-06512: 在 line 1
到底什么原因呢,是这个Select USER_NO,Max(join_date) join_date from xxx@db_link的问题吗,
是动态SQL中不能使用@db_link还是什么问题?高手解答下

#5


如果编译通过了,在执行的时候报错的话,你可以先把str输出出来,看看他到底是什么语句,然后再在sqlplus里面执行看看能否执行通过

#6


问题已经解决了,还是引用变量问题
aa.JOIN_DATE>='||v_d1||' And aa.JOIN_DATE<'||v_d2||' group by USER_NO '
不能用单引号,aa.JOIN_DATE>='''||v_d1||''' And aa.JOIN_DATE<'''||v_d2||''' group by USER_NO '  改成这样就好了。

#1


str varchar2(500);
 --变量定义完后 ,后面开始
 begin  

#2


  加上 begin 就不会报错了!

#3


不好意思,我没粘全,本来有begin,没有就不会编译通过了吧。主要是ORA-00933: SQL 命令未正确结束,还是动态SQL的问题啊

#4


create or replace procedure aaa Authid Current_User
as
v_d1 date;
v_d2 date;
str varchar2(500);

begin

v_d1:=trunc(sysdate)-30;
v_d2:=trunc(sysdate);

str:= 'CREATE TABLE table1 as Select USER_NO,Max(join_date) join_date from xxx@db_link aa where aa.JOIN_DATE>='||v_d1||' And aa.JOIN_DATE<'||v_d2||' group by USER_NO ';
execute immediate str;

end aaa;


就是这个,报错ORA-00933: SQL 命令未正确结束
ORA-06512: 在 "aaa", line 43
ORA-06512: 在 line 1
到底什么原因呢,是这个Select USER_NO,Max(join_date) join_date from xxx@db_link的问题吗,
是动态SQL中不能使用@db_link还是什么问题?高手解答下

#5


如果编译通过了,在执行的时候报错的话,你可以先把str输出出来,看看他到底是什么语句,然后再在sqlplus里面执行看看能否执行通过

#6


问题已经解决了,还是引用变量问题
aa.JOIN_DATE>='||v_d1||' And aa.JOIN_DATE<'||v_d2||' group by USER_NO '
不能用单引号,aa.JOIN_DATE>='''||v_d1||''' And aa.JOIN_DATE<'''||v_d2||''' group by USER_NO '  改成这样就好了。