Oracle学习:存储过程/存储函数

来源:互联网 发布:长沙少儿编程培训机构 编辑:程序博客网 时间:2024/06/17 23:07

1.知识点

[sql] view plain copy
  1. --第一个存储过程  
  2. /*  
  3. 打印Hello World  
  4. create [or replacePROCEDURE 过程名(参数列表)    
  5. AS   
  6.         PLSQL子程序体;  
  7. 调用存储过程:  
  8. 1. exec sayHelloWorld();  
  9. 2. begin  
  10.       sayHelloWorld();  
  11.       sayHelloWorld();  
  12.    end;  
  13.    /  
  14. */  
  15. create or replace procedure sayHelloWorld<span style="white-space:pre">   </span>--sayHelloWorld为过程名  
  16. as  
  17. --declare  
  18. --变量说明  
  19. begin  
  20.   dbms_output.put_line('Hello World');  
  21. end;  
  22. /  
  23. ----------------------------------------------  
  24. /*  
  25. 给指定的员工涨100的工资,并打印涨前和涨后的薪水  
  26.   
  27. create [or replacePROCEDURE 过程名(参数列表)  --in为输入参数,out为输出参数  
  28. AS   
  29.         PLSQL子程序体;  
  30.           
  31. SQL> begin  
  32.   2     raiseSalary(7839);  
  33.   3     raiseSalary(7566);  
  34.   4     commit;  
  35.   5  end;  
  36.   6  /  
  37. 涨前:7986  涨后:8086  
  38. 涨前:5024.53  涨后:5124.53  
  39.   
  40. PL/SQL 过程已成功完成。          
  41. */  
  42. create or replace procedure raiseSalary(eno in number)<span style="white-space:pre">  </span>--带输入参数的存储过程  
  43. as  
  44.   --变量  
  45.   psal emp.sal%type;  
  46. begin  
  47.   --得到涨前薪水  
  48.   select sal into psal from emp where empno=eno;  
  49.     
  50.   --涨工资  
  51.   update emp set sal=sal+100 where empno=eno;  
  52.   --问题:要不要commit??答:不需要,因为整个事务还没有结束,等调用此存储过程后,再commit  
  53.   
  54.   --打印  
  55.   dbms_output.put_line('涨前:'||psal||'  涨后:'||(psal+100));  
  56.     
  57. end;  
  58. /  
  59. -------------------------------------------------------------------  
  60. /*  
  61. 查询某个员工的年收入  
  62.   
  63. CREATE [OR REPLACEFUNCTION 函数名(参数列表)   
  64.  RETURN  函数值类型  
  65. AS  
  66. PLSQL子程序体;  
  67.   
  68. */  
  69. create or replace function queryEmpIncome(eno in number)  
  70. return number<span style="white-space:pre">   </span>  
  71. as  
  72.   --变量  
  73.   psal emp.sal%type;  
  74.   pcomm emp.comm%type;  
  75. begin  
  76.   select sal,comm into psal,pcomm from emp where empno=eno;  
  77.   return psal*12+nvl(pcomm,0);  
  78. end;  
  79. /  
  80. ---------------------------------------------------------------------  
  81. --OUT参数  
  82. /*  
  83. 查询某个员工的姓名 月薪 职位  
  84.   
  85. */  
  86. create or replace procedure queryEmpInfo(eno in number,  
  87.                                          pename out varchar2,  
  88.                                          psal   out number,  
  89.                                          pjob   out varchar2)  
  90. as  
  91. begin  
  92.   select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;  
  93.   
  94. end;  
  95. /  
  96. --------------------------------------------------------------------  
  97. --查询某个部门中所有员工的所有信息  
  98.   
  99. --1.创建一个包:MYPACKAGE   
  100. --2.在该包中定义一个自定义类型:empcursor 类型为游标,一个存储过程:queryemp  
  101.   
  102. CREATE OR REPLACE   
  103. PACKAGE MYPACKAGE AS   
  104.     
  105.   type empcursor is ref cursor--empcursor是一个自定义类型:引用cursor的类型作为empcursor的类型  
  106.   procedure queryEmpList(dno in number,empList out empcursor);    
  107.   
  108. END MYPACKAGE;  
  109. ==============================================  
  110. CREATE OR REPLACE  
  111. PACKAGE BODY MYPACKAGE AS  
  112.   
  113.   procedure queryEmpList(dno in number,empList out empcursor) AS  
  114.   BEGIN  
  115.         
  116.       open empList for select * from emp where deptno=dno;  
  117.       
  118.   END queryEmpList;  
  119.   
  120. END MYPACKAGE;  
  121.   
  122. ------------------------------------------------------------------  


