1. 程式人生 > >oracle儲存過程及自定義函式(儲存函式)初學

oracle儲存過程及自定義函式(儲存函式)初學

1.儲存過程和儲存函式的主要區別

      儲存函式可以通過return返回函式值;儲存函式可以在SQL語句內部呼叫;儲存函式較儲存過程有諸多限制;儲存過程用select語句返回記錄集,儲存函式使用表變數返回記錄集。

2.儲存過程和儲存函式的建立

       儲存過程的建立
 建立儲存過程:
   CREATE OR REPLACE PROCEDURE MYPROCEDURE(PARAM1 IN NUMBER,PARAM2 OUT VARCHAR2)
   AS|IS  //說明部分,可定義變數
   BIGIN
   //可執行部分
   SELECT SALARY INTO  PARAM2 FROM SALARYTABLE WHERE USERS.ID=PARAM1; 
   END
     儲存函式的建立      建立使用FUNCTION 關鍵字,建立方式同上,當只有一個返回值時可使用return返回值,如果返回多個引數時可使用儲存過程返回值得方式,
CREATE [OR REPLACE] FUNCTION MYPROCEDUREFUN(PARAM1 IN NUMBER)
		//返回值型別
		RETURN NUMBER
		AS
		PARAM2 NUMBER(5,2);
		BEGIN
		  SELECT SALARY INTO PARAM2 WHERE SALARYTABLE WHERE USERS.ID=PARAM1;
		  RETURN NVL(PARAM2,0);
		END;

3.儲存函式和儲存過程的呼叫方式

     儲存過程的呼叫 EXEC | EXECUTE 或PLSQL語句     儲存函式的呼叫 AELECT MYPROCEDUREFUN(引數) FROM TABLE

4.JAVA中使用呼叫儲存過程和儲存函式

      呼叫儲存過程
   String SQL="{CALL MYPROCEDURE(?,?)}";
   Connection conn=JDBCUtils.getConnection();
   CallableStatement  call=conn.prepareCall(SQL);
   //對於in引數(第一個引數)
   call.setInt(1,12345);
   //對於out引數(第二個引數)
   call.registerOutParameter(2,oracleTypes.VARCHAR2);
   call.execute();
   //獲取結果
   String PARAM2=call.getString(2);
      呼叫儲存函式 
   String SQL="?={CALL MYPROCEDURE(?)}";
   Connection conn=JDBCUtils.getConnection();
   CallableStatement  call=conn.prepareCall(SQL);
   //對於輸出引數(第一個引數)
    call.registerOutParameter(1,oracleTypes.NUMBER);
   //對於in引數(第二個引數)
   call.setInt(2,12345);
   call.execute();
   //獲取結果
   Double returnVal=call.getDouble(1);

5.儲存過程或儲存函式返回結果集

  返回集合需要使用到PLSQL中的游標和包的相關知識,將在下篇文章中介紹,這裡給出使用方法。   包定義: 
  CREATE [OR REPLACE] PACKAGE MYPACKAGE 
  AS
  //自定義資料型別--引用游標的型別
  TYPE SALCURSOR  IS REF CURSOR;
  PROCEDURE QUERYSALLIST(DNO IN NUMBER, OUTLIST OUT  SALCURSOR);
  END MYPACKAGE;
  包體:
  CREATE [OR REPLACE] PACKAGE BODY MYPACKAGE 
  AS
    //實現儲存過程
    PROCEDURE QUERYSALLIST(DNO IN NUMBER, OUTLIST OUT  SALCURSOR)
	AS
	BEGIN
	//使用之前開啟游標
	OPEN OUTLIST FOR SELECT * FROM SALTABLE WHERE  DEPNO=DNO;
	END [QUERYSALLIST];
  END;
    如果在應用程式中使用包中的儲存過程或儲存函式,需要加上包名。