Oralce_PL-SQL_Prodedure_12

Procedure

参数模式:in、out、in out

Procedure的创建

CREATE[OR REPLACE] PROCEDURE procedurename(arg1 [model] datatype,arg2 [model] datatype,…) IS/AS
BEGIN
END;

注意:

无参 时,创建不能有过程名称后面不需要()

eg:用procedure求n1~n2的和

CREATEORREPLACEPROCEDURE sp_sum(i   ININTEGER,
                                  j   ININTEGER,
                                  res OUTNUMBER) IS
  i1 INTEGER := i;
  j1 INTEGER := j;
  sm INTEGER := 0;
BEGIN
  WHILE i1 <= j1 LOOP
    sm := sm + i1;
    i1 := i1 + 1;
  ENDLOOP;
  res := sm;
END;

其实说到底,oracle还是对表的CRUD, Cursor的作用就很明显了,所以Cursor作为参数在procedure中的应用我们也要掌握好,这样才能熟练的运用之。

这种情况,先定义一个package,在package中定义一种Type

那么这个时候我们就定义了一个类型了,以后要创建一个cursor类型就可以直接这样来创建。

创建一个包,包里面包含一个TYPE为REF CURSOR的类型

CREATEORREPLACEPACKAGE typeutil IS
  TYPE cur_type ISREFCURSOR;
END;

创建一个Procedure,用来遍历出emp表中的ename

CREATEORREPLACEPROCEDURE sp_print(cur_emp OUT typeutil.cur_type) IS
  cur SYS_REFCURSOR;
BEGIN
  OPEN cur FOR
    SELECT ename form emp;
  cur_emp := cur;
END;

调用Procedure

DECLARE
  cur    SYS_REFCURSOR;
  vename VARCHAR2(20);
BEGIN
  sp_print(cur);
  LOOP
    FETCH cur
      INTO vename;
    EXITWHEN cur%NOTFOUND;
    dbms_output.put_line(vename);
  ENDLOOP;
  CLOSE cur;
END;

那我们可以很清晰的看到,先在package中定义了一个Type,为ref cursor,然后create procedure 目的来遍历emp中的ename,然后调用。这是方法一,显得有点繁琐,让我们看看方法二。

我们可以看到,这里直接引入了一种Type SYS_REFCURSOR,直接定义一个cursor就很方便了。看看具体PL的实现。

CREATEORREPLACEPROCEDURE sp_print2(cur_emp OUTSYS_REFCURSOR) IS
  cur SYS_REFCURSOR;
BEGIN
  OPEN cur FOR
    SELECT ename FROM emp;
  cur_emp := cur;
END;

CREATEORREPLACEPROCEDURE sp_test(cur_emp OUTVARCHAR2) IS
BEGIN
  dbms_output.put_line('HELLOWORLD');
END;

注意,这里参数类型不需要给出指定的数字,PL会根据你的返回值,然后判断到底用多大的空间来接受,认为的给出参数的数字是错误的。

调用

Call 过程名(无参)

Call 过程名(参数)

Exec过程名(参数)

删除

drop proceduresp_name

查看

SELECT* FROM user_procedures;

查看过程源代码

SELECT TEXT FROMuser_source where name = ‘SP_SUM’

增加调试信息

ALTER PROCEDUREsp_name COMPILE DEBUG 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值