• oracle 存储过程,函数和包


    创建存储过程:
    语法:create [or replace] PROCEDURE 过程名(参数列表) 

    AS

            PLSQL子程序体;

    调用 存储过程的方式 两种
    1、execute(exec)     ------exec  函数名()
    2、begin    
          函数名()
       end           -------begin  函数名()end

    函数(Function)为一命名的存储程序,可带参数,并返回一计算值。函数和过程的结构类似,但必须有一个RETURN子句,用于返回函数值。函数说明要指定函数名、结果值的类型,以及参数类型等。
    建立存储函数的语法:

    CREATE [OR REPLACE] FUNCTION 函数名(参数列表)

     RETURN  函数值类型

    AS

    PLSQL子程序体;

    一般来讲,过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。
    但过程和函数都可以通过out指定一个或多个输出参数。
    我们可以利用out参数,在过程和函数中实现返回多个值。

    如果只有一个返回值,用存储函数;否则,就用存储过程。
    一般不在存储过程和存储函数中做提交和回滚操作

    如果一个存储过程中含有很多个返回值,需要在存储过程中全部写出来,比较的不方便,所以可以让存储过程中返回一个指针进行处理,即包

     1 --存储过程
     2 create or replace procedure getEmpInfo(eno in testemp.empno%type,--输入值in可以省略
     3                                         empname out varchar,--输出值out必须要,只需要写返回类型,不需要写精度
     4                                         empjob out varchar,
     5                                         empsal out number
     6 )
     7 as
     8 begin
     9   select ename,job,sal into empname,empjob,empsal from testemp where empno=eno;
    10 end;
    11 
    12 --函数
    13 
    14 create or replace function getSals(eno in testemp.empno%type)
    15 return  testemp.sal%type  --定义返回类型
    16 as
    17 psal testemp.sal%type;
    18 pcomm testemp.comm%type;
    19 begin
    20   select sal,comm into psal,pcomm from testemp where empno=eno;
    21   return (psal*12+nvl(pcomm,0)); --返回值
    22 end;
    23 
    24 
    25 --创建包
    26 create or replace package mypackage as--mypackage 自定义包名
    27 type empcursor is ref cursor;--声明一个自定义光标类型
    28 procedure queryemp(dtno in testemp.deptno%type,
    29                    empinfo out empcursor );--存储过程
    30 end mypackage;--结束包头定义
    31 
    32 create or replace --创建包体
    33 package body  mypackage as
    34 procedure queryemp(dtno in testemp.deptno%type,empinfo out empcursor) as
    35   begin
    36     open empinfo for select * from testemp where deptno=dtno;--将查询到的数据放到光标中
    37   end queryemp;
    38 end mypackage;

    在java中调用存储过程,函数

    1、导包

    在oracle安装目录product10.2.0db_1jdbclib目录下。默认在C:oracleproduct10.2.0db_1jdbclib

    2、

    java连接oracle驱动
    private static String  driver="oracle.jdbc.OracleDriver";
        private static String url="jdbc:oracle:thin:@192.168.250.144:1521:orcl";
        private static String user="scott";
        private static String password="tiger";

    3、

     1 调用存储过程
     2 String sql="{call getEmpInfo(?,?,?,?)}";//调用存储过程sql语句
     3         Connection conn=null;
     4         CallableStatement callStatement=null;
     5         try {
     6             conn=OracleUtils.getConnection();
     7             callStatement=conn.prepareCall(sql);
     8             callStatement.setInt(1, 7839);//设置输入值
     9             callStatement.registerOutParameter(2,OracleTypes.VARCHAR);//设置输出值
    10             callStatement.registerOutParameter(3,OracleTypes.VARCHAR);
    11             callStatement.registerOutParameter(4,OracleTypes.NUMBER);
    12             
    13             callStatement.execute();//执行存储过程
    14             
    15             String name=callStatement.getString(2);//获取输出值
    16             String job=callStatement.getString(3);
    17             double sal=callStatement.getDouble(4);
    18             
    19             System.err.println("name="+name);
    20             System.err.println("job="+job);
    21             System.err.println("sal="+sal);
    22             
    23         } catch (Exception e) {
    24             e.printStackTrace();
    25         }finally{
    26             OracleUtils.release(conn, callStatement, null);
    27         }
     1 调用函数
     2 String sql="{?= call getSals(?)}";
     3         Connection conn=null;
     4         CallableStatement call=null;
     5         try {
     6             conn=OracleUtils.getConnection();
     7             call=conn.prepareCall(sql);
     8             call.registerOutParameter(1, OracleTypes.NUMBER);
     9             call.setInt(2, 7839);
    10             
    11             call.execute();
    12             
    13             double allsal=call.getDouble(1);
    14             
    15             System.err.println(allsal);
    16             
    17         } catch (Exception e) {
    18             e.printStackTrace();
    19         }finally{
    20             OracleUtils.release(conn, call, null);
    21         }
     1 调用带有光标返回值得包
     2 String sql="{call mypackage.queryemp(?,?)}";
     3         Connection conn=null;
     4         CallableStatement call=null;
     5         ResultSet rs=null;
     6         try {
     7             conn=OracleUtils.getConnection();
     8             call=conn.prepareCall(sql);
     9             call.setInt(1, 30);
    10             call.registerOutParameter(2, OracleTypes.CURSOR);
    11             
    12             call.execute();
    13             
    14             rs=((OracleCallableStatement)call).getCursor(2);//获取光标值的结果集
    15             while(rs.next())//循环光标
    16             {
    17                 String name=rs.getString("ename");
    18                 String job=rs.getString("job");
    19                 System.err.println("name:"+name+"   job:"+job);
    20                 
    21             }
    22             
    23         } catch (Exception e) {
    24             e.printStackTrace();
    25         }
  • 相关阅读:
    数据库
    poj上关于回文的题目
    最长上升子序列
    [CodeForces]914D Bash and a Tough Math Puzzle
    [HAOI2011]problem a
    Arc123 D
    [Cnoi2020]线性生物
    [USACO17FEB]Why Did the Cow Cross the Road III P
    ABC 210
    CF1111D Destroy the Colony
  • 原文地址:https://www.cnblogs.com/liuwt365/p/4191303.html
Copyright © 2020-2023  润新知