2016-10-06 16 views
0

OracleデータベースでJavaアプリケーションをプログラミングしています。私が使っているPL/SQL文は次のとおりです。Java PL/SQL '即時実行'

DECLARE 
USER_COUNT INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO USER_COUNT FROM dba_users WHERE username=?; 
    IF (USER_COUNT = 0) THEN 
    EXECUTE IMMEDIATE 'CREATE USER ? IDENTIFIED BY ?'; 
    EXECUTE IMMEDIATE 'GRANT CREATE SESSION, CREATE TABLE, CREATE ANY INDEX TO ?'; 
    ELSE 
    raise_application_error(-20101, 'User ? already exists. Please drop it or choose another username.'); 
    END IF; 
END; 
/

しかし、疑問符前後に引用符がある場合、私は「は無効な列インデックス」エラーの多くを得ました。例えば:

EXECUTE IMMEDIATE 'CREATE USER ? IDENTIFIED BY ?'; 

が動作していないが、

EXECUTE IMMEDIATE CREATE USER ? IDENTIFIED BY ?; 

が良いです。

java.sql.SQLException: ORA-06550: line 6, column 23: 
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: 

(- + case mod new not null <an identifier> 
<a double-quoted delimited-identifier> <a bind variable> 
continue avg count current exists max min prior sql stddev 
sum variance execute forall merge time timestamp interval 
date <a string literal with character set specification> 
<a number> <a single-quoted SQL string> pipe 
<an alternatively-quoted string literal with character set specification> 
<an alternat 

は何をすべきかを教えてください:私は2番目の形式を使用することを選択した場合

しかし、私は別の構文エラーを得ました。

+0

あなただけの、Javaから3つのステートメントを実行していない任意の理由は? – Andreas

答えて

1

これを試してください。

DECLARE 
    USER_COUNT INTEGER; 
BEGIN 
    SELECT COUNT (*) 
    INTO USER_COUNT 
    FROM dba_users 
    WHERE username =?; 
    IF USER_COUNT = 0 THEN 

    EXECUTE IMMEDIATE 'CREATE USER '||?|| 'IDENTIFIED BY '||?; 
    EXECUTE IMMEDIATE 'GRANT CREATE SESSION, CREATE TABLE, CREATE ANY INDEX TO '|| ?; 
    ELSE 
    raise_application_error(-20101, 'User ? already exists. Please drop it or choose another username.'); 
    END IF; 
END; 
/
+0

エラーメッセージで '?'を忘れました。 – Andreas

+0

私は本当にjavaを知りません。 JAVAフロントエンド経由で渡されるバインド変数です。間違っていれば私を訂正してください。無名ブロックにバインド変数を渡したい場合 – XING

2

?は、バインド変数である場合は、create user声明のものを使用することはできません。完全なリテラルテキストが必要です。

btw実際にはCREATE ANY INDEXを意味しましたか?これにより、新しいユーザーはデータベース全体のどのテーブルにも索引をつけることができます。通常平野CREATE INDEXで十分です。

事前に1つ以上の役割を定義してから、every possible privilegeをハードコードするのではなく、新しいユーザーに付与する方がよいでしょう。ユーザーがビュー、プロシージャ、タイプなどを作成できるかどうか開発者アカウントになる場合は、コードをデバッグしてロックを定義できるはずですか? IMMEDIATEをEXECUTEでDDLで作業するときは、バインド変数を使用することはできませんのように...

(ただ、関心の外に、あなたは大文字でJavaを書くのですか、単にPL/SQL?)

関連する問題