PLSQL

作者: o0O不吹空调会死的少年胖O0 | 来源:发表于2019-07-15 14:39 被阅读0次
    1.块

    使用分号作为一句SQL 或者PLSQL语句的结束;块结构关键字(DECLARE, BEGIN,EXCEPTION 后面不跟分号;END后面需带分号;你可以把一句SQL语句写在一行上,但一般不建议这么做,因为代码不够漂亮;

    DECLARE
     v_variable VARCHAR2(5);
    BEGIN
     SELECT column_name
    INTO v_variable
     FROM table_name;
    EXCEPTION
     WHEN exception_name THEN
     ...
    END;
    
    2.变量
    变量类型
        变量      命名规范:V_  全小写    可设置默认值
                varchar(有长度)        number/date(无长度) 
                表名.字段名%type  exp_report_headers.exp_report_number%type      
                表名%rowtype(记录类型)   exp_report_headers%type           
                变量%type     (已声明变量)                                               
        常量                c_            可设置默认值      
    
        全局变量              g_            可设置默认值
    
        异常                e_            不可设置默认值     e_amont_error exception;
    

    注:在写块,存储过程或者函数的时候不要随便使用commit
    所有变量都在begin之前声明
    在同一个块中,避免命名与数据库表中的字段名相同的变量

    3.输出语句 DBMS_OUTPUT.PUT_LINE ();
    4.输入语句 &p_
    5.给变量赋值
    1.声明变量时 直接赋默认值 declare v_number := 10;
    2.声明变量后 在BEGIN中给变量赋值 declare v_number; begin v_number := 10;
    3.声明变量后 用INTO 的方式赋值(SELECT  INTO语句: 用于把从数据库查询出内容存入变量)
        declare
            v_hire_date empliyees.hire_date%type;
            v_salary    empliyees.salary%TEPE;
        BEGIN
            select hire_date,salary
            into   v_hire_date.v_salary
            from   empliyees
            where  empliyees_id = 100;
        END;
    
    6.who字段
    PLSQL中insert:who字段      create_by       - p_user_id
                              creation_date    - sysdate
                              last_update_by   - p_user_id
                              last_update_date - sysdate
    PLSQL中update:who字段     last_update_by   - p_user_id
                              last_update_date - sysdate
    
    7.if
        if...then
        [    ]
        elsif...then
        [    ]
        else
        [    ]
        end if;
    与NULL有关
        if [  ] is null then [  ] end if;
        if [  ] is not null then [  ] end if;
    
    8.循环
    1   LOOP
            statement;
            EXIT [WHEN condition];
        END LOOP;
    2   WHILE [condition] LOOP
        [   ];
        [   ];
        ...
        END LOOP
    3.  FOR 循环变量 IN [  ] LOOP [  ] END LOOP;
            (c_...)     一个区间   复杂逻辑
        FOR c_exp_report in (select * from exp_report_headers) LOOP
        v_number := c_exp_report.exp_report_number;
        END LOOP;
    
    9.outer
    begin
      <<outer>>
      declare
    
        v_birthdate varchar2(30);
      begin
        declare
          v_birthdate date;
        begin
          outer.v_birthdate := to_char(sysdate,
                                     'YYYY-MM-DD');
        end;
        dbms_output.put_line(v_birthdate);
      end;
    end outer;
    
    10.游标

    游标的声明和变量的声明在同一位置,
    先声明变量再声明游标。
    c_游标名
    for 循环变量(c_)
    in [①区间1..3 ②查询sql(有数据)③游标(有数据)] loop
    [];
    end loop;

    declare
      cursor c_exp_reports is
        select * from exp_report_headers [FOR UPDATE NOWAIT];
    begin
      for c_exp_report in c_exp_reports loop
        dbms_output.put_line(c_exp_report.amount);
        if c_exp_report.amount = 3000 then
          exit;
        end if;
      end loop;
    end;
    
    游标参数:(游标参数命名:p_ ;类型:varchar2 number date)
    cursor c_exp_reports(p_参数 参数类型) is [需要传参数的sql];
    declare
      cursor c_exp_reports1 (p_id number) is
      select * from exp_report_headers erh
      where erh.exp_id = p_id;
      
      cursor c_exp_reports2 (p_last_name varchar2) is
      select * from exp_report_headers erh
      where erh.exp_last_name = p_last_name;
      
      begin
        for c_exp1 in c_exp_reports1(1 // c_exp1.exp_id) loop  
            for c_exp2 in c_exp_reports2(c_exp2.last_name) loop 
    
    11.例外处理:exp_report_pkg

    1.异常定义 e_[] exception;
    2.异常抛出 if [条件] then raise e_[]; end if;
    3.异常的存储 exception when e_amout_error
    then insert into 异常表 v_; end; 存储过程
    4.异常的查询与处理 (第一列降序)
    select * from sys_raise_app_errors order by 1 desc
    异常:遇到异常时会跳出异常,并自动回滚。

                   1.内置异常   -NO_DATA_FOUND 没有数据
                                      例:begin 
                                            select e.id from emp e;
                                          exception 
                                            when no_date_found then
                                          end;
                                –TOO_MANY_ROWS 多行数据
                                      例:select e.id into v_id from exp_employ e;
                                –DUP_VAL_ON_INDEX 唯一索引异常
                                      例:unique index employ_code
                                -other 其他未知的异常
                   2.自定义异常
    
    12.存储过程:

    create (or replace) procedure
    存储过程名[insert_表名 update_表名 deldete_表名 check_表名]长度<=30
    [p_ in, |可以有默认值
    p_ in out, |varchar2 number date,
    x_ out]

    create or replace procedure check_vegetables(p_pork     in number,
                                                 p_potatoes in number,
                                                 p_Tomatoes in number) is
      v_total_amount number;
    begin
      v_total_amount := p_pork * 6 + p_potatoes * 3 + p_Tomatoes * 5;
      dbms_output.put_line(v_total_amount);
    end check_vegetables;
    
    13. 函数:

    定义: create (or replace) function 函数名(p_) return [] is begin end 函数名;
    命名:get_exp_report_headers_id
    参数:in varchar2 in number in date <=30
    返回值: varchar2 number date

    create or replace function get_date return date is
      FunctionResult date;
    begin
      FunctionResult := to_date(to_char(sysdate, 'YYYY-MM-DD'), 'YYYY-MM-DD');
      return(FunctionResult);
    end get_date;
    

    14.包:package |包头 |包体

    存储过程必须在包头包体同时声明,
        函数可以不用声明包头|声明        公有函数
                           |不声明包头  私有函数
                           
        create [] procedure ;                                  包头
        create [] procedure is [];                             包体
        create [] function () return [];                       包头
        create [] function () return [] is [];                 包体
        命名: |包头 exp_employ_pkg
               |包体 exp_report_pkg  body                 
     记录表、记录类型            
    

    相关文章

      网友评论

          本文标题:PLSQL

          本文链接:https://www.haomeiwen.com/subject/oklnkctx.html