以下简单程序假设在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*
答案 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行应该出现,否则您将错过输出一个或多个正在处理的语句。在赋值语句和执行语句之间有一个好的位置。