PLSQL

2019-07-15  本文已影响0人  o0O不吹空调会死的少年胖O0
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                 
 记录表、记录类型            
上一篇下一篇

猜你喜欢

热点阅读