Oracle學習(十二):預存程序/儲存函數

來源:互聯網
上載者:User

標籤:員工   on()   art   cep   stp   沒有   儲存   子程式   tno   

1.知識點

--第一個預存程序/*列印Hello Worldcreate [or replace] PROCEDURE 過程名(參數列表)  AS         PLSQL子程式體;調用預存程序:1. exec sayHelloWorld();2. begin      sayHelloWorld();      sayHelloWorld();   end;   /*/create or replace procedure sayHelloWorld<span style="white-space:pre"></span>--sayHelloWorld為過程名as--declare--變數說明begin  dbms_output.put_line(‘Hello World‘);end;/----------------------------------------------/*給指定的員工漲100的工資,並列印漲前和漲後的薪水create [or replace] PROCEDURE 過程名(參數列表)  --in為輸入參數,out為輸出參數AS         PLSQL子程式體;        SQL> begin  2     raiseSalary(7839);  3     raiseSalary(7566);  4     commit;  5  end;  6  /漲前:7986  漲後:8086漲前:5024.53  漲後:5124.53PL/SQL 過程已成功完畢。        */create or replace procedure raiseSalary(eno in number)<span style="white-space:pre"></span>--帶輸入參數的預存程序as  --變數  psal emp.sal%type;begin  --得到漲前薪水  select sal into psal from emp where empno=eno;    --漲工資  update emp set sal=sal+100 where empno=eno;  --問題:要不要commit??答:不須要,由於整個事務還沒有結束。等調用此預存程序後,再commit  --列印  dbms_output.put_line(‘漲前:‘||psal||‘  漲後:‘||(psal+100));  end;/-------------------------------------------------------------------/*查詢某個員工的年度營收CREATE [OR REPLACE] FUNCTION 函數名(參數列表)  RETURN  函數實值型別ASPLSQL子程式體;*/create or replace function queryEmpIncome(eno in number)return number<span style="white-space:pre"></span>as  --變數  psal emp.sal%type;  pcomm emp.comm%type;begin  select sal,comm into psal,pcomm from emp where empno=eno;  return psal*12+nvl(pcomm,0);end;/-----------------------------------------------------------------------OUT參數/*查詢某個員工的姓名 月薪 職位*/create or replace procedure queryEmpInfo(eno in number,                                         pename out varchar2,                                         psal   out number,                                         pjob   out varchar2)asbegin  select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;end;/----------------------------------------------------------------------查詢某個部門中全部員工的全部資訊--1.建立一個包:MYPACKAGE --2.在該包中定義一個自己定義類型:empcursor 類型為遊標,一個預存程序:queryempCREATE OR REPLACE PACKAGE MYPACKAGE AS     type empcursor is ref cursor;--empcursor是一個自己定義類型:引用cursor的類型作為empcursor的類型  procedure queryEmpList(dno in number,empList out empcursor);END MYPACKAGE;==============================================CREATE OR REPLACEPACKAGE BODY MYPACKAGE AS  procedure queryEmpList(dno in number,empList out empcursor) AS  BEGIN            open empList for select * from emp where deptno=dno;      END queryEmpList;END MYPACKAGE;------------------------------------------------------------------


2.JAVA程式中測試預存程序/儲存函數
package demo.util;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import oracle.jdbc.OracleCallableStatement;import oracle.jdbc.OracleTypes;import org.junit.Test;/* *  * 效能: * Statement < PreparedStatement  < CallableStatement * PreparedStatement:先行編譯SQL語句。啟動並執行時候告訴參數。至少編輯一次 * CallableStatement:完畢對預存程序/儲存函數的調用,沒有編譯過程,直接調用 */public class TestOracle {/* * create or replaceprocedure queryEmpInfo(eno in number,                                         pename out varchar2,                                         psal   out number,                                         pjob   out varchar2) */@Testpublic void testProcedure(){//調用預存程序//{call <procedure-name>[(<arg1>,<arg2>, ...)]}String sql = "{call queryEmpInfo(?,?,?

,?)}";Connection conn=null;CallableStatement call = null;try{conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);//賦值call.setInt(1, 7839);//對於out參數。申明call.registerOutParameter(2, OracleTypes.VARCHAR);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);System.out.println(sal);System.out.println(job);}catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}/* * create or replacefunction queryEmpIncome(eno in number)return number */@Testpublic void testFunction(){//儲存函數範例//{?

= call <procedure-name>[(<arg1>,<arg2>, ...)]}String sql = "{?

=call queryEmpIncome(?

)}";Connection conn = null;CallableStatement call = null;try{conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);call.registerOutParameter(1, OracleTypes.NUMBER);call.setInt(2, 7839);//運行call.execute();//取出年度營收double income = call.getDouble(1);System.out.println(income);}catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}/* * 問題: * 1. 游標是否被關?:是。結構集關掉後游標就關掉了。

* 2. 能否在MYSQL上運行?:不能 */@Testpublic void testCursor(){String sql = "{call MYPACKAGE.queryEmpList(?,?

)}";Connection conn = null;CallableStatement call = null;ResultSet rs =null;try {conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);call.setInt(1, 10);call.registerOutParameter(2, OracleTypes.CURSOR);//運行call.execute();//取出集合rs = ((OracleCallableStatement)call).getCursor(2);while(rs.next()){String name = rs.getString("ename");String job = rs.getString("job");System.out.println(name+"的職位是"+job);}} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, rs);}}}


3.用到的JDBC類

package demo.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 driver="oracle.jdbc.OracleDriver";private static String url="jdbc:oracle:thin:@localhost:1521:orcl";private static String user="scott";private static String password="tiger";static{try {Class.forName(driver);} catch (ClassNotFoundException e) {throw new ExceptionInInitializerError(e);}}public static Connection getConnection(){try {return DriverManager.getConnection(url, user, password);} catch (SQLException e) {e.printStackTrace();}return null;}/* * 運行java程式 * java -Xms100M -Xmx200M HelloWorld */public static void release(Connection conn,Statement stmt,ResultSet rs){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs=null;//記憶體回收:能否夠通過代碼幹預記憶體回收?}}if(stmt!=null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}finally{rs=null;//記憶體回收:能否夠通過代碼幹預記憶體回收?}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{rs=null;//記憶體回收:能否夠通過代碼幹預記憶體回收?}}}}



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.