標籤:
預存程序與儲存函數說明:儲存函數有返回值!預存程序沒有返回值!
指儲存在資料庫中供所有使用者程式調用的子程式叫預存程序、儲存函數。
什麼時候用預存程序/儲存函數
原則:如果只有一個返回值,用儲存函數;否則,就用預存程序。
1.建立預存程序
用CREATE PROCEDURE命令建立預存程序。文法如下:
create [or replace] PROCEDURE 過程名[(參數列表)]
AS
變數聲明
PLSQL子程式體;
1)預存程序入門:
create or replaceprocedure sayHelloasbegin dbms_output.put_line('hello world!');end;
cmd命令列執行程式:
2)給員工漲工資
create or replaceprocedure addSal(eno in number)asbegin update emp2 set sal=sal*1.1 where empno=eno; dbms_output.put_line('漲工資完畢');end;
3)帶有輸出結果的預存程序
create or replaceprocedure queryEmpSal (eno in number,pname out VARCHAR2,psal out number)asbegin select ename ,sal into pname,psal from emp2 where empno=eno;end;
測試上述代碼:
我們通過“從資料庫Scott中斷連線”這句話 可以判斷資料庫已經正常關閉-->因此資料庫已經幫我們自動認可了事務!
2.建立儲存函數
函數(Function)為一命名的儲存程式,可帶參數,並返回一計算值。函數和過程的結構類似,但必須有一個RETURN子句,用於返回函數值。函數說明要指定函數名、結果值的類型,以及參數類型等。
文法如下:
CREATE[OR REPLACE] FUNCTION 函數名(參數列表)
RETURN 函數值類型
AS
變數聲明
PLSQL子程式體;
1)儲存函數入門:
create or replacefunction querySal(eno in number)return number as vsal emp2.sal%type;begin select sal into vsal from emp2 where empno=eno; return vsal;end;
測試上述代碼:
2)帶有輸出參數的儲存函數
create or replacefunction queryFuncEmpSal (eno in number,pname out VARCHAR2,psal out number) return numberasbegin select ename ,sal into pname,psal from emp2 where empno=eno; return 1;end;
================================================================================================
通過jdbc調用預存程序和儲存函數
1)搭建環境
匯入oracle的jar包:E:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib
2)寫工具類JDBCUtils
package cn.itcast.util;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JDBCUtils {private static String jdbcUrl="jdbc:oracle:thin:@localhost:1521:orcl";private static String driverClass="oracle.jdbc.OracleDriver";private static String username="scott";private static String password="169500";/** * 擷取資料庫連接 * */public static Connection getConnection(){try {Class.forName(driverClass);//註冊驅動return DriverManager.getConnection(jdbcUrl, username, password);} catch (Exception e) {throw new RuntimeException();}}/** * 關閉資源 * public */public static void closeResource(Connection conn,Statement state,ResultSet rs){if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn=null;}}if(state!=null){try {state.close();} catch (SQLException e) {e.printStackTrace();}finally{state=null;}}if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs=null;}}}}
2)測試預存程序:
package cn.itcast.test;import java.sql.CallableStatement;import java.sql.Connection;import oracle.jdbc.internal.OracleTypes;import org.junit.Test;import cn.itcast.util.JDBCUtils;public class TestProcedure { Connection con=null; CallableStatement call=null; @Testpublic void test() throws Exception{String sql="{call addSal(?)}";con=JDBCUtils.getConnection();call=con.prepareCall(sql);call.setObject(1, 7369);//設定參數call.execute();//執行//顯示結果JDBCUtils.closeResource(con, call, null);}@Testpublic void test1() throws Exception{String sql="{call queryEmpSal(?,?,?)}";con=JDBCUtils.getConnection();call=con.prepareCall(sql);//設定輸入參數call.setObject(1, 7369);//設定輸出參數call.registerOutParameter(2, OracleTypes.VARCHAR);call.registerOutParameter(3, OracleTypes.NUMBER);call.execute();//執行//顯示結果String name = (String) call.getObject(2);Double value = call.getDouble(3);System.out.println(name+":"+value);JDBCUtils.closeResource(con, call, null);}}
單元測試test1()
3)測試儲存函數-->關於sql的寫法去jdk中的
package cn.itcast.test;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.SQLException;import org.junit.Test;import oracle.jdbc.internal.OracleTypes;import cn.itcast.util.JDBCUtils;public class TestFunction {@Testpublic void test() throws Exception{Connection conn=null;CallableStatement call=null;String sql="{?=call querySal(?)}";conn=JDBCUtils.getConnection();call=conn.prepareCall(sql);call.setObject(2,7934);call.registerOutParameter(1, OracleTypes.NUMBER);//執行結果call.execute();//擷取返回結果Object object = call.getObject(1);System.out.println(object);}}
注意:關於sql的寫法去jdk中的:
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
oracle學習筆記之預存程序與儲存函數