2025/03/01 JavaプログラムからOracle JDBC Driverを使用して、引数にTYPE型、 Javaから見てARRAY型やOBJECT型の引数を持つPL/SQLストアドプロシージャを 実行する処理を開発していますが、引数の受け渡しのデバッグが手間です。 JavaとPL/SQLのプログラムにできるだけ手を入れずに、受け渡ししている引数が 仕様通りであるかを確認できる良い方法はありますか? 案1. CallableStatementでDBMS_OUTPUTの内容を取る方法がある https://oha-yo.com/oracle/jdbc/dbms-output-enable/ https://garapon.hatenablog.com/entry/20100627/1277647413 案2. -Doracle.jdbc.Trace=true または System.setProperty("oracle.jdbc.Trace", "true"); 案3. デバッグ用テーブルを使う 案4. 元のプロシージャをラップしたプロシージャを作り、Javaはラップ側を呼ぶ。 ラップ側でデバッグ用テーブルにデータを出力等する ---------------------------------------- Apache Tomcat 9.0の$CATALINA_HOME/libs にojdbc10.jarとorai18n.jarを配置し、 JavaVM起動オプションCATALINA_OPTSに -Doracle.jdbc.Trace=true を追加しました。 各Webアプリケーション app1, app2 のそれぞれ WEB-INF/lib にlog4j.jar、 WEB-INF/classes に log4j.xml を配置し、$CATALINA_HOME/libs にapp1.log,app2.log を出力するようにしました。JDBCドライバのログはどこに出力されますか? ---------------------------------------- Tomcatの標準出力。すなわちLinuxではcatalina.outに出る。 専用のファイルに出したい場合はこうする。 ---------------------------------------- ---------------------------------------- OpenJDK17からOracle Database19cに接続するときのojdbc***.jarの最適なバージョンはどれですか? ---------------------------------------- ojdbc10.jarです。 ---------------------------------------- -Doracle.jdbc.Trace=true を使う場合、ojdbc6.jarの時代は代わりにojdbc6_g.jarを使うべきとの情報があります。 ojdbc10.jarはそのままでもトレースログ出力が実行されますか? ---------------------------------------- はい。8以降には _g のついたjarは配布されていないし、必要もない。 ---------------------------------------- CallableStatementのオブジェクトから、接続先のデータベースか、 またはロードしているJDBCドライバクラスがOracleであるかどうかを判定する方法は有りますか? ---------------------------------------- DatabaseMetaData metaData = conn.getMetaData(); String dbProductName = metaData.getDatabaseProductName(); if (dbProductName != null && dbProductName.equalsIgnoreCase("Oracle")){ //oracleです ) { ---------------------------------------- conn.getClass(); String driverClassName = driverClass.getName(); if (driverClassName.startsWith("oracle.jdbc")) { //oracleです ---------------------------------------- ---------------------------------------- oracle.sql.ARRAYとoracle.sql.ArrayDescriptorはOracle Database19cに 接続するのは非推奨とのことです。単純に最新の記述に置き換えるには? ---------------------------------------- import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; // 非推奨の使用例 ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("MY_TYPE_ARRAY", connection); ARRAY array = new ARRAY(descriptor, connection, arrayElements); ------ import java.sql.Array; import java.sql.Connection; // 推奨される使用例 Array array = connection.createArrayOf("MY_TYPE_ARRAY", arrayElements); ---------------------------------------- JavaでDBMS_OUTPUT.PUT_LINEの出力内容を取得する処理を記述しました。エラー等がないか、レビューしてください。 ------ Connection conn = // DB接続 CallableStatement csdebug1 = conn.prepareCall("BEGIN DBMS_OUTPUT.ENABLE(); END;"); csdebug1.execute(); csdebug1.close(); CallableStatement cs = this.conn.prepareCall(this.query /* SQL */); Array array = conn.createArrayOf("MY_TYPE_T", new String[]{ "A", "B" }); cs.setArray(1, array); cs.setString(2, str1); cs.registerOutParameter(3, java.sql.Types.VARCHAR); cs.execute(); String result = cs.getString(3); cs.close(); CallableStatement csdebug2 = this.conn.prepareCall( "declare " + " num integer := 1000;" + "begin " + " dbms_output.get_lines(?, num);" + "end;" ); csdebug2.registerOutParameter(1, Types.ARRAY, "DBMSOUTPUT_LINESARRAY"); csdebug2.execute(); Array array = csdebug2.getArray(1); log.debug("---*** DBMS_OUTPUT START ***---"); for(Object o : (Object[]) array.getArray()) { log.debug(o); } log.debug("---*** DBMS_OUTPUT END ***---"); array.free(); csdebug2.close(); return result; ----------------------------------------