ストアド・プロシージャの構文とJavaプログラムの呼び出し方法を簡単に記録

13867 ワード

ストレージ・プロシージャ
まず、ストレージ・プロシージャのテストのための簡単なテーブルを作成します.

create table
xuesheng(id
integer, xing_ming varchar2(25), yu_wen number, shu_xue number);

insert into xuesheng values(1,'zhangsan',80,90)
insert into xuesheng values(2,'lisi',85,87)


1)戻り値のないストアド・プロシージャ

create or replace procedure xs_proc_no is
begin
 
insert into xuesheng values (3, 'wangwu', 90, 90);
 
commit;
end xs_proc_no;


2)単一のデータ値が返されるストアド・プロシージャ

create or replace procedure xs_proc(temp_name in varchar2,
                                   temp_num  out
number) is
 num_1
number;
 num_2
number;
begin
 
select yu_wen, shu_xue
   
into num_1, num_2
   
from xuesheng
 
where xing_ming = temp_name;
 
--dbms_output.put_line(num_1 + num_2);
 temp_num := num_1 + num_2;
end;


このうち,以上の2つはsql serverとほぼ同様であるが,データセットを返す場合,上記の方法では我々の要求を満たすことができない.Oracleでは、ref cursorを使用してデータセットを返すのが一般的です.サンプルコードは次のとおりです.
3)戻り値のあるストアド・プロシージャ(リスト戻り)
まず、私たち自身のバッグを作ります.パッケージ内のカスタムref cursorを定義します

create or replace package mypackage as
 type my_cursor
is ref cursor;
end mypackage;


ref cursorを定義したら、私たちのプログラムコードを書くことができます.

create or replace procedure xs_proc_list(shuxue   in number,
                                        p_cursor out mypackage.my_cursor)
is
begin
 
open p_cursor for
   
select * from xuesheng where shu_xue > shuxue;
end xs_proc_list;


二、プログラム呼び出し
このセクションではjava言語を使用してストレージ・プロシージャを呼び出します.ここで重要なのは、CallableStatementというオブジェクトを使用することです.コードは次のとおりです.String oracleDriverName = "oracle.jdbc.driver.OracleDriver" ;
           // Test Oracle          String oracleUrlToConnect = "jdbc:oracle:thin:@127.0.0.1 :1521:orcl" ;          Connection myConnection = null ;          try   {              Class.forName(oracleDriverName);          } catch   (ClassNotFoundException ex) {              ex.printStackTrace();          }          try   {              myConnection = DriverManager.getConnection(oracleUrlToConnect,                      "xxxx" , "xxxx" ); //
           } catch   (Exception ex) {              ex.printStackTrace();          }          try   {                             CallableStatement proc= null ;              proc=myConnection.prepareCall( "{call xs_proc(?,?)}" );              proc.setString( 1 , "zhangsan" );              proc.registerOutParameter( 2 , Types.NUMERIC);              proc.execute();              String teststring=proc.getString( 2 );              System.out.println(teststring);
           } catch   (Exception ex) {              ex.printStackTrace();          }
リストから値を返すストレージ・プロシージャについては、上記のコードで簡単に変更します.次のように

CallableStatement proc=null;
           proc
=myConnection.prepareCall("{call getdcsj(?,?,?,?,?)}");
           proc.setString(
1, strDate);
           proc.setString(
2, jzbh);
           proc.registerOutParameter(
3, Types.NUMERIC);
           proc.registerOutParameter(
4, OracleTypes.CURSOR);
           proc.registerOutParameter(
5, OracleTypes.CURSOR);
           proc.execute();
           ResultSet rs
=null;
           
int total_number=proc.getInt(3);
           rs
=(ResultSet)proc.getObject(4);


上記のストレージ・プロシージャの変更が完了しました.また、複雑なプロジェクトの例として、データの間隔が10分未満で、100個以上連続しているデータをクエリーします.すなわち、上記コードによって呼び出されるgetdcsjストレージプロセスcreate   or   replace   procedure   getDcsj(var_flag     in   varchar2,                                      var_jzbh     in   varchar2,                                      number_total out   number,                                      var_cursor_a out   mypackage.my_cursor,                                      var_cursor_b out   mypackage.my_cursor) is    total number;    cursor   cur is      select   sj, flag        from   d_dcsj       where   jzbh = var_jzbh       order   by   sj desc         for   update ;    last_time date ; begin    for   cur1 in   cur loop      if last_time is   null   or   cur1.sj >= last_time - 10 / 60 / 24 then        update   d_dcsj set   flag = var_flag where   current   of   cur;        last_time := cur1.sj;      else        select   count (*) into   total from   d_dcsj where   flag = var_flag;        dbms_output.put_line(total);        if total < 100 then          update   d_dcsj set   flag = null   where   flag = var_flag;          last_time := null ;          update   d_dcsj set   flag = var_flag where   current   of   cur;        else          open   var_cursor_a for            select   *              from   d_dcsj             where   flag = var_flag               and   jzbh = var_jzbh               and   zh = 'A'             order   by   sj desc ;          number_total := total;          open   var_cursor_b for            select   *              from   d_dcsj             where   flag = var_flag               and   jzbh = var_jzbh               and   zh = 'B'             order   by   sj desc ;          number_total := total;          exit;        end   if;      end   if;    end   loop;    select   count (*) into   total from   d_dcsj where   flag = var_flag;    dbms_output.put_line(total);    if total < 100 then      open   var_cursor_a for        select   * from   d_dcsj where   zh = 'C' ;      open   var_cursor_b for        select   * from   d_dcsj where   zh = 'C' ;    else      open   var_cursor_a for        select   *          from   d_dcsj         where   flag = var_flag           and   jzbh = var_jzbh           and   zh = 'A'         order   by   sj desc ;      number_total := total;      open   var_cursor_b for        select   *          from   d_dcsj         where   flag = var_flag           and   jzbh = var_jzbh           and   zh = 'B'         order   by   sj desc ;      number_total := total;    end   if;    commit ; end ; /