Oracleストアド・プロシージャ1


ストレージ・プロシージャは、データベース・サーバ側のプログラムで、2つのタイプがあります.SELECTクエリーと同様に、データを取得し、取得したデータをデータセットとして顧客に返すことができる.もう1つのINSERTクエリまたはDELETEクエリと同様に、データを返さずにアクションを実行します.同じストレージ・プロシージャがデータを返したり、アクションを実行したりできるサーバもあります.
サーバ上のストレージ・プロシージャを実行するには、パラメータを渡すことがよくあります.これらのパラメータには、次の4つのタイプがあります.
1つ目は入力パラメータと呼ばれ、クライアント・プログラムによってストレージ・プロシージャに値が渡されます.
2つ目は出力パラメータと呼ばれ、ストレージ・プロシージャによってクライアント・プログラムに結果を返します.
3つ目は、入力/出力パラメータと呼ばれ、クライアント・プログラムからストレージ・プロシージャに値を渡すか、ストレージ・プロシージャからクライアント・プログラムに結果を返すことができます.
4つ目はステータスパラメータと呼ばれ、ストレージ・プロシージャによってクライアント・プログラムにエラー情報を返す.
説明するのは、すべてのサーバが上記の4種類のパラメータをサポートしているわけではありません.たとえば、InterBaseはステータスパラメータをサポートしていません.
Oracleストアド・プロシージャには、プロシージャ宣言、プロシージャ本体、プロシージャ例外の3つのセクションがあります.
1つの簡単な例は、基本的なストレージ・プロシージャの基本的な使用法を説明する.

create or replace procedure proc_test(
       p_id in number, 
       p_info out varchar) 
is
       v_row users%rowtype;
       cursor v_cur is select * from users;
begin
       if p_id > 0 then
          select * into v_row from users where id = p_id; 
          p_info := v_row.username||'='||v_row.name;        
       else
          open v_cur;
          loop
               fetch v_cur into v_row;
               exit when v_cur%notfound;
               if p_info is null then
                  p_info := v_row.username||'='||v_row.name;
               else
                  p_info := p_info||','||v_row.username||'='||v_row.name;
               end if;
          end loop;
          close v_cur;         
       end if;                         
exception
      when too_many_rows then
      DBMS_OUTPUT.PUT_LINE('     1 ');
      when others then
      DBMS_OUTPUT.PUT_LINE(' RUNBYPARMETERS     !');
end;

PL/SQLでストレージ・プロシージャを呼び出すには、次のようにします.

-- Test statements here
declare 
  v_id number := 0;
  v_info varchar2(4000); 
begin 
  proc_test(v_id, v_info);
  DBMS_OUTPUT.PUT_LINE(v_info);
end;

JAVAでのストレージ・プロシージャの呼び出しは次のとおりです.

package tf;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;

public class TestProc {
	private static String sDriver = "oracle.jdbc.driver.OracleDriver";
	private static String sUrl = "jdbc:oracle:thin:@tf:1521:orcl";
	private static Connection conn;
	private static CallableStatement cs;

	public static void main(String[] args) {
		try {
			Class.forName(sDriver);
			conn = DriverManager.getConnection(sUrl, "test", "123");
			cs = conn.prepareCall("{ call proc_test(?,?) }");
			cs.setInt(1, 0);
			cs.registerOutParameter(2, Types.VARCHAR);
			cs.execute();
			String result = cs.getString(2);
			System.out.println("     :" + result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}