2017-01-11 13 views
0

以下の簡単な手順では、oracleのユーザーscottに付与を提供すると仮定します。oracleでの変数の置換の置換

&の値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

あなたは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_OUTPUT行はl_sqlへの代入の後に来なければなりません。そうしないと、処理中の1つ以上の文の出力が欠落します。代入文と実行文の間には良い場所があります。

+0

入力@sentinalに感謝します。出来た。 –