• ベストアンサー

JDBCによるストアドCALL

今日はJDBCによるストアードプロシージャCALLについてお伺いします。 ストアードプロシージャのCALL文では以下のように宣言しますが、{}は必要なのでしょうか? con.prepareCall("CALL KRVZZ01Z(?,?)")  ・・・・(1) con.prepareCall("{CALL KRVZZ01Z(?,?)}") ・・・(2) どの本にも(2)のように記述してあるのですが、私の環境では(1)でも動きました。 いらないのでしょうか? 環境はDB2とJDK1.3です。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.1

基本的につけておくことを進めます。 {}はネイティブSQLであることを示すものだからです。 おそらくCallをつかっているとみるとPL/SQLだとおもわれますが、ストアドプロシジャは各DB製品によってまったくちがいます。 {}をつけないとJDBCドライバがSQLの方言の差異を吸収してしまい。ストアドの場合は思わぬ誤動作を起こすことがあります。 ですから、このSQL文は最適化せずにそのままDBまで届けてくださいよという{}があったほうがよいです。

masae-
質問者

お礼

ご丁寧な回答ありがとうございました。 当初はつけないというくくりだったため、危ないところでした。 今後ともよろしくお願いいたします。 ありがとうございました。

関連するQ&A

  • JDBCによるストアードプロシージャ呼び出し

    いつもお世話になっております。 JDBCによるストアードプロシージャCALLについてお伺いいたします。 ストアードプロシージャを実行するにはいくつかのメソッドがあります。 戻り値が複数ある場合はexecute()メソッドを用いるそうですが、 ResultSetオブジェクトを複数返す場合はどのように受け取ればよいのでしょうか? 例えば ResultSet rs = cstmt.execute();では複数うけとれますか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ストアドプロシージャについて

    ストアドプロシージャで、Accessのクエリーを実行させテーブルの中の指定したIDのデータを削除させるという流れなのですが・・ 以下のソースで実行はできるのですが、削除ができていないので原因がわかりません。アドバイスお願いします。 package CallableStatement; import java.sql.*; import java.io.*; public class cCallableStatement { public static void main(String[] args) { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection db=DriverManager.getConnection("jdbc:odbc:sample","",""); CallableStatement cllDelete; int ID = 3;        // 削除 cllDelete = db.prepareCall("{call DELETE(?)}"); cllDelete.setInt(1,ID); cllDelete.executeUpdate(); } } 環境はwin2000 pro forte for java 4.0 jdk : 1.4 データベース: Access2000

  • 使用すべきOracle8i用JDBCドライバのバージョンについて

    下記の構成でTomcatからデータソースを利用して DBにJDBC接続しようと思っています。 【OS】 WindowsXP 【JDK】 1.4.15 【アプリケーションサーバ】 Tomcat4.1.36 【データベース】 Oracle8.1.5 Oracleインストール後、%ORACLE_HOME%/jdbc\lib/以下のフォルダには 下記のJDBCドライバしかありませんでした。 classes102.zip (JDK 1.0.2 用) classes111.zip (JDK 1.1.x 用) また下記のURLよりOracle JDBC Driver 8.1.5のJDBCドライバをダウンロードしようと試みました。 http://otn.oracle.co.jp/software/tech/java/jdbc/index.html ところが、Oracle8iについては8.1.7のJDBCドライバのみ公開しており、 その内容を見ても下記のJDBCドライバしかありませんでした。 classes111.zip(JDK 1.1.x 用) classes12.zip(JDK 1.2.x 用) 今回の私の環境では、どこからどのバージョンのJDBCドライバを入手して 使用すればいいのでしょうか? ご教授よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaからストアド実行(配列項目)

    Javaからストアドを実行しようとしていますが、 単項目のIN、OUTは問題ないのですが IN引数を配列にしようとした場合うまく処理できません。 ARRAY array = new ARRAY(ad, con, values);のところで java.sql.SQLException Non supported character set: oracle-character-set-832 で落ちてしまいます。 原因であると思われた、CLASSPATHにnls_charset12.jarが通っているかということも確認しました。 原因が分かる方がいましたら教えていただきたく思います。 よろしくお願いします。 環境 OS : WindowsXP DB : Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 JDBC : Oracle JDBC Driver 9.2.0.5 JDK : JDK 1.4.2 ---------------------------------------------------------------- import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import oracle.jdbc.OracleCallableStatement; import oracle.jdbc.OracleTypes; import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; public class TestPlsql { public static void main(String[] args) throws Exception { String username = "ID"; String password = "PASS"; String thinConn = "jdbc:oracle:thin:@DBADD:1521:DBNAME"; try { // Oracle JDBC driverをロードします。 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); // DB接続 Connection con = DriverManager.getConnection(thinConn,username,password); // SQLコンテナ作成 // 引数:IN IN OUT OUT IN OUT String sql = "{call TEST_PKG.TEST_PRO(?,?,?,?,?,?)}"; OracleCallableStatement cstmt = (OracleCallableStatement)con.prepareCall(sql); cstmt.setInt( 1, 999 ); cstmt.setString( 2, "TEST" ); cstmt.registerOutParameter( 3, OracleTypes.INTEGER ); cstmt.registerOutParameter( 4, OracleTypes.VARCHAR ); // 配列 String[] values = {"18", "25", "104", "53", "29"}; ArrayDescriptor ad = ArrayDescriptor.createDescriptor("VCHAR2ARRAY", con); ARRAY array = new ARRAY(ad, con, values); ///////ここでエラー cstmt.setArray(5, array); cstmt.registerOutParameter(6, OracleTypes.ARRAY, "VCHAR2ARRAY"); // SQL実行 cstmt.execute(); // OUT引数の値を取得する System.out.println(cstmt.getInt(3)); System.out.println(cstmt.getString(4)); ARRAY array2 = (ARRAY) cstmt.getArray(6); String[] s = (String[]) array2.getArray(); for (int i=0; i<s.length; i++) { System.out.println(s[i]); } cstmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } }

  • JDBC接続について

    お世話になります。 MSDE2000にJDBCにて接続したいのですが、SQLExceptionが発生して接続できません。 JDBCドライバーはMSよりDLして、CLASSPATHに追加しております。 環境は OS:Win2K Pro JAVA:jdk1.3.1_18 です。 JAVAのソースは下記のとおりです。 import java.sql.*; import java.io.*; import java.util.*; public class SQLServerJDBCTest { public static void main(String[] args) { // ログインに必要な情報 String user = "sa"; //ユーザ名 String pass = "password"; //パスワード try { // ドライバクラスをロード Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); // データベースへ接続 Connection con = DriverManager.getConnection ("jdbc:microsoft:sqlserver://127.0.0.1:1433",user,pass ); // ステートメントオブジェクトを生成 Statement stmt = con.createStatement(); // クエリーを実行して結果セットを取得 String sql = "SELECT GETDATE()"; ResultSet rs = stmt.executeQuery(sql); // 表示 while (rs.next()) { System.out.println(rs.getString(1)); } // データベースから切断 stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } } おかしな点や追加設定等ありましたらご指摘ください。 (投稿文字制限でExceptionの内容が載せられませんでした。) また、MSDEのバージョン7に接続する場合、同じJDBCドライバーで、同じ設定でいいのでしょうか? よろしくお願いいたします。

  • MySQLのストアドプロシージャをJavaから使いたい

    MySQLのバージョン5から搭載されたストアドプロシージャをJavaから使いたいと考えています。 また、MySQLのストアドプロシージャの文法自体も知りたいです。 しかしまだWeb上の情報が少なく、困っています。 このような情報の載っているサイトをご存知の方がいたら教えていただきたいです。 (できれば日本語のサイトだとさらにありがたいです) もしくはサンプルを直接記述していただけないでしょうか。 環境は ・WindowsXP ・Java5 ・MySQL5 です。よろしくお願いします。 ちなみに公式サイトのページは知っています。 http://dev.mysql.com/doc/refman/5.0/en/stored-procedures.html ので、それ以外でお願いします。

  • JavaでのOracle接続について(JDBC)

    はじめまして。 先週よりJavaの勉強を始めていまして 先日からDB接続(Oracle)をやっているのですが、Oracleに接続することが出来ません。色々なサイトからクラスパスが通っていないというエラーのようなのですが、プログラミング経験のある友人に聞いてもさっぱり原因が分かりません。また何度もインストールをやり直して同じです。以下に環境とソースを載せておきますので、もし何か解決のヒントになるような事がありましたら教えて下さい。 ●状況 (1)コンパイルは通るがjavaコマンドで実行をすると”Exception in thread "main" java.lang.ClassNotFoundException: oracle.jdbc.driveOracleDriver”が出てしまう。 (2)C:\oracle\ora92\jdbc\lib\ojdbc14.jarを環境変数→Pathへしっかりと通してあります。(setコマンドでも確認済みです) (3)C:\j2sdk1.4.1_02\jre\lib\extへojdbc14.jarをコピー (4)SQL PLUSからは接続出来る。 ●環境 クライアント:Win2000 DBサーバー:SQLサーバー(別マシンに環境構築) DB:Oralce9.2.0 JDK:1.4.1_02 import java.sql.*; class Employee { public static void main (String args []) throws SQLException,ClassNotFoundException { // Oracle JDBC Driverのロード Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@ホスト名:1521:SID", "ID", "パスワード"); Statement stmt = conn.createStatement (); ResultSet rset = stmt.executeQuery ("SQL"); while (rset.next ()) System.out.println (rset.getString ("ISBN")); rset.close(); conn.close(); } } 以上です。何か足りない情報がありましたら教えて下さい。

  • JDBCのバグ?それともプログラム(Java)のバグ?

    JavaからJDBC経由でPostgreSQLにSELECT文を発行し、 結果を受けて更に処理をするプログラムを作成しております。 その際、SELECTの結果をResultSet.next()メソッドを使い、 while文で結果の行数分処理をしようとしております。 しかし、複数行SELECT文の結果があるにもかかわらず、 1回のループで終わってしまい、 後は下記のExceptionが発生してしまいます。 Exceptionを読む限りでは、コネクションが閉じられていると分かるのですが、 プログラムでは一番最後のステップでデータベースとの切断をしております。 この様な現象のときは、JDBCが悪いのでしょうか?それともプログラムのつくりが悪いのでしょうか? 【 以下サンプルソース 】 Connection con = null; Statement st = null; ResultSet rs = null; try{ Class.forName("org.postgresql.Driver"); con = DriverManager.getConnection(jdbc:postgresql://localhost:5432/hoge?user=hoge&password=hoge); st = con.createStatement(); rs = st.executeQuery("select hogehoge from hogerake"); // 必ず複数行戻ります。 while(rs.next()){ // 処理 } con.close(); st.close(); rs.close(); }catch(Exception e){ e.printstackTrace(); } 【 以上サンプルソース 】 【 以下コンソール 】 org.postgresql.util.PSQLException: Connection is closed. Operation is not permitted. at org.postgresql.jdbc1.AbstractJdbc1ResultSet.next(AbstractJdbc1ResultSet.java:134) at jp.co.comsys.felica.ExitManagement.main(ExitManagement.java:10) 【 以上コンソール 】

  • ストアドプロシージャーでバッチ処理

    MySQL のストアドプロシージャーをつかって バッチ処理を作ろうとしています。 windows のスケジューラーを利用して、ファイルより定期的に処理したいと思っています。 LOAD DATA 文でファイルよりデータを取得し、DBへインサートはできるのですが、ストアドプロシージャーはバッチとして起動させることはできるのかご教授ねがいます。 その他、良い方法があれば、ご教授ねがいます。 環境は  MySQL 5.x os Windows2003です。

  • JDBCでaccessから取得したデータをjTableに表示させたい。

    JDBCでaccessのデータベースから取得したデータをjTableに表示させたいのですが どのようにしたらセルのデータやタイトルを入力させることができますか? またデータベースを操作したらその結果を表示させたいと考えています。どのようにすれば実現できるでしょうか? accessのデータベースには以下のように接続していました。 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String str = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=hello.mdb"; Connection con = DriverManager.getConnection(str, "", ""); 開発環境はNetBeansを使用しています。