2017-02-26 20 views
1

Javaでは動作しません。Oracle - SET ROLEステートメント

Class.forName('oracle.jdbc.driver.OracleDriver'); 
      Connection connection = DriverManager.getConnection('jdbc:oracle:thin:@localhost:1521:test', 'xyz', 'pass'); 
      PreparedStatement stmt = connection.prepareStatement("set role ? identified by ?"); 
      String role = "TEST_ROLE"; 
      String pswd = "TEST_PASS"; 
      stmt.setString(1, role); 
      stmt.setString(2, pswd); 
      stmt.execute(); 

そして、上記のコードが例外をスローします。

java.sql.SQLSyntaxErrorException: ORA-01937: missing or invalid role name 

私はそれが正常に実行されたコマンドモードから同じ役割とパスワードを試してみました。

+0

ロール名は識別子です。プリペアドステートメントでは、識別子としてパラメータを渡すことはできません。 –

+0

代わりにSQLにparamsを連結し、実行してみてください。 – GurV

+0

@GurV、私は現在パラメタを連結してコードを持っています。ロガーではパスワードを出力します。私はロガーでパスワードを表示しないようにする必要があります。 – user3515080

答えて

0

をバインドするために、PreparedStatementのバインド変数のみを使用できます。ロール名やパスワードなどの識別子は使用できません。上記のように、値がハードコードされていないと仮定すると、文字列の操作に頼らざるを得ません。この場合、文字列に値を入れるだけで済みます。例:

String role = "TEST_ROLE"; 
String pswd = "TEST_PASS"; 
String sql = String.format("set role %s identified by %s", role, pswd); 
+0

私は今すぐparamsを連結したコードを持っています。ロガーではパスワードを出力します。私はロガーでパスワードを表示しないようにする必要があります。 – user3515080

関連する問題