Plsql oracle中的绑定变量替换

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

下面的简单过程假定为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_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语句之间有一个很好的位置