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;













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`PROCEDURE` 是 MySQL 中用于创建存储过程的关键字。存储过程是一组预先编写好的 SQL 语句集合,可以在需要的时候执行。使用存储过程可以将常用的 SQL 语句封装起来,方便重复使用,并且可以提高 SQL 执行效率。 创建存储过程的语法如下: ``` CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name param_type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: valid_sql_statement ``` 其中,`sp_name` 是存储过程的名称,`proc_parameter` 是存储过程的参数列表,`characteristic` 是存储过程的特性,`routine_body` 是存储过程的主体部分,包括一系列有效的 SQL 语句。 例如,下面的示例代码创建一个名为 `get_customer` 的存储过程,它接受一个客户 ID 作为输入参数,然后从 `customers` 表中检索出该客户的信息: ``` CREATE PROCEDURE get_customer (IN customer_id INT) BEGIN SELECT * FROM customers WHERE id = customer_id; END; ``` 在这个例子中,`IN customer_id INT` 指定了一个输入参数 `customer_id`,它的类型为 `INT`。`SELECT` 语句用于检索出指定客户 ID 的信息。该存储过程可以在需要的时候调用,例如: ``` CALL get_customer(123); ``` 这将检索出客户 ID 为 123 的客户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值