PLSQL语法小结

来源:互联网 发布:淘宝登录验证怎么解除 编辑:程序博客网 时间:2024/06/04 23:31

文章部分内容收集整理自ITPUB论坛:

1.PLSQL集合:

INDEX_BY表
1).使用的时候需要先赋值后读取,否则会出现异常:ORA-01403: no data found。
2).这种数组不需要事先指定上限,下标可以不连续,可以是0或负数。
3).只存在于PL/SQL中,不能直接存储在数据库表中。
4).元素可以是任意类型。
5).元素个数没有限制。
NESTED TABLE:
1).必须进行初期化,否则会出现异常:ORA-06531: Reference to uninitialized collection。
2).创建时下标从1开始,连续,但是当元素被删除后可以是稀疏的。当下标超出允许范围时会出现异常:ORA-06532: Subscript outside of limit。
3).可以直接存储在数据库表中。可以使用SQL进行操作。存储在数据库中的嵌套表不能用PL/SQL直接操作,而只能用SQL操作。
4).元素类型不可以是BOOLEAN、NCHAR、NCLOB、NVARCHAR2或REF CURSOR。如果存在NOT NULL,那么嵌套表的元素不能是NULL。
5).元素个数没有限制。
ASSOCIATED ARRAY:
1).必须进行初期化,否则会出现异常:ORA-06531: Reference to uninitialized collection
2).下标从1开始,连续。当下标超出允许范围时会出现异常:ORA-06532: Subscript outside of limit
3).可以直接存储在数据库表中
4).元素类型不可以是BOOLEAN、NCHAR、NCLOB、NVARCHAR2或REF CURSOR。
5).元素个数有限(可变数组的大小也可以使用EXTEND方法来增加,不能够被扩展超过为可变数组类型声明的极限大小。)。
集合的方法:
COUNT 返回集合中元素的个数。
DELETE 删除集合中所有元素。
DELETE(x) 删除元素下标为x的元素,如果x为null,则集合保持不变 对VARRAY非法。
DELETE(x,y) 删除元素下标从X到Y的元素,如果X>Y集合保持不变 对VARRAY非法。
EXIST(x) 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE。
EXTEND 在集合末尾添加一个元素 对Index_by非法。
EXTEND(x) 在集合末尾添加x个元素 对Index_by非法。
EXTEND(x,n) 在集合末尾添加元素n的x个副本 对Index_by非法。
FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT。
LIMIT 返回VARRY集合的最大的元素个数,对于嵌套表和Index_by集合无用。
NEXT(x) 返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null。
PRIOR(x) 返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。
TRIM 从集合末端开始删除一个元素 对index_by不合法。
TRIM(x) 从集合末端开始删除x个元素 对index_by不合法,如果N大于COUNT,则抛出异常。
备考:
DELETE一个元素之后,COUNT会相应减少,当你对已删除的下标进行赋值,COUNT则会相应增加。
TRIM将会从末尾删除数组元素,而且不可以对被删除的下标再次赋值,必须EXTEND之后才可以。


2.FX和FM:
FX是精确匹配模式,使用FX格式后:
1).字符及对应的格式必须严格一一对应,甚至连分隔符都要相符。
2).不允许有多余的空格。
3).数值参与格式需要完全对应(或通过FM参数去掉前置0)
FM是填充模式
1).如果是字符格式化,指定FM参数后将仅返回指定属性实际所占长度(不再以空格填充)。
2).如果是数值格式化,指定FM参数会自动舍弃被格式化元素的前置0。


3.游标的加锁机制:
如果用隐性游标循环,发生异常时锁会被释放。
如果用显性游标循环,发生异常时锁不会被释放。


4.LOG ERRORS:
当你决定使用DML的LOG ERRORS特性时,你必须先创建一个错误日志表。这个表可能包含DML表的所有列----但是仅限于那些支持的数据类型。CLOB不是一种被支持的类型。
因此DBMS_ERRLOG.CREATE_ERROR_LOG 将会失败:"ORA-20069: Unsupported column type(s) found:" 意味着错误日志表未能被创建。
如果我试图在plch_employees表使用带LOG ERRORS的DML语句,ORACLE会试图去写入ERR$_PLCH_EMPLOYEES,但是无法找到这张表因此抛出异常:ORA-00942: table or view does not exist。
如果我告诉ORACLE跳过不支持的列,那么一切正常:
BEGIN
   DBMS_ERRLOG.create_error_log (
       dml_table_name => 'PLCH_EMPLOYEES'
     , skip_unsupported=>true);
END;
/


5:复合型数据类型:
对记录类型不能使用IS NOT NULL判断,否则会出现:PLS-00306: wrong number or types of arguments in call to 'IS NOT NULL'


