標籤:
認識預存程序和函數
預存程序和函數也是一種PL/SQL塊,是存入資料庫的PL/SQL塊。但預存程序和函數不同於已經介紹過的PL/SQL程式,我們通常把PL/SQL程式稱為無名塊,而預存程序和函數是以命名的方式儲存於資料庫中的。和PL/SQL程式相比,預存程序有很多優點,具體歸納如下:
* 預存程序和函數以命名的資料庫物件形式儲存於資料庫當中。儲存在資料庫中的優點是很明顯的,因為代碼不儲存在本地,使用者可以在任何客戶機上登入到資料庫,並調用或修改代碼。
* 預存程序和函數可由資料庫提供安全保證,要想使用預存程序和函數,需要有預存程序和函數的所有者的授權,只有被授權的使用者或建立者本身才能執行預存程序或調用函數。
* 預存程序和函數的資訊是寫入資料字典的,所以預存程序可以看作是一個公用模組,使用者編寫的PL/SQL程式或其他預存程序都可以調用它(但預存程序和函數不能調用PL/SQL程式)。一個重複使用的功能,可以設計成為預存程序,比如:顯示一張工資統計表,可以設計成為預存程序;一個經常調用的計算,可以設計成為儲存函數;根據僱員編號返回僱員的姓名,可以設計成儲存函數。
* 像其他進階語言的過程和函數一樣,可以傳遞參數給預存程序或函數,參數的傳遞也有多種方式。預存程序可以有返回值,也可以沒有返回值,預存程序的返回值必須通過參數帶回;函數有一定的資料類型,像其他的標準函數一樣,我們可以通過對函數名的調用返回函數值。
預存程序和函數需要進行編譯,以排除語法錯誤,只有編譯通過才能調用。
首先得有表盒資料,那麼第一步就是建立表盒插入資料:
SQL> create table emp 2 (empno number, 3 ename varchar2(10), 4 sal number, 5 job varchar2(100) 6 ); Table created SQL> insert into emp values(1,'王一',10000,'軟體工程師'); 1 row inserted SQL> insert into emp values(2,'王二',8000,'攝影師'); 1 row inserted SQL> select * from emp; EMPNO ENAME SAL JOB---------- ---------- ---------- -------------------------------------------------------------------------------- 1 王一 10000 軟體工程師 2 王二 8000 攝影師 SQL>
現在叫我們查詢某個員工姓名,月薪和職位,那麼我們建立一個預存程序如下:
--out參數:查詢某個員工姓名,月薪和職位/* 思考: 1、查詢某個員工的所有資訊-->out參數太多? 2、查詢某個部門中所有員工的所有資訊-->out中返回集合?*/--刪除預存程序create or replace procedure queryempincome1(eno in number, pename out varchar2, psal out number, pjob out varchar2)as begin --得到該員工的姓名、月薪和職位 select ename,sal,job into pename,psal,pjob from emp where empno=eno; end;/
然後我們在eclipse裡面編寫Java代碼連結oracle資料庫和訪問預存程序,在控制台輸出指定id的使用者的基本資料:
package cn.edu.jdbc;import java.sql.CallableStatement;import java.sql.Connection;import oracle.jdbc.OracleTypes;import org.junit.Test;/** * create or replace procedure queryempinform(eno in number, pename out varchar2, psal out number, pjob out varchar2) * @author wf * */public class TestProcedure {@Testpublic void testProcedure(){//{call <procedure-name[(<arg1>,<arg2>,<arh3>...)]>}String sql = "{call queryempincome1(?,?,?,?)}";Connection connection = null;CallableStatement call = null;try {//得到一個串連connection = JDBCUtils.getConnection();//通過串連建立輸出statementcall = connection.prepareCall(sql);//對於in(輸入)參數,要賦值call.setInt(1, 2);//為第一個預存程序的參數賦值為1表示查詢編號為1的員工資訊//對於out(輸出),需要申明//call.registerOutParameter(2, sqlType);call.registerOutParameter(2, OracleTypes.VARCHAR);//指定oracle的輸出參數類型call.registerOutParameter(3, OracleTypes.NUMBER);call.registerOutParameter(4, OracleTypes.VARCHAR);//執行調用call.execute();//取出結果String name = call.getString(2);Double sal = call.getDouble(3);String job = call.getString(4);System.out.println("姓名:"+name+"\t"+"薪水:"+sal+"\t"+"工作:"+job);} catch (Exception e) {e.printStackTrace();}}}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
oracle預存程序--在應用程式中訪問預存程序程式完整舉例