Plsql oracle中的绑定变量替换
下面的简单过程假定为oracle中的用户scott提供授权 &scott_SCHEMA的值已经在一个单独的文件(define_variable.sql)中定义,并且该值被正确替换,但是我得到了错误(如脚本底部所指定),非常感谢您的帮助Plsql oracle中的绑定变量替换,plsql,oracle-sqldeveloper,Plsql,Oracle Sqldeveloper,下面的简单过程假定为oracle中的用户scott提供授权 &scott_SCHEMA的值已经在一个单独的文件(define_variable.sql)中定义,并且该值被正确替换,但是我得到了错误(如脚本底部所指定),非常感谢您的帮助 SET SERVEROUTPUT ON declare l_sql varchar2(3200); begin for i in ( select table_name as oname,'TABLE' as type from all_tab
SET SERVEROUTPUT ON
declare
l_sql varchar2(3200);
begin
for i in ( select table_name as oname,'TABLE' as type from all_tables where owner='HR' AND table_name not like 'BIN$%' union all select view_name as oname,'VIEW' as type from all_views where owner='HR' and view_name not like 'BIN$%' )
loop
if i.type = 'TABLE' then
dbms_output.put_line(l_sql);
l_sql:= 'grant select,insert,update,delete on hr.'||i.oname||' to :owner with grant option';
execute immediate l_sql using '&scott_SCHEMA';
else
l_sql:= 'grant select on hr.'||i.oname||' to :owner with grant option';
end if;
end loop;
end;
/
*declare
*
ERROR at line 1:
ORA-00987: missing or invalid username(s)
ORA-06512: at line 12*
在DDL或DML语句中,不能使用绑定变量代替标识符(特别是模式或对象名),它们只能用来代替值表达式 因为您使用的是替换变量,所以可以将其放在sql语句本身中:
l_sql:= 'grant select,insert,update,delete on hr.'||i.oname||' to &scott_SCHEMA with grant option';
并在不将其作为参数传递的情况下执行:
execute immediate l_sql;
另一方面,DBMS_输出行应该在分配给l_sql之后出现,否则将无法输出一个或多个正在处理的语句。在赋值语句和execute语句之间有一个很好的位置