• 存储过程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;

      

  • 相关阅读:
    正则表达式简介
    每个程序员都必须遵守的编程原则
    String, StringBuffer, StringBuilder
    一些软件设计的原则
    A hard puzzle ACM HDU1097
    ACM HDU 1032The 3n + 1 problem
    Humble Numbers HDU 1058 ACM
    ACM HDU 1028Ignatius and the Princess III
    HangOver ACM HDU1056
    ACM HDU 1021Fibonacci Again
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/9928004.html
Copyright © 2020-2023  润新知