Oracleのパラメータ付きストアドプロシージャをJava(JDBC)でキックした場合に、戻り値のパラメータ参照をJavaの方で行うにはどうしたらよいでしょうか?誰か教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

ストアドプロシージャをよんだりする部分は出来ていると仮定して書きます。



Statement のオブジェクトを作るときに、Connection のオブジェクトからcreateStatement ではなくて prepareCall(String sql) のメソッドで CallableStatement のオブジェクトを作れば set% メッソドでパラメータをせっとして execute% した後、get% メソッドで取り出せます。

set% は setInt とかのことです。

詳しくはAPIのドキュメントを見てください。(java.sqlのパッケージを見てください。)

参考URL:http://java.sun.com/j2se/1.3/ja/docs/ja/api/inde …
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qoracle10g java jdbc 大量insertの高速化

oracle10g java jdbc 大量insertの高速化

以下のプログラムで1万件処理したところ30秒ぐらいかかりました。
まだ高速化の余地があると思うのですが、何かいい方法はありませんでしょうか?

String sql = "INSERT INTO TEST3 VALUES(?,?)";
PreparedStatement ps = con.prepareStatement(sql);
while(rs5.next()){
int id = rs5.getInt(1);
String line = rs5.getString(2);
ps.setInt(1,id);
ps.setString(2,line);
ps.addBatch();
}
ps.executeBatch();

Aベストアンサー

・ストアドで叩き込む
・ps.executeBatch()の回数を増やす。
・int id = rs5.getInt(1);String line = rs5.getString(2);を省略する(誤差程度)
・インデックスをいろいろ変えてみる

ぱっと考え付くのはこのくらいかしら。

QJDBC + JAVA Servlet、JSP、でMysqlのレコード更新、レコード参照について

 標記につき勉強中ですが素人です。何とか道筋を教えて下さい。宜しくオ願いします。
 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_05.htmを懸命に見ています。
以下 
■MySQL JDBC + JAVA Servlet、JSP レコード更新

・レコード追加で、日本語データが指定できるかテストする。
問題なく追加できる。

<%@ page import="java.util.*,java.sql.*;" contentType="text/html; charset=Shift_JIS"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>JAVA Server Page(JSP) - MySQL JDBC Test</TITLE>
</HEAD>
<BODY>
<P>JAVA Server Page(JSP) - MySQL JDBC Test</P>
<%
String drv = "com.mysql.jdbc.Driver";
String dsn = "jdbc:MySQL://localhost:3306/sak?user=sak&password=";
Connection cn = null;
Statement st = null;
ResultSet rs = null;

// MySQL JDBC ドライバロード
以下

ここで説明しているのは上記をJSPで記述すれば動作するということなのでしょうか、お教え下さい。
前提条件が良く分からないのです。或いは何が分からないのか良く分からないレベルです。
多分上記をaaa.JSPに作ればコンパイルされるので動くということかなと考えています。
コンテキスト、Web.Xml、Jap、Java、ViewBeanの関係が分かりません何とか御願致します。

 標記につき勉強中ですが素人です。何とか道筋を教えて下さい。宜しくオ願いします。
 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_05.htmを懸命に見ています。
以下 
■MySQL JDBC + JAVA Servlet、JSP レコード更新

・レコード追加で、日本語データが指定できるかテストする。
問題なく追加できる。

<%@ page import="java.util.*,java.sql.*;" contentType="text/html; charset=Shift_JIS"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<META http-...続きを読む

Aベストアンサー

> ここで説明しているのは上記をJSPで記述すれば動作するということなのでしょうか

動作しません。
JSPのコンテナをサポートしたAPサーバやMySQLが必要で、
データソースの設定も必要です。
またJDBCのドライバも取得してクラスパスを通す必要があります。

>前提条件が良く分からないのです。或いは何が分からないのか良く分からないレベルです。

何が分からないのか分からない人に
何も教えることはできません。

>多分上記をaaa.JSPに作ればコンパイルされるので動くということかなと考えています

JSPを動作させる環境はあるということですか?
先にも述べましたが、動作させるにはドライバとデータソースの設定が必要です。

>コンテキスト、Web.Xml、Jap、Java、ViewBeanの関係が分かりません何とか御願致します。

そんなに丸投げをされてもあなた程の初心者に
ここですべての解説なんてできません。
もう少し質問事項を絞る必要があると思います。
あるいは適切な回答を得るためにはもう少しご自身の力で
せめて何が分からないのか整理する必要があるでしょう。

こっちのサイトの方が初心者向きでわかりやすいかと思います。
http://www.hellohiro.com/jdbcmysql.htm
http://www.hellohiro.com/datasource.htm

> ここで説明しているのは上記をJSPで記述すれば動作するということなのでしょうか

動作しません。
JSPのコンテナをサポートしたAPサーバやMySQLが必要で、
データソースの設定も必要です。
またJDBCのドライバも取得してクラスパスを通す必要があります。

