Oracleのストアドプロシージャ

ストアドプロシージャの作成

CREATE PROCEDURE(CREATE OR REPLACE PROCEDURE)を使用する。
例)userqueries の sqlstatement に値(sqlVal)を追加し、query_id を出力として返す。

CREATE OR REPLACE PROCEDURE add_sql_query(sqlVal IN VARCHAR2,id OUT NUMBER) IS
BEGIN
    INSERT INTO userqueries (sqlstatement) VALUES (sqlVal)
    RETURNING userqueries.query_id INTO id;
END;
.
/



javaからのストアドプロシージャの呼び出し

javaプログラム中でストアドプロシージャを呼び出す。

例)PROCEDURE add_sql_query(sqlVal IN VARCHAR2,id OUT NUMBER)を呼び出し、実行する。

// Oracle Thin Driverを用いて接続
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@[ホスト名]:[ポート番号]/[接続するDBのSID]", "[ユーザー名]", "[パスワード]");
// 以下のように指定しなければ動かない場合もある(原因不明)。
//Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@[ホスト名]:[ポート番号]:[接続するDBのSID]", "[ユーザー名]", "[パスワード]");

// ストアドプロシージャの呼び出し
CallableStatement cstmt = connection.prepareCall(add_sql_query);

// 入力パラメーターの設定
cstmt.setString(1,usersql);
// 出力パラメーターの登録
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);

// 実行
cstmt.executeUpdate();
// 出力パラメーターを受け取る
int id = cstmt.getInt(2);

cstmt.close();



ストアドプロシージャを調べる

静的データディクショナリALL_SOURCE、DBA_SOURCE、USER_SOURCEを調べる。

ALL_SOURCE
ログインしているユーザーがアクセスできる全てのストアド・オブジェクトのテキストソース。
DBA_SOURCE
データベース内のすべてのストアド・オブジェクトのテキストソース。
USER_SOURCE
ログインしているユーザーが所有する全てのストアド・オブジェクトのテキストソース。

主要項目一覧
列名説明
OWNERオブジェクトの所有者
NAMEオブジェクト名
TYPEオブジェクト型: FUNCTION, JAVA SOURCE, PACKAGE, PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, TYPE BODY
LINEこのソースの行番号
TEXTストアド・オブジェクトのテキスト・ソース

DESC user_source;
Name                Null?    Type
------------------- -------- ------------------
NAME                         VARCHAR2(30)
TYPE                         VARCHAR2(12)
LINE                         NUMBER
TEXT                         VARCHAR2(4000)

例)ストアドプロシージャのテキスト・ソースを表示する。

SELECT text FROM user_source WHERE name = 'add_sql_query' ORDER BY LINE;