oracle學習筆記之預存程序與儲存函數

來源:互聯網
上載者:User

標籤:

預存程序與儲存函數說明:儲存函數有返回值!預存程序沒有返回值!

指儲存在資料庫中供所有使用者程式調用的子程式叫預存程序、儲存函數。
什麼時候用預存程序/儲存函數
原則:如果只有一個返回值,用儲存函數;否則,就用預存程序。

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學習筆記之預存程序與儲存函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.