2016-04-15 5 views
1

Javaでplsql変数値(l_console_message)を印刷しようとしています。しかし、このアプローチは機能していないようです。私はResultSetビットで何かが間違っていると信じています。私はここで何かを逃している。どのようなアイデア、何がうまくいかない?plsql変数値を無名ブロックからJavaに出力

 PreparedStatement statement = null; 
    try { 
     statement = connection.prepareStatement("\n" + 
      " declare " + "\n" + 
      " p_schema_name varchar2(400):= upper('" + schema + "'); " + "\n" + 
      " p_temp_table_name varchar2(400) := upper('temp_table_jobs_name'); " + "\n" + 
      " l_result varchar2(400); " + "\n" + 
      " l_owner varchar2(200); " + "\n" + 
      " l_job_name varchar2(200); " + "\n" + 
      " l_enabled varchar2(200); " + "\n" + 
      " l_console_message varchar2(4000); " + "\n" + 
      " cursor c1_temp_table_name is " + "\n" + 
       " select " + "\n" + 
        " table_name " + "\n" + 
       " from all_tables " + "\n" + 
       " where table_name = p_temp_table_name; " + "\n" + 
      " begin " + "\n" + 
       " open c1_temp_table_name; " + "\n" + 
       " fetch c1_temp_table_name into l_result; " + "\n" + 
       " if c1_temp_table_name %notfound then " + "\n" + 
        " execute immediate ' " + "\n" + 
         " create table '||p_schema_name||'.'||p_temp_table_name||' (" + "\n" + 
          " schema_name varchar2 (1000), " + "\n" + 
          " job_name varchar2(1000), " + "\n" + 
          " status varchar2(100) " + "\n" + 
         ")'; " + "\n" + 
        " l_console_message := p_temp_table_name||' created.'; " + "\n" + 
        " dbms_output.put_line (l_console_message); " + "\n" + 
       " end if; " + "\n" + 
       " close c1_temp_table_name; " + "\n" + 
      " exception when others then " + "\n" + 
       " null; " + "\n" + 
      " end;"); 
    ResultSet rs = statement.execute(); 
    while (rs.next()){ 
     System.out.println(rs.getString(l_console_message)); 
    }  
} 
catch (SQLException e) { 
    System.out.println("ERROR: Unable to run SQL statements for schema " + schema + " in beforeMigrate: " + e.getMessage()); 
} 
finally { 
    if (null != statement) { 
     try { 
      statement.close(); 
     } 
     catch (SQLException se) { 
      System.out.println("ERROR: Unable to close statement in beforeMigrate: " + se.getMessage()); 
     } 
    } 
} 

あなたの例では、問題は次の通りです

+2

http://stackoverflow.com/questions/5101529/execute-anonymous-pl-sql-block-and-get-resultset-in-java –

+0

ありがとうございました。この例では、refrenceカーソルがあります。今、私の場合。私はそれをまったく持っていません。 いくつか変更しようとしましたが、「無効な列インデックス」エラーが発生します。 – Jaanna

+0

この例には参照カーソルがありますが、文字列もあります。したがって、2つのOUTバインド変数とINバインド変数があります。 1つのOUT変数だけが必要なので、登録/取得インデックスは1になります。 –

答えて

1

コメントからリンクされている質問は、あなたが何をする必要があるかの例を示していますが、あなたの状況にそれを翻訳するのに苦労しているようです。

あなたの無名ブロックは結果セットを返さないため、結果セットをクエリとして実行することはできません。また、準備されたステートメントであってはなりません。その後

CallableStatement statement = null; 
try { 
    statement = connection.prepareStatement("\n" + 
... 

バインド変数のプレースホルダにあなたのPL/SQL変数の値を割り当てる必要があり、次のいずれか:

... 
       " l_console_message := p_temp_table_name||' created.'; " + "\n" + 
       " ? := l_console_message; " + "\n" + 
      " end if; " + "\n" + 
... 

かでl_console_messageを持っていないあなたの代わりにコール可能文を持っている必要がありますすべて(それも宣言する必要はありません)、単にバインド変数のプレースホルダに直接文字列を割り当てます。

... 
       " ? := p_temp_table_name||' created.'; " + "\n" + 
      " end if; " + "\n" + 
... 

いずれかの方法でdbms_outputコールISNここでは役に立たない。 (実際にはおそらく、あなたはdbms_outputのバッファをJavaから取得するでしょうが、それはもっと多くの作業です)。

その後、あなたは文字列を受け取るためにOUTバインド変数を宣言し、​​はなくexecuteQuery()でステートメントを呼び出す必要があります:

statement.registerOutParameter(1, Types.VARCHAR); 
    statement.execute(); 

次にあなたがバインドに置かれている文字列値を取得することができます変数;例えばコンソールにまっすぐにそれを印刷する:

System.out.println(statement.getString(1)); 

ResultSetrsとループが完全になくなっています。

+0

Alexに感謝します。 Javaでの変数バインディングは私にとっては新しいものです。今私はループでどのように実行できますか。私はstatement.registerOutParameter(1、Types.CURSOR)を行う必要がありますか? ? – Jaanna

+0

ループ内で何を実行しますか?異なるスキーマ値を使用して同じブロックを複数回実行したいですか?それぞれの実行は、引き続き単一の文字列を返します。 –

0

:-)事前に感謝します:

  1. を匿名PL/SQLブロックは、何も返さないことができます。
  2. PL/SQLブロックで宣言された変数は、スコープからエスケープできません。あなたの例では、l_console_message変数はJavaコードではなく、匿名PL/SQLブロックでのみ表示されます。

PL/SQLコードから値(または結果セット)を戻す場合は、スタンドアロンまたはパッケージ・サブプログラムが必要です。または、ホスト環境(Javaコード)が出力変数をバインドする@ mario-tankでリンクされたideaを使用してください。

インターネットとStackOverflowには、JavaからPL/SQLコードを呼び出す方法が豊富に用意されています。

関連する問題