PL/SQL编程整理5 -- 编写存储过程

ORACLE SERVER上建立存储过程,可以被多个应用程序调用,可以向存储过程传递参数,也可以向存储过程传回参数.

创建过程语法:

CREATE [OR REPLACE] PROCEDURE Procedure_name

[ (argment [ { IN | IN OUT }] Type,

      argment [ { IN | OUT | IN OUT } ] Type ]

{ IS | AS }

<类型.变量的说明>

BEGIN

<执行部分>

EXCEPTION

<可选的异常错误处理程序>

END;

 

1、没有输入和输出参数的存储过程

Create or replace procedure

存储过程名

Is

Begin

-- 语句

End;

/

2、有输入参数的存储过程

Create or replace procedure

存储过程名 (参数1 in 类型,参数2 in 类型 …..

Is

Begin

-- 语句

End;

例子:

Create or replace procedure

Sp_test(spName in varchar2,spSal in number)

Is

Begin

    Update emp set sal=spSal where ename=spName

End;

/

JAVA中调用:

//得到连接

Connection con=null; 

//得到CallableStatement对象

CallableStatement cs = Con.prepareCall(“{call Sp_test(?,?) }”);

//?赋值

cs.setString(1,”SCOTT”);

cs.setInt(2,1000);

//执行

cs.execute();

3、有输出参数(非列表)的存储过程

Create or replace procedure

存储过程名 (参数1 out 类型,参数2 out 类型 …..

Is

Begin

-- 语句

End;

 

例子:

Create or replace procedure

Sp_test(spName in varchar2,spSal out number)

Is

Begin

    Select sal into spSal from where ename=spName;

End;

/

JAVA中调用:

//得到连接

Connection con=null; 

//得到CallableStatement对象

CallableStatement cs = Con.prepareCall(“{call Sp_test(?,?) }”);

//?赋值

cs.setString(1,”SCOTT”);

cs.registerOutParameter(2,oracle.jdbc.OracleTypes.NUMBER);

//执行

cs.execute();

//取出返回值,注意?顺序

int sal = cs.getInt(2);

 

4、有输出参数(列表)的存储过程

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用package,所以要分两部分:

a)         建一个包,定义一个游标类型,如下:

Create or replace package testpackage as

TYPE test_cursor is ref curser;

End testpackage;

 

b)        建立存储过程

例子:

Create or replace procedure

Sp_test(spNo in nuber,p_cursor out testpackage. test_cursor)

Is

Begin

    Open p_cursor for Select * from where deptno= spNo;

End;

/

JAVA中调用:

//得到连接

Connection con=null; 

//得到CallableStatement对象

CallableStatement cs = Con.prepareCall(“{call Sp_test(?,?) }”);

//?赋值

cs.setInt(1,10);

cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);

//执行

cs.execute();

//得到结果集

ResultSet rs =(ResultSet)cs.getObject(2);

while(rs.next){

        System.out.println(rs.getInt(1)+”---------”+rs.getString(2))

}

 

 

注意:

查看错误:show error

PL/SQL中执行过程:

格式:

       EXEC[UTE]  Procedure_name( parameter1, parameter2…);

例子:

CREATE OR REPLACE PROCEDURE proc_demo(

    Dept_no NUMBER DEFAULT 10,

    Sal_sum OUT NUMBER,

    Emp_count OUT NUMBER)

IS

BEGIN

    SELECT SUM(sal), COUNT(*) INTO sal_sum, emp_count

FROM emp WHERE deptno=dept_no;

EXCEPTION

   WHEN NO_DATA_FOUND THEN

      DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');

   WHEN OTHERS THEN

      DBMS_OUTPUT.PUT_LINE('发生其它错误!');

END proc_demo;

 

调用方法:

 DECLARE

V_num NUMBER;

V_sum NUMBER(8, 2);

BEGIN

    Proc_demo(30, v_sum, v_num);

DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||’,人数:’||v_num);

    Proc_demo(sal_sum => v_sum, emp_count => v_num);

DBMS_OUTPUT.PUT_LINE('10号部门工资总和:'||v_sum||’,人数:’||v_num);

END;

 

PL/SQL 程序中还可以在块内建立本地函数和过程,这些函数和过程不存储在数据库中,但可以在创建它们的PL/SQL 程序中被重复调用。本地函数和过程在PL/SQL 块的声明部分定义,它们的语法格式与存储函数和过程相同,但不能使用CREATE OR REPLACE 关键字。例如:

DECLARE

  V_num NUMBER;

  V_sum NUMBER(8, 2);

  PROCEDURE proc_demo(

        Dept_no NUMBER DEFAULT 10,

        Sal_sum OUT NUMBER,

        Emp_count OUT NUMBER)

  IS

  BEGIN

        SELECT SUM(sal), COUNT(*) INTO sal_sum, emp_count

  FROM emp WHERE deptno=dept_no;

  EXCEPTION

     WHEN NO_DATA_FOUND THEN

        DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');

     WHEN OTHERS THEN

        DBMS_OUTPUT.PUT_LINE('发生其它错误!');

  END proc_demo;

BEGIN

    Proc_demo(30, v_sum, v_num);

  DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||',人数:'||v_num);

    Proc_demo(sal_sum => v_sum, emp_count => v_num);

  DBMS_OUTPUT.PUT_LINE('10号部门工资总和:'||v_sum||',人数:'||v_num);

END;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值