PL/SQL块语法
[DECLARE] ---declaration statements BEGIN ---executable statements [EXCEPTION] ---exception statements END |
PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以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小时内删除。
发表评论