Oracle格納プロセスと呼び出し


Oracle格納プロセスシンタックス
Oracleの格納過程文法は以下の通りである。

create procedure       (   ) 
is
             、  、  、              、  
begin
        
end; 
(2)パラメータ付き格納プロセスシンタックス:

create procedure       (   ) (  1     ,  2     ,...,  n     )
is
             、  、  、              、  
begin
        
end; 
(3)入力・出力パラメータ付きの記憶手順文法:

create procedure       (   ) (  1 in( out)     ,  2 in( out)     ,...,  n in( out)     )
is
             、  、  、              、  
begin
        
end;
上記の構文で保存プロセスを作成すると、データベースに同名の保存プロセスがあります。このようにOracleはボックスを弾き間違えて名前が既存のオブジェクトに使われていると言います。解決方法は2つあります。
方法1:プロセス名を変更します。
方法2:最初のcreate procedureの間にor replaceキーワードを追加して、例えば:create or replace procedureはプロセス名を格納します。しかし、この方法は使用を勧めません。この方法は前の名前の記憶プロセスを今書いているこれに置き換えます。
プロシージャケース1:パラメータなしのプロシージャ

create replace procedure procedure_1
is
begin
    dbms_output.put_line('procedure_1.......');
end;
プロシージャケース2:パラメータ付き記憶プロセス

create procedure procedure_2(v_i number,v_j number)
is
    v_m number(5);
begin
    dbms_output.put_line('procedure_2.......');
    v_m := v_i + v_j;
    dbms_output.put_line(v_i||' + '||v_j||' = '||v_m);
end;
プロシージャケース3:入力、出力パラメータの記憶プロセス
格納プロセスのパラメータは、入力パラメータと出力パラメータに分けられます。
パラメータを入力します。パラメータを入力すると、変数名とデータタイプの間にinが加算されます。このパラメータは入力パラメータです。
出力パラメータ:出力パラメータは、一般的に変数名とデータタイプの間にoutを入れて表します。この変数は出力パラメータです。
nとoutを書かないと、デフォルトは入力パラメータです。

create procedure procedure_3(v_i in number,v_j in number ,v_m out number)
is
begin
    dbms_output.put_line('procedure_3.......');
    v_m:=v_i - v_j;
    dbms_output.put_line(v_i||' - '||v_j||' = '||v_m);
end;
PL/SQLブロックに格納プロセスを呼び出します。
以下では、上の3つの記憶プロセスを呼び出します。

declare
    v_param1 number(5):=2;
    v_param2 number(5):=8;
    v_result number(5);
begin
    --            
    procedure_1(); 
    --            
    procedure_2(v_param1,v_param2); 
    --            
    procedure_3(v_param1,v_param2,v_result);
    dbms_output.put_line(v_result);
end;
/*    :*/
procedure_1.......
procedure_2.......
2 + 8 = 10
procedure_3.......
2 - 8 = -6
10
java起動保存プロセス
実例一:java呼び出しは、戻り値のない格納プロセスを呼び出します。
要求:データベースempのようなテーブルを作成して、6666番号を挿入します。名前は張三です。職位はMANAGERの記録です。

/*    */
create procedure procedure_4(v_empno emp.empno%type,v_ename emp.ename%type,v_job emp.job%type )
is
begin
    insert into emp (empno,ename,job) values (v_empno,v_ename,v_job);
end;

//java      
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  //java      
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott", "tiger");
    cs=conn.prepareCall("{call procedure_4(?,?,?)}");
    //       
    cs.setInt(1, 6666);
    cs.setString(2, "  ");
    cs.setString(3, "MANAGER");
    cs.execute();//  
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//    
  }  
}
//          emp         6666,     ,   MANAGER   
実例二:Javaは単一列の行に戻る格納プロセスを呼び出します。
要求:従業員番号に基づいて従業員の名前を検索する格納プロセスを作成し、javaでこの保存プロセスを呼び出す。

/*    */
create procedure procedure_5(v_empno in emp.empno%type,v_ename out emp.ename%type)
is
begin
    select ename into v_ename from emp where empno=v_empno;
end;

//java      
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_5(?,?)}");
    cs.setInt(1, 6666);//       
    /*           
      :oracle.jdbc.OracleTypes.         
                varchar,   oracle.jdbc.OracleTypes.VARCHAR*/
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
    cs.execute();//  
    //        ,          ?       ,         2   ,               ,   cs.getString(2)
    String a=cs.getString(2);
    System.out.println("    :"+a);
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//    
  }  
}
 
/*    ,     :*/
  :    :  
実例3:javaは単一の行の複数の列に戻る格納プロセスを呼び出します。
要求:従業員番号に基づいて従業員の名前、職位と給料を検索する保存過程を編纂し、javaでこの保存過程を呼び出します。

/*    */
create procedure procedure_6(v_empno in emp.empno%type,v_ename out emp.ename%type,v_job out emp.job%type,v_sal out emp.sal%type)
is
begin
    select ename,job,sal into v_ename,v_job,v_sal from emp where empno=v_empno;
end;

