ORACLE PLSQL使用经验总结_7
声明变量
一个新的量可在执行部分(executable section)被赋予初始值。
变量在声明部分(declaration section)被声明和初始化。
PL/SQL 变量可用于操纵数据(如计算),而无需访问数据库。PL/SQL 变量可在其他涉及变量的应用环境里再使用。PL/SQL 变量可用于暂时存储数据。
一个PL/SQL块由三部分组成:声明部分(Declarative),执行部分(Executable),异常处理部分(Exception Handling)。
BOOLEAN是个逻辑变量,它的值只能是TRUE, FALSE 和NULL。
在声明一个PL/SQL参数时,可以使用赋值运算符 := 为该参数赋初值。如果没有为参数赋初值,参数会被设置为null。如果参数被定义NOT NULL约束,那么就必须赋初值。
一个语句里只能声明一个变量。声明变量的语法:
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr]
编写可执行语句
一旦一个变量被声明,它可以在所有的子嵌套块中引用,但不能在任何外部块中引用。一个变量不能在嵌套块的执行部分被声明。
在一个PL/SQL块里的三个部分,声明部分包含变量,常数,游标和用户定义可在其他部分引用的的异常,执行部分包含以BEGIN开始的主程序,如用于操纵数据的SQL语句等,异常处理部分用于指定执行部分出现异常情况时所执行的动作。
在内部块(inner block)中声明的变量不能在外部块(outer block)引用,也可以说,在嵌套块(nested block)里声明的变量不能在封闭块(enclosing block)引用,而在封闭块定义的变量可以在嵌套块中以引用。例:
1. BEGIN
2. DECLARE
3. v_new_tech_id NUMBER := 879563;
4. v_old_tech_id NUMBER := 874512;
5. v_rows_updated NUMBER := 1;
6. BEGIN
7. UPDATE service
8. SET technician_id = v_new_tech_id
9. WHERE technician_id = v_old_tech_id;
10. v_rows_updated := SQL%ROWCOUNT;
11. END;
12. TEXT_IO.PUT_LINE (TO_CHAR(v_rows_updated));
13. END;
第12行出错,在外部块中引用了内部块中声明的变量v_rows_updated。要执行一个已存的block.sql文件,使用以下语法:
START block.sql
一个嵌套块成为封闭块里的一个可执行语句,一个块可嵌套在任何允许放置可执行语句的地方,包括执行部分和异常处理部分。
PL/SQL表达式不能包含组函数,但一个PL/SQL块里的SQL语句可以。
当一个语句中有混合的数据类型时,PL/SQL可以动态转变。如:想把一个NUMBER值存进一个VARCHAR2的变量里,PL/SQL会动态地把NUMBER值转变为VARCHAR2类型的字符值。
PL/SQL表达式可以包含SQL函数。
嵌套块里的语句不能包含一个异常段。
单行注释应以双下划线( -- )为前缀,多行注释应在 /* */ 之中。
PL/SQL中的SELECT语句必须使用INTO子句。
为避免PL/SQL编码的含糊,ORACLE推荐以下PL/SQL标识符的命名协定:
1. SQL*Plus substitution variable (SQL*Plus替代变量)p_name
2. Variable (变量)v_name
3. Constant (常量)c_name
4. SQL*Plus global variable(SQL*Plus共用变量) g_name
5. Exception(异常) e_name
与ORACLE服务器交互
外显游标属性用于检验DML语句的结果,在PL/SQL中可以给游标应用四种属性:
SQL%ROWCOUNT 受最近执行的SQL语句影响的行的数目。(一个整数值)
SQL%FOUND Boolean属性,如果最近的SQL语句影响了一行或多行,其值为TRUE。
SQL%NOTFOUND Boolean属性,如果最近的SQL语句没有影响任何行,其值为TRUE。
SQL%ISOPEN 总是为FALSE,原因是PL/SQL总是它们结束执行后立即关闭内隐游标。
PL/SQL不支持DDL 和DCL 命令。
在PL/SQL块中,使用SELECT语句从数据库检索数据,必须使用INTO子句,而该SELECT语句必须只返回一行,否则会产生错误。
PL/SQL的DML语句里不能使用IF THEN语句。
如果PL/SQL块中的SELECT语句返回超过一行数据,会产生TOO_MANY_ROWS异常,如果没有返回数据,会产生NO_DATA_FOUND 异常,这些异常可以在块的异常处理部分俘获。
阅读(2965) | 评论(0) | 转发(0) |