PL/SQL块语法
[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END

  PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGINDECLARE开始,以END结束。注释由--标示。

  PL/SQL块的命名和匿名


  PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序匿名程序块可以用在服务器端也可以用在客户端。

  命名程序块可以出现在其他PL/SQL程序块的声明部分这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。

  PL/SQL程序块可被独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序//函数,过程,包,触发器

   . 函数

   . 过程


   .

   . 触发器

  函数 function

  函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下
FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]

  过程 procedure

  存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT)与函数不同,存储过程没有返回值存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下:
PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]
实例如下:
PROCEDURE commpellent_summary_main(in_operation_date VARCHAR2)                  --(out_msg OUT NUMBER)
  IS
      v_operation_date  DATE;
      v_control_seq      NUMBER;
      v_summary_count    NUMBER;
      err                VARCHAR2 (200);
      out_msg            NUMBER;
  BEGIN
      v_summary_count := 0;
      SELECT pay_program_control_log_seq.NEXTVAL
        INTO v_control_seq
        FROM DUAL;
      INSERT INTO PAY_PROGRAM_CONTROL_LOG
                  (run_seq, program_name, run_start_time, status
                  )
          VALUES (v_control_seq, 'payment_compellent_summary', SYSDATE, 0
                  );
      COMMIT;
  IF in_operation_date IS NULL THEN
        v_operation_date := SYSDATE-1;
  ELSE
    v_operation_date :=TO_DATE(in_operation_date,'yyyy-mm-dd');
  END IF;
      csr_commpellent_summary (v_operation_date, v_summary_count);
      office_commpellent_summary (v_operation_date);
    --调用强制插入回单表
    commpellent_insert_response(v_operation_date);
    --调用日核销报表程序
    --Rpt_act_main(TO_CHAR(v_operation_date,'yyyymmdd'));
      UPDATE PAY_PROGRAM_CONTROL_LOG
        SET run_end_time = SYSDATE,
            run_counts = v_summary_count,
            status = 1
      WHERE run_seq = v_control_seq;
      out_msg := 0;
      COMMIT;
  EXCEPTION
      WHEN OTHERS
      THEN
        out_msg := -1;
        err := SQLERRM;
sql存储过程实例        UPDATE PAY_PROGRAM_CONTROL_LOG
            SET run_end_time = SYSDATE,
                run_counts = v_summary_count,
                status = out_msg,
                err_desc = SUBSTR (err, 1, 200)
          WHERE run_seq = v_control_seq;
        COMMIT;
  END commpellent_summary_main;

  (package)

  包其实就是被组合在一起的相关对象的集合当包中任何函数或存储过程被调用,包就被加载入内存中,包中的任何函数或存储过程的子程序访问速度将大大加快
包由两个部分组成:规范和包主体(body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标。

  触发器(trigger)

  触发器与一个表或数据库事件联系在一起的,当一个触发器事件发生时,定义在表上的触发器被触发
1.案例一:匿名块
等价于一条sql语句,长用于调试
取出姓名为scott员工的职位
Declare
V_title varchar2(20);
Begin
Select job
Into v_title
From emp
Where ename=’SCOTT’;
Dbms_output.put_line(v_title);\
End;
/
知识点:
1. 标示符长度不超过30个字符
2. 强调编程风格
3. 单行注释:“—这是单行注释”
4. 多行注释:“/*这是多行注释*/”
2.案例二:异常块
取出姓名为aa员工的职位
scott@ORAC1> declare
  2  v_title varchar2(20);
  3  begin
  4  select job
  5  into v_title
  6  from emp
  7  where ename='aa';
  8  --where deptno='10'
  9  dbms_output.put_line(v_title);
10  exception
11  when no_data_found then
12  dbms_output.put_line('>####found nothing>####');
13  when too_many_rows then
14  dbms_output.put_line('>>2 many rose>>');
15  end;
16  /
>####found nothing>####
PL/SQL 过程已成功完成。
scott@ORAC1> declare
  2  v_title varchar2(20);
  3  begin
  4  select job
  5  into v_title
  6  from emp
  7  where deptno=10;
  8  dbms_output.put_line(v_title);
  9  exception
10  when no_data_found then
11  dbms_output.put_line('####found nothing####');
12  when too_many_rows then
13  dbms_output.put_line('>#2 many roses>#');
14  end;
15  /
>#2 many roses>#
PL/SQL 过程已成功完成。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。