//java      
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_6(?,?,?,?)}");
    cs.setInt(1, 7788);
    //           ,  :       
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
    cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);
    cs.registerOutParameter(4, oracle.jdbc.OracleTypes.DOUBLE);
    cs.execute();//  
    //     
    String ename=cs.getString(2);//    
    String job=cs.getString(3);//    
    double sal=cs.getDouble(4);//    
    System.out.println("     7788    :"+ename+"    :"+job+"    :"+sal);
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//    
  }
}
/*    ,     :*/
     7788    :SCOTT    :ANALYST    :3000.0
実例4:javaは、複数行の列に戻る(リストに戻る)格納プロセスを呼び出します。
要求:部門番号に基づいて部門の従業員情報を検索するための保存プロセスを作成し、javaでこの保存プロセスを呼び出す。

/*    */
create package my_package as
type emp_cursor is ref cursor;
end my_package;
/*    */
create procedure procedure_7(v_deptno in emp.deptno%type,emp_cursor out my_package.emp_cursor)
is
begin
    open emp_cursor for select * from emp where deptno=v_deptno;
end;
//java      
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_7(?,?)}");
    cs.setInt(1, 20);//       
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR );//           
    cs.execute();
    rs=(ResultSet) cs.getObject(2);//        
    while(rs.next()){
      //             ,     emp   5  hiredate,     Date,     5       rs.getDate(5)
      System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getDate(5));
    }
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//    
  }  
}
//*以下は20番部門の全従業員の情報です。ここでは番号と名前と入社時間だけプリントしました。
運転結果、コンソール印刷:*/

7369 SMITH 1980-12-17
7566 JONES 1981-04-02
7788 SCOTT 1987-04-19
7876 ADAMS 1987-05-23
7902 FORD 1981-12-03 
これは上のjavaが起動して、プログラムコードの中でリソースを閉じる方法のコードです。

public static void closeResource(Connection conn,CallableStatement cs,ResultSet rs){
    if(rs!=null){
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if(cs!=null){
      try {
        cs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if(conn!=null){
      try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
最後にアプリケーション、改ページの保存プロセスを与えます。
改ページ保存プロセス:

/*    */
create package page_package as
type page_cursor is ref cursor;
end page_package;
/*    */
create procedure pro_paging (
    v_page_size in number,--       
    v_page_count out number,--   
    v_current_page in number,--   
    v_total_count out number,--     
    emp_cursor out page_package.page_cursor--          
    )
is
    v_begin number(5):=v_page_size*(v_current_page-1)+1;--      
    v_end number(5):=v_page_size*v_current_page;--      
    v_sql varchar2(1000):='select empno,ename from
       (select a.empno,a.ename,rownum rn from 
           (select empno,ename from emp) a 
       where rownum<='|| v_end ||') b 
    where b.rn>='||v_begin;
    /*        ,                   ,         empno,ename,             
    v_sql varchar2(1000):=\'select * from
       (select a.*,rownum rn from 
           (select empno,ename from emp) a 
       where rownum<=\'|| v_end ||\') b 
    where b.rn>='||v_begin;*/
    v_ename varchar2(10);
    v_empno number(4);
begin
    open emp_cursor for v_sql;
    loop
     fetch emp_cursor into v_empno,v_ename;
     exit when emp_cursor%notfound;
     dbms_output.put_line(v_empno||' '||v_ename);
    end loop;
    v_sql:='select count(empno) from emp';
    execute immediate v_sql into v_total_count;
    if(mod(v_total_count,v_page_size)=0) then
       v_page_count:=v_total_count/v_page_size;
    else
       v_page_count:=trunc(v_total_count/v_page_size)+1;
    end if;
    dbms_output.put_line('  '||v_total_count||'    ');
    dbms_output.put_line('  '||v_page_count||'  ');
    dbms_output.put_line('   : '||v_current_page);
    dbms_output.put_line('     '||v_page_size||'  ');
end;
Java呼び出しは、上のjava呼び出し格納プロセスの例と同じです。ここは便利のために、直接pl/sqlで呼び出します。

/*        */
declare
   v_page_count number(5);
   v_cursor page_package.page_cursor;
   v_total_count number(5);
begin
   dbms_output.put_line('     。。。。。。。。。');
   pro_paging(5,--    5 
   v_page_count,--   
   1,--   
   v_total_count,--     
   v_cursor--  
   );
   dbms_output.put_line('--------------------------');
   dbms_output.put_line('     。。。。。。。。。');
   --       
   pro_paging(5,--    5 
   v_page_count,--   
   2,--   
   v_total_count,--     
   v_cursor--  
   );
end;
/*    :*/
     。。。。。。。。。
6666   
20 empSu2
19 empSave2
7369 SMITH
7499 ALLEN
  17    
  4  
   : 1
     5  
--------------------------
     。。。。。。。。。
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
  17    
  4  
   : 2
     5  
以上は小编が皆さんに绍介したOracleメモリの过程と呼び出しです。皆さんに助けてほしいです。もし何か疑问があれば、メッセージをください。小编はすぐに皆さんに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。