procedure

创建过程
CREATE OR REPLACE PROCEDURE name
    [(parameter[, parameter, ...])]
AS
    [local declarations]
BEGIN
    executable statements
[EXCEPTION
    exception handlers]
END [name];
   
   
  1. CREATE OR REPLACE PROCEDURE Discount AS
  2.  CURSOR c_group_discount IS
  3.    SELECT distinct s.course_no, c.description
  4.      FROM section s, enrollment e, course c
  5.     WHERE s.section_id = e.section_id
  6.       AND c.course_no = s.course_no
  7.     GROUP BY s.course_no, c.description, e.section_id, s.section_id
  8.    HAVING COUNT(*) >= 8;
  9. BEGIN
  10.  FOR r_group_discount IN c_group_discount LOOP
  11.    UPDATE course
  12.       SET cost = cost * .95
  13.     WHERE course_no = r_group_discount.course_no;
  14.    DBMS_OUTPUT.PUT_LINE('A 5% discount has been given to ' ||
  15.                         r_group_discount.course_no || ' ' ||
  16.                         r_group_discount.description);
  17.  END LOOP;
  18. END;
  19. SQL> select to_char(line,99)||'>',text from user_source where name='DISCOUNT';
  20. TO_C TEXT
  21. ---- ----------------------------------------------------------------------
  22.  1> PROCEDURE Discount
  23.  2> AS
  24.  3> CURSOR c_group_discount
  25.  4> IS
  26.  5> SELECT distinct s.course_no, c.description
  27.  6> FROM section s, enrollment e, course c
  28.  7> WHERE s.section_id = e.section_id
  29.  8> AND c.course_no = s.course_no
  30.  9> GROUP BY s.course_no, c.description,
  31. 10> e.section_id, s.section_id
  32. 11> HAVING COUNT(*) >=8;
  33. 12> BEGIN
  34. 13> FOR r_group_discount IN c_group_discount
  35. 14> LOOP
  36. 15> UPDATE course
  37. 16> SET cost = cost * .95
  38. 17> WHERE course_no = r_group_discount.course_no;
  39. 18> DBMS_OUTPUT.PUT_LINE
  40. 19> ('A 5% discount has been given to '||
  41. 20> r_group_discount.course_no||' '||
  42. 21> r_group_discount.description
  43. 22> );
  44. 23> END LOOP;
  45. 24> END;


过程传入传出参数
参数用于在调用环境和服务器之间来传递值,包括传输用于处理的值,或者执行过程后所返回的值。三种参数模式分别是IN、OUT和IN OUT
1.Modes
Modes指明所传递的参数是传入的,还是传出的。

2.Formail and Actual Parameters(形参和实参)
形参是模块头部的圆括号中所指明的名称。实参是当该模块被调用时,圆括号中作为参数列表的值或者表达式。形参和相关的实参必须属于相同的或者兼容的数据类型。


3.使用参数值传入约束(数据类型)
形参不需要对数据类型做出约束。例如,无需指定诸如varchar2(60)之类的约束,只需要在参数列表中给参数名定义VARCHAR2。当发出调用时,在传入值时加入约束

4.匹配形参和实参
可以使用两种方法来匹配形参和实参:位置表示法和命名表示法。位置表示法是依靠位置序号来标示:当执行过程时所使用参数的顺序匹配过程头部定义时的形参顺序。命名表示法是一种显式的标识方法,使用符号=>,如下所示:
    formal_parameter_name .=> argument_value

   
   
  1. create or replace procedure find_name(
  2. i_student_id in number,
  3. o_first_name out varchar2,
  4. o_last_name out varchar2)
  5. as
  6. begin
  7. select first_name,last_name
  8. into o_first_name,o_last_name
  9. from student
  10. where student_id=i_student_id;
  11. exception
  12. when others then
  13. dbms_output.put_line('Error in finding student_id:
  14. '||i_student_id);
  15. end find_name;
  16. /
  17. DECLARE
  18.  v_local_first_name student.first_name%TYPE;
  19.  v_local_last_name  student.last_name%TYPE;
  20. BEGIN
  21.  find_name(145, v_local_first_name, v_local_last_name);
  22.  DBMS_OUTPUT.PUT_LINE('Student 145 is: ' || v_local_first_name || ' ' ||
  23.                       v_local_last_name || '.');
  24. END;
  25. /
  26. Student 145 is: Paul Lefkowitz.
  27. PL/SQL procedure successfully completed.

出参

  
  
  1. create or replace procedure p_getappkey
  2. (vappname varchar2,
  3. vappkey out varchar2
  4. )
  5. is
  6. begin
  7.    for x in (select appkey from t_apps a
  8.      where a.appname=vappname)
  9.      loop
  10.         vappkey:=x.appkey;
  11.      end loop;
  12. end;
  13. declare
  14.   v2 varchar2(200);
  15.   begin
  16.     p_getappkey(vappname => '白猫计划',vappkey => v2);
  17.   dbms_output.put_line(v2);
  18. end;













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值