2.JAVA程序中测试存储过程/存储函数
[java] view plain copy
  1. package demo.util;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5. import java.sql.ResultSet;  
  6.   
  7. import oracle.jdbc.OracleCallableStatement;  
  8. import oracle.jdbc.OracleTypes;  
  9.   
  10. import org.junit.Test;  
  11.   
  12. /* 
  13.  *  
  14.  * 性能: 
  15.  * Statement < PreparedStatement  < CallableStatement 
  16.  * PreparedStatement:预编译SQL语句,执行的时候告诉参数,至少编辑一次 
  17.  * CallableStatement:完成对存储过程/存储函数的调用,没有编译过程,直接调用 
  18.  */  
  19. public class TestOracle {  
  20.       
  21.     /* 
  22.      * create or replace 
  23. procedure queryEmpInfo(eno in number, 
  24.                                          pename out varchar2, 
  25.                                          psal   out number, 
  26.                                          pjob   out varchar2) 
  27.      */  
  28.     @Test  
  29.     public void testProcedure(){  
  30.         //调用存储过程  
  31.         //{call <procedure-name>[(<arg1>,<arg2>, ...)]}  
  32.         String sql = "{call queryEmpInfo(?,?,?,?)}";  
  33.         Connection conn=null;  
  34.         CallableStatement call = null;  
  35.         try{  
  36.             conn = JDBCUtils.getConnection();  
  37.             call = conn.prepareCall(sql);  
  38.             //赋值  
  39.             call.setInt(17839);  
  40.             //对于out参数,申明  
  41.             call.registerOutParameter(2, OracleTypes.VARCHAR);  
  42.             call.registerOutParameter(3, OracleTypes.NUMBER);  
  43.             call.registerOutParameter(4, OracleTypes.VARCHAR);  
  44.               
  45.             //调用  
  46.             call.execute();  
  47.               
  48.             //取出结果  
  49.             String name = call.getString(2);  
  50.             double sal  = call.getDouble(3);  
  51.             String job = call.getString(4);  
  52.             System.out.println(name);  
  53.             System.out.println(sal);  
  54.             System.out.println(job);  
  55.         }catch (Exception e) {  
  56.             e.printStackTrace();  
  57.         }finally{  
  58.             JDBCUtils.release(conn, call, null);  
  59.         }  
  60.     }  
  61.       
  62.   
  63.     /* 
  64.      * create or replace 
  65. function queryEmpIncome(eno in number) 
  66. return number 
  67.      */  
  68.     @Test  
  69.     public void testFunction(){  
  70.         //存储函数例子  
  71.         //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}  
  72.         String sql = "{?=call queryEmpIncome(?)}";  
  73.         Connection conn = null;  
  74.         CallableStatement call = null;  
  75.         try{  
  76.             conn = JDBCUtils.getConnection();  
  77.             call = conn.prepareCall(sql);  
  78.               
  79.             call.registerOutParameter(1, OracleTypes.NUMBER);  
  80.             call.setInt(27839);  
  81.               
  82.             //执行  
  83.             call.execute();  
  84.               
  85.             //取出年收入  
  86.             double income = call.getDouble(1);  
  87.             System.out.println(income);  
  88.         }catch (Exception e) {  
  89.             e.printStackTrace();  
  90.         }finally{  
  91.             JDBCUtils.release(conn, call, null);  
  92.         }  
  93.     }  
  94.       
  95.     /* 
  96.      * 问题: 
  97.      * 1. 光标是否被关?:是,结构集关掉后光标就关掉了。 
  98.      * 2. 是否能在MYSQL上执行?:不能 
  99.      */  
  100.     @Test  
  101.     public void testCursor(){  
  102.         String sql = "{call MYPACKAGE.queryEmpList(?,?)}";  
  103.         Connection conn = null;  
  104.         CallableStatement call = null;  
  105.         ResultSet rs  =null;  
  106.         try {  
  107.             conn = JDBCUtils.getConnection();  
  108.             call = conn.prepareCall(sql);  
  109.               
  110.             call.setInt(110);  
  111.             call.registerOutParameter(2, OracleTypes.CURSOR);  
  112.               
  113.             //执行  
  114.             call.execute();  
  115.               
  116.             //取出集合  
  117.             rs = ((OracleCallableStatement)call).getCursor(2);  
  118.             while(rs.next()){  
  119.                 String name = rs.getString("ename");  
  120.                 String job = rs.getString("job");  
  121.                 System.out.println(name+"的职位是"+job);  
  122.             }  
  123.         } catch (Exception e) {  
  124.             e.printStackTrace();  
  125.         }finally{  
  126.             JDBCUtils.release(conn, call, rs);  
  127.         }  
  128.     }  
  129. }  


3.用到的JDBC类

[java] view plain copy
  1. package demo.util;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. import java.sql.Statement;  
  8.   
  9. public class JDBCUtils {  
  10.     private static String driver="oracle.jdbc.OracleDriver";  
  11.     private static String url="jdbc:oracle:thin:@localhost:1521:orcl";  
  12.     private static String user="scott";  
  13.     private static String password="tiger";  
  14.       
  15.     static{  
  16.         try {  
  17.             Class.forName(driver);  
  18.         } catch (ClassNotFoundException e) {  
  19.             throw new ExceptionInInitializerError(e);  
  20.         }  
  21.     }  
  22.       
  23.     public static Connection getConnection(){  
  24.         try {  
  25.             return DriverManager.getConnection(url, user, password);  
  26.         } catch (SQLException e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.         return null;  
  30.     }  
  31.       
  32.     /* 
  33.      * 执行java程序 
  34.      * java -Xms100M -Xmx200M HelloWorld 
  35.      */  
  36.     public static void release(Connection conn,Statement stmt,ResultSet rs){  
  37.         if(rs!=null){  
  38.             try {  
  39.                 rs.close();  
  40.             } catch (SQLException e) {  
  41.                 e.printStackTrace();  
  42.             }finally{  
  43.                 rs=null;//垃圾回收:是否可以通过代码干预垃圾回收?  
  44.             }  
  45.         }  
  46.           
  47.         if(stmt!=null){  
  48.             try {  
  49.                 stmt.close();  
  50.             } catch (SQLException e) {  
  51.                 e.printStackTrace();  
  52.             }finally{  
  53.                 rs=null;//垃圾回收:是否可以通过代码干预垃圾回收?  
  54.             }  
  55.         }  
  56.           
  57.         if(conn!=null){  
  58.             try {  
  59.                 conn.close();  
  60.             } catch (SQLException e) {  
  61.                 e.printStackTrace();  
  62.             }finally{  
  63.                 rs=null;//垃圾回收:是否可以通过代码干预垃圾回收?  
  64.             }  
  65.         }  
  66.           
  67.     }  
  68. }  
原创粉丝点击