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.0\db_1\jdbc\lib目录下。默认在C:\oracle\product\10.2.0\db_1\jdbc\lib

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         }
时间: 2024-10-07 14:32:16

oracle 存储过程,函数和包的相关文章

hibernate调用oracle存储过程||函数

pakeage dao.Impl; //调用函数FUN_GET(); public String get(String Id,String Name){ return getSession().createSQLQuery("select FUN_GET(?,?) from dual") .setParameter(0, Id).setParameter(1, Name).uniqueResult() .toString(); } //uniqueResult()  返回唯一值 //调

oracle存储过程函数

1.函数 create or replace function get_Destroy_no return varchar2 is Result varchar2(50);begin SELECT max(destroy_no) INTO RESULT FROM t_oms_device_destroy WHERE substr(destroy_no,0,8)= to_char( SYSDATE ,'yyyymmdd'); IF (RESULT =''OR RESULT IS NULL) THE

oracle 存储过程,存储函数,包,

http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有很多优点,具体归纳如下: * 存储过程和函数以命名的数据库对象形式存储于数据库当中.存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上

Oracle 存储过程定义和优点及与函数区别

定义: 存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可.在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包. 优 点: 1.(预编译)存储过程只在创造

oracle中函数和存储过程的区别和联系【转载竹沥半夏】

oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别. 一.存储过程 1.定义 存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure. 2.创建存储过程 create [or replace] procedure 存储过程名 [(参数1 类型,参数2 out 类型……)] as

oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)

匿名PL/SQL块回顾 DECLARE (可选)     定义在PL/SQL块中要使用的对象 BEGIN (必须)     执行语句 EXCEPTION (可选)     错误处理语句 END; (必须) 匿名块(以DECLARE或BEGIN开始)每次使用时都要进行编译. 匿名块不存储在数据库中,并且它不能从其它的PL/SQL块中进行调用. 过程.函数.包和触发器:都是带名块.(请注重同匿名块的比较) 过程.函数.包和触发器:可以存储在数据库中,并且可以在需要的时候运行. 过程.函数.包和触发器

oracle中函数和存储过程的区别和联系

oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别. 一.存储过程 1.定义 存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure. 2.创建存储过程 create [or replace] procedure 存储过程名 [(参数1 类型,参数2 out 类型……)] as 变量名 类型:

oracle 存储过程 包 【转】

一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? 1.预编译:存储过程预先编译好放在数据库内,减少编译语句所花的时间. 2.缓存:预编译的存储过程会进入缓存,所以对于经常执行的存储过程,除了第一次执行外,其它次数的执行速度会明显提高. 3.减少网络传输:特别是对于一些处理数据的存储过程,不必像直接使用SQL语句那样多次传送数据到客户端. 4 .可维

oracle存储过程和存储函数&触发器

oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 =========================创建和使用存储过程============================= 用create procedure命令建立存储过程和存储函数 语法: create [or replace] procedure 过程名(参数列表) as PLSQL子程序

oracle中的创建过程,函数,包

一.创建存储过程 存储过程是在oracle中存取完成特定业务逻辑的代码块.存储过程是命名块,匿名块不存在数据库中,命名块会存储到数据库中,匿名块每次运行都需要提前编译,命名块一次存储,只会编译一次.命名块可以多次使用. 创建存储过程的语法: create [or replace] procedure 存储过程的名称(参数名[in/out/inout] 参数类型,参数名...)] is/as 变量声明部分 begin 业务逻辑处理部分 exception 异常处理部分 end; 注意: 1.存储过