6:TO_CHAR:
你不能在TO_CHAR(NUMBER)中使用TH格式,只能在TO_CHAR (datetime)中使用。


7.自治事务:
1).在匿名PL/SQL块中,只有顶级的匿名PL/SQL块可以被设为AT
2).如果AT试图访问被MT控制的资源,可能有deadlock发生.
3).Package 不能被声明为AT,只有package所拥有的function和procedure 才能声明为AT
4).AT程序必须以commit 或rollback结尾,否则会产生Oracle错误ORA-06519: active autonomous transaction
5).对自治事务来说,被修改过的行的当前状态是不可用的。反之,主事务能够检测到已经执行过的自治事务的结果。
假如主事务的隔离级别设成了SERIALIZABLE, 它就看不到自治事务的修改结果。
6).保存点无法在自治事务中回滚到父事务中的一个保存点,只能在内部使用保存点。


8.LIKE的通配符:
_匹配单个字符,%匹配任意个字符,*和?是忽悠人的。


9.包中初始化语句的执行顺序:
包头声明的初始值先于包体。


10.PL/SCOPE:
http://www.itpub.net/thread-1336860-1-1.html


11.PRAGMA:
PRAGMA用来指示编译器的所采取的行为
PRAGMA instruction_to_compiler;
PLSQL编译器,将在PLSQL的申明部分DECLARATION接受这样的指示,
PLSQL提供几种PRAGMA可供选项
AUTONOMOUS_TRANSACTION:通知PLSQL运行时环境,提交或者回滚任何数据库的变更,在当前块中,前提是不影响主程序或者外部事务的运行
EXCEPTION_INIT:通知编译器,让你申明的错误标识与一个特定的错误号码相对应,应当紧跟在申明的EXCEPTION后面
RESTRICT_REFERENCES:通知编译器一个包程序的纯正水平线
SERIALLY_REUSABLE:通知编译器


RESTRICT_REFERENCES PRAGMA
用法如下:
PRAGMA RESTRICT_REFERENCES ( subprogram_name, [RNDS, WNDS, RNPS, WNPS, TRUST])
subprogram_name: PL/SQL 函数的名字
RNDS: (Read No Database State) 表示该subprogram不会查询(query)数据库中的表。
WNDS: (Write No Database State) 表示该subprogram不会改变数据库中的表的数据。
RNPS: (Read No Package State) 不访问包中的变量
WNPS:(Write No Package State) 不改变包中的变量值
TRUST: 表示信任该subprogram不会违反前面的任何约束,一般用在PL/SQL调用外部函数,比如java代码。


12.%ROWTYPE:
%ROWTYPE是一种记录,如果你定义两个结构一模一样的记录类型,它们仍然不能够互换,会报类型不匹配的错误。


13.AUTHID CURRENT_USER:
一个定义为调用者权限(AUTHIDCURRENT_USER)的函数,如果它在一个VIEW或者触发器中被调用,这时是按照定义者的权限来运作的。


14.异常捕获:
如果异常发生在BEGIN之前,比如DECLARE部分或PACKAGE的变量初始化部分,那么这个异常就不会被当前块的EXCEPTION捕获,而是继续向外传播。


15.DETERMINISTIC:
1).表示给定的输入一定返回同样的输出,不随时间环境或数据库变化。利用自定义函数创建函数索引时,此函数必须具有DETERMINISTIC关键字。
2).嵌套子程序里面不可以用DETERMINISTIC。
3).使用同样的参数,加上DETERMINISTIC 之后, 函数结果会被缓存,只有一次调用。


16.RESULT_CACHE [RELIES_ON]:
1).每当表发生了修改并被提交,所有依赖于这个表的结果缓存将被清空。随后对函数的调用会导致数据再次进入缓存。
2).一旦你在会话中修改了表,那么所有依赖于这个表的缓存将被忽略。


17.DBMS_ASSERT
DBMS_ASSERT.SIMPLE_SQL_NAME检查一个名字是否为SQL中可用的简单名字:
  名字必须以字母开头,随后可跟随数字、字母或_, $, # 字符;
  允许带双引号,双引号之间可以是任意字符;
  假如双引号之内的名字本身就带有双引号,那么必须重复双引号两次来表示;
  输入参数如果前后带有空格被忽略。
  名字的长度没有被检测。
DBMS_ASSERT.qualified_sql_name则更宽松一些,允许带.(小数点,比如用在记录成员、PACKAGE里面的函数、SCHEMA OWNER等)和@ (用在DBLINK)


18.WHERE CURRENT OF, FOR UPDATE OF:









原创粉丝点击