>前提条件が良く分からないのです。或いは何が分からないのか良く分からないレベルです。

何が分からないのか分からない人に
何も教えることはできません。

>多分上記をaaa.JSPに作ればコンパイルされるので動くということかなと考えています

JSPを動作...続きを読む

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

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

よろしくお願いいたします。

Aベストアンサー

Statement インターフェースの

getMoreResults メソッドと getResultSet メソッド

を参照してみてください。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/sql/Statement.html

Qストアドプロシージャ呼び出しのSQL文について

こんにちは!

現在、EJBからDBサーバー内のストアドプロシージャを呼び出して
実行させたいのですが、「Connection」の「prepareCall」を
使用する場合にその引数のSQLをどうやって書けばいいのか
わからないで困っています。
一応、登録・更新のSQLなので、データを含んだ形になるのですが、
どなたかご存知の方いらっしゃいましたらご指導ください。

よろしくお願いします。

Aベストアンサー

先の回答が的を得ていたようで良かったです。(^^)
お察しの通りここでの「SP030」はストアドの名称です。このストアドの引数はSP030( in, in, out )とお考え下さい。

con.prepareCall("{call SP030(?,?,?)}");

の?はバインド変数の意味です。なのでコード自体は?のまま記述します。
その下の
para.setString( 1, "0" );
で一番最初の?に入れるものを指定します。一番目なので引数に「1」と書いてあります。次の引数の「"0"」は?に入る値です。
なのでそこが変数でも関数の戻り値でも良いわけです。
そしてそして次の行の
para.setString( 2, "0" );
は二番目の?に「"0"」を入れますと言う意味です。
その次の行
para.registerOutParameter( 3, java.sql.Types.CHAR );
は三番目の?はストアドのパラメータがoutなのでストアドからもらえる値です。
「java.sql.Types.CHAR」はもらえる値がchar型ですよ、と示しているわけです。
そして最後に
para.execute();
でストアドが実行されます。

outの値を取得する場合は実行した後に
Sting val1 = para.getString(3);
と記述すると、変数val1にoutを取得することができます。

うーん、わかりにくい!!(^^;
わかりにくかったらまた根ほり葉ほり聞いて下さい。(笑)

先の回答が的を得ていたようで良かったです。(^^)
お察しの通りここでの「SP030」はストアドの名称です。このストアドの引数はSP030( in, in, out )とお考え下さい。

con.prepareCall("{call SP030(?,?,?)}");

の?はバインド変数の意味です。なのでコード自体は?のまま記述します。
その下の
para.setString( 1, "0" );
で一番最初の?に入れるものを指定します。一番目なので引数に「1」と書いてあります。次の引数の「"0"」は?に入る値です。
なのでそこが変数でも関数の戻り値でも良いわけ...続きを読む

Qoracle9iにJDBC接続が出来ない

oracle9iにJDBCで接続したいのですがI/O例外が出てうまくいきません。
多分、DriverManager.getConnection の引数のURLが間違っているのだと思うのですが。

jdbc:oracle:thin:@<ホスト名>:<リスナのポート番号>:<Oracle SID>

ホスト名・ポート番号・Oracle SID
はどこを見ればわかるのでしょうか?

ちなみに出ているエラーは以下のとうりです。

Exception in thread "main" java.sql.SQLException: I/O例外です。: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:180)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:222)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:335)
at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:361)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:442)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:321)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at JavaDataAccess01.main(JavaDataAccess01.java:13)

何か参考になるHPなどあれば教えてください。
よろしくお願いします。

oracle9iにJDBCで接続したいのですがI/O例外が出てうまくいきません。
多分、DriverManager.getConnection の引数のURLが間違っているのだと思うのですが。

jdbc:oracle:thin:@<ホスト名>:<リスナのポート番号>:<Oracle SID>

ホスト名・ポート番号・Oracle SID
はどこを見ればわかるのでしょうか?

ちなみに出ているエラーは以下のとうりです。

Exception in thread "main" java.sql.SQLException: I/O例外です。: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=12505)(ERROR_STACK...続きを読む

Aベストアンサー

解決済みかもしれませんが。。。
まずクライアントから、sqlplus などでoracle9iに接続できますか?

上記のエラー、何度も出したことがありますが、Oracleのサーバに
アクセスできないときに発生します。

経験上、
1.Oracleのインストールされたサーバが動いているマシン自体が動いてない
2.Oracleのサーバが動いていない
3.リスナーが動いていない
4.クライアントのTNSNames.oraの設定が間違っていてアクセスできない
5.JDBC URLのホスト名が間違っていた
6.JDBC URLのSIDが不正
といったところでしょうか?

個人的には、JDBCへのアクセス部分のコードというより、Oracleのクライアント
からサーバに対してアクセスできていないというのが多いです。

参考になれば。。。


人気Q&Aランキング

おすすめ情報