绑定oracle

时间:2017-01-11 15:08:36

标签: 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_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*

1 个答案:

答案 0 :(得分:1)

您不能在DDL或DML语句中使用绑定变量代替标识符(特别是模式或对象名称),它们只能用于代替值表达式。

由于你正在使用替换变量,你可以将它放在sql语句中:

l_sql:= 'grant select,insert,update,delete on hr.'||i.oname||' to &scott_SCHEMA with grant option';

并执行它而不将其作为参数传递:

execute immediate l_sql;

另外,在分配给l_sql之后,您的DBMS_OUTPUT行应该出现,否则您将错过输出一个或多个正在处理的语句。在赋值语句和执行语句之间有一个好的位置。