存储过程procedure

  存储过程的创建:存储过程是在大型数据库系统中专门定义的一组SQL语句集。

  

定义过程语法:(Oracle) dbms_output.put_line('学习使用存储过程!');
CREATE [OR REPLACE] PROCEDURE 过程名称([参数名称[参数模式] NOCOPY 数据类型 [参数名称 [参数模式] NOCOPY 数据类型,...]])
[AUTHID [DEFINER | CURRENT_USER]]
AS || IS
[PRAGMA AUTONOMOUS_TRANSACTION;]
声明部分;
BEGIN
程序部分;
EXCEPTION
导常处理;
END;
参数中定义参数模式表示过程的数据的接收操作,一般分为IN,OUT,IN OUT 3类
CREATE [OR REPLACE]:表示创建或者替换过程,如果过程存在则替换,如果不存在就创建一个新的
AUTHID子句定义了一个过程的所有者权限,DEFINER(默认)表示定义者权限执行,或者用CURRENT_USER覆盖程序的默认行为,变为使用者权限
PRAGMA AUTONOMOUS_TRANSACTION:表示过程启动一个自治事务,自治事务可以让主事挂起,在过程中执行完SQL后,由用户处理提交或者回滚自治事务,
然后恢复主事务
EXECUTE 过程名 来调用过程
或者EXEC 过程名

在sqlplus中设置过程显示
SET serveroutput ON

//Mysql 中存储过程语法的定义
create procedure 存储过程名称()
begin
  sql语句
end;

//一个简单的存储过程

create procedure a()
BEGIN
select "dasd1111";
END

call a;  //执行存储过程

//变量的使用

使用关键字 declare 来定义变量

DECLARE myparam INT default 100;

//为变量赋值
//先声明,再赋值:
 declare var1,var2,var3 INT;
 set var1 = 10,var2 = 20;
 set var3 = var1 + var2;

//参数类型
in表示输入参数,表示该参数必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回.
out 输出参数,该值可在存储过程中改变,并能够被返回.
inout 可在调用时给值,并能够被改变.
//使用in的实例

CREATE PROCEDURE demo_in_parameter(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END;

SET @p_in=1;
CALL demo_in_parameter(@p_in);
select @p_in;

得到的结果是:1,2,1

//使用out的实例
CREATE
PROCEDURE demo_out_parameter(OUT p_out int) BEGIN SELECT p_out; SET p_out=2; SELECT p_out; END; SET @p_out=1; CALL demo_out_parameter(@p_out); SELECT @p_out;

//输出的值分别是,null,2,2
//inout 的实例
CREATE
PROCEDURE demo_inout_parameter(INOUT p_inout int) BEGIN SELECT p_inout; SET p_inout=2; SELECT p_inout; END; SET @p_inout=1; CALL demo_inout_parameter(@p_inout) ; select @p_inout;
//得到的结果是:1,2,2
//存储过程的查询
select
name from mysql.proc where db='数据库名';
SHOW procedure status where db='数据库名';
select routine_name from information_schema.routines where routine_schema='数据库名';
//查看存储过程的详情
SHOW CREATE PROCEDURE 数据库.存储过程名;
//删除存储过程
DROP
PROCEDURE
//游标的使用
//声明一个游标
1. DECLARE
employee_csr CURSOR FOR SELECT id FROM employee WHERE valid=0;
2.open 游标名称
3.fetch 游标名称 into 参数... [将游标中的值,放入到参数中]
4.close 关闭游标
// 流程控制的语法,if语句
if 条件一 then 执行语句
    elseif 条件二 then 执行语句...
    else 执行语句
end if      //终结符

例子:
if val is null
    then select 'val is NULL';
    else select 'val is not NULL';
end if;
// 格式一(case语句的用法)
case case_expr
    when when_value then statement_list
    [when when_value then statement_list] ...
    [else statement_list]
end case

例子:
// 格式一
case val
    when 1 then select 'val is 1';
    when 2 then select 'val is 2';
    else select 'val is not 1 or 2';
end case;
 
// 格式二
case 
    when val is NULL then select 'val is NULL';
    when val < 0 then select 'val is less than 0';
    when val > 0 then select 'val is greater then 0';
end case;
//loop语句:创建一个循环操作,使用leave退出循环
起一个loop名称: LOOP   
    statement-list
end LOOP loop名称
// 参数说明
loop_label:loop语句的标注名称,非必填。

例子:
declare id int default 0;
add_loop:LOOP
set id = id + 1;
    if id >= 10 then leave add_loop;   //id大于等于10时退出循环
    end if;
end loop add_loop;

//while 循环语句
  while的名称: WHILE expr_condition DO statement_list END WHILE [while_label while的名称] // 参数说明 while_label:标注名称,可省略。

例子:
declare i int default 0;
while i < 10 DO
set i = i + 1;
end while;
 

一个Oracle的存储过程:

create or replace procedure find_custsum_procedure AS
  CRM_ALLOCATER_ID    VARCHAR2(100);
  count_num           VARCHAR2(1000);
   cursor find_custsum_cursor is
    select CRM_ALLOCATER_ID, count(1) as num
      from (select b.CRM_ALLOCATER_ID
              from (select CUST_ID, ACCU
                      from (select CUST_ID,
                                   sum(CURR_M_ACCU / STATIS_DT) AS ACCU
                              from XAN_INDIV_ACCT_BAL_ACCU
                             GROUP BY CUST_ID) a
                     where a.accu > 5000000) aa
             right JOIN XAN_INDIV_ASSET_ALLOT_DTL b
                on aa.CUST_ID = b.CUST_ID) bb
    
     group by bb.CRM_ALLOCATER_ID;


BEGIN
  open find_custsum_cursor;
  loop
  FETCH find_custsum_cursor
    into CRM_ALLOCATER_ID, count_num;
    exit when find_custsum_cursor%notfound;
    dbms_output.put_line('放入到数据库中');
  end loop;
  close find_custsum_cursor;
end;

  

原文地址:https://www.cnblogs.com/chengyangyang/p/9928004.html