定义循环变量FOR 循环变量in [REVERSE] 初值表达式..终值表达式LOOP 语句段;END LOOP;
3.3 顺序控制GOTO语句GOTO语句用于跳转到特定标号处去执行语句使用GOTO语句会增加程序的复杂性,并使应用程序可读性变差,所以在开发应用时建议不要使用GOTO语句NULL语句NULL语句不会执行任何操作,并直接将控制传递到下一个条语句使用NULL语句的优点在于可以提高PL/SQL程序的可读性
4. 异常处理PL/SQL异常是指通过了编译的PL/SQL程序在运行时产生的错误导致异常的原因有很多,如内存用尽、硬件故障、违反表的完整性约束、设计上的缺陷PL/SQL提供了一种异常错误处理机制,可以帮助实现对错误的捕获和处理当异常发生时,PL/SQL会自动地捕获异常并自动地将程序控制流程转移到异常处理部分的程序EXCEPTIONWHEN 异常错误名称1 [OR 异常错误名称2......] THEN语句段1;WHEN异常错误名称3 [OR 异常错误名称4......] THEN语句段2;......WHEN OTHERS THEN语句段3;
4.1 预定义异常针对一些常见的错误,PL/SQL预定义了一些异常错误 当PL/SQL程序违反了Oracle的规定或超出了系统规定的限制时,就会隐含地引发一个预定义的错误PL/SQL在程序包STANDARD中包含了这些预定义异常异常ORACLE错误 描述LOGIN_DENIED ORA-1017 无效的用户名或者口令NO_DATA_FOUND ORA-1403 查询未找到数据NOT_LOGGED_ON ORA-1012 还未连接就试图数据库操作PROGRAM_ERROR ORA-6501 内部错误ROWTYPE_MISMATCH ORA-6504 主变量和光标的类型不兼容STORAGE_ERROR ORA-6500 内部错误ACCESS_INTO_NULL ORA-6530 试图访问一个未初始化的对象时出现CASE_NOT_FOUND ORA-6592 CASE语句中的选项与用户输入数据不匹配时出现CURSOR_ALREADY_OPEN ORA-6511 试图打开一个已打开的光标DUP_VAL_ON_INDEX ORA-0001 试图破坏一个唯一性限制INVALID_CURSOR ORA-1001 试图使用一个无效的光标INVALID_NUMBER ORA-1722 试图对非数字值进行数字操作TIMEOUT_ON_RESOURCE ORA-0051 发生超时TOO_MANY_ROWS ORA-1422 SELECT INTO命令返回的多行TRANSACTION_BACKED_OUT ORA-006 由于死锁提交被退回VALUE_ERROR ORA-6502 转换或者裁剪错误ZERO_DIVIDE ORA-1476 试图被零除
4.2 自定义异常预定义异常都是由Oracle判断的异常错误在实际的PL/SQL程序开发过程中,为了具体的业务规则、编程和调试的需要,程序员可以自定义一些异常自定义异常必须要声明,并且必须使用RAISE语句显式地引发在更新表中的数据时,如果没有符合条件的记录,则不会更新数据。因为这不是错误,所以不会有任何的错误提示,但可以使用自定义错误异常的方法来提示
5. 开发动态SQL在PL/SQL程序设计中,可以直接使用DML和事务控制的语句,但DDL语句及系统控制语句却不能在PL/SQL中直接使用需要在PL/SQL中使用DDL语句及系统控制语句时,可以通过使用动态SQL来实现,例如需要动态建表或某个不确定的操作需要动态执行在PL/SQL块中使用的SQL语句在编译时是明确的,且执行的是确定对象,则属于静态SQL在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作,则属于动态SQL编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句,对语句进行语法分析并执行该语句
5.2 处理非查询语句EXECUTE IMMEDIATE dynamic_string [INTO {define_variable[,define_variable]...| record}][USING [IN |OFF |IN OUT] bind_argument [,[ IN | OUT |IN OUT] bind_argument] ...][{RETURNING | RETURN } INTO bind_argument [, bind_argument] ...];参数 说明dynamic_string 指定存放SQL语句或PL/SQL块的字符串变量define_variable
指定存放单行查询结果的变量bind_argument(IN) 指定存放被传递给动态SQL值的变量bind_argument(OUT) 指定存放动态SQL返回值的变量使用EXECUTE IMMEDIATE处理DDL和DCL操作使用EXECUTE IMMEDIATE处理DML操作处理包含RETURNING子句的DML语句当使用EXECUTE IMMEDIATE处理包含RETURNING子句的DML语句时,必须使用RETURNING INTO子句接收返回的数据当直接使用EXECUTE IMMEDIATE处理包含RETURNING子句的DML语句时,只能处理作用在单行上的DML语句使用EXECUTE IMMEDIATE处理单行查询使用EXECUTE IMMEDIATE不仅可以处理DDL、DCL和DML语句,而且还可以用于处理单行查询语句但在使用EXECUTE IMMEDIATE语句处理单行查询语句时,需要使用INTO子句接收返回的数据使用BULK子句处理多行查询通过在EXECUTE IMMEDIATE语句中引入BULK子句,不仅可以处理单行查询,而且还可以处理多行查询语句总结PL/SQL是Oracle在标准SQL语言上的过程性扩展,它不仅允许嵌入SQL语句,而且允许定义变量和常量,允许过程语言结构PL/SQL程序块可以分为匿名块、命名块、子程序、程序包和触发器PL/SQL程序块由3个部分组成:声明部分、执行部分和异常处理部分在PL/SQL程序块中,可以使用SELECT INTO语句将查询的结果赋给变量当使用%TYPE属性定义变量时,Oracle会自动地按照数据库列或其他变量来确定新变量的类型和长度可以使用%ROWTYPE来定义一个表示表中一行记录的变量TABLE索引表相当于一个键值集合,键是唯一的,用于查找对应的值。键可以是整数或字符串VARRAY数组是具有相同数据类型的一组成员的集合。
每个成员都有一个唯一的下标,它取决于成员在数组中的位置自定义异常必须要声明,并且必须使用RAISE语句显式地引发需要在PL/SQL中使用DDL语句及系统控制语句时,可以通过使用动态SQL来实现
摘自 幸福的猪的专栏