分类: Oracle DB |
01.PL/SQL-过程语言
三层应用模型
用户界面-->应用程序服务器-->数据库和服务器端引擎
代码包括(1)客户端代码(2)服务器端代码-命名程序单元-存储程序单元-过程(函数,数据库触发器,软件包)
02.PL/SQL块
DECLARE
BEGIN
EXCEPTION
END;
提问:什么是标量变量?什么是主机绑定变量(PL/SQL中的全局变量)?复合数据类型有哪些?游标?CURSOR
FOR循环?
03.控制结构
选择
IF...THEN
...
ELSIF...THEN
...
ELSE
...
END IF;
-----------
CASE
WHEN...THEN
...
WHEN...THEN
...
ELSE
...
END CASE;
------------
区别CASE表达式-->
CASE 变量
WHEN...THEN 值
WHEN...THEN 值
ELSE 值
循环
LOOP
END LOOP;
-----------------
WHILE...LOOP
...;
END LOOP;
-------------------
FOR I IN 1...5 LOOP
...;
END LOOP;
--------------------
GOTO 动作名;
<动作名>
04.Procedure
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter1_name[mode] datatype,
...)]
IS|AS
BEGIN
END;
05.Function
CREATE [OR REPLACE] FUNCTION function_name
[(parameter1_name[mode] datatype,
...)]
IS|AS
BEGIN
06.Package
CREATE [OR REPLACE] PACKAGE
IS|AS
END;
CREATE [OR REPLACE] PACKAGE BODY
IS|AS
END;
07.关于依赖
直接依赖性问题-->
USER_DEPENDENCIES
DESCRIBE
间接依赖性问题-->
@<path to Oracle Home
directory>\rdbms\admin\utldtree SQL>EXECUTE
deptree.fill('所分析的对象类型','对象所在的Schema名称','所分析的对象名称');
08.Trigger
CREATE [OR REPLACE] TRIGGER
[BEFORE,AFTER]|[INSTEAD OF]
[INSERT,DELETE,UPDATE]
[OF column_name]
ON table_or_view_name
[REFERENCING OLD as_name|NEW as_name]
[FOR EACH ROW]
[WHEN condition]
trigger body;
09.Oracle提供的软件包
通信
DBMS_PIPE
DBMS_ALERT
UTL_SMTP
UTL_HTTP
UTL_TCP
输出
DBMS_OUTPUT
UTL_FILE
大对象
DBMS_LOB
动态SQL
DBMS_SQL
杂项
DBMS_JOB
DBMS_DDL
10.动态SQL
<本地>
EXCECUTE IMMIDIATE
<DBMS_SQL包>
执行DML步骤
1.OPEN_CURSOR
2.PARSE
3.BIND_VARIABLE
4.EXECUTE
5.CLOSE_CURSOR
据说前者比后者performance要好
11.易忽略的几个基本问题
11.1 自动处理显式游标的cursor for循环
结构如下:
DECLARE
BEGIN
END;
11.2 异常处理的三个方面:
11.2.1 预定义的Oracle错误:
NO_DATA_FOUND
TOO_MANY_ROWS
CASE_NOT_FOUND
ZERO_DIVIDE
DUP_VAL_ON_INDEX
11.2.2 非预定义的Oracle错误
PRAGMAEXCEPTION_INIT(异常名称,Oracle错误号);
11.2.3 用户定义的异常
RAISE 异常名称;
11.3 如何获取Oracle错误信息
SQLCODE可以返回Oracle错误号
SQLERRM可以返回Oracle出错信息
11.4 过程与函数的区别:函数是一个表达式的一部分,它不能作为一个完整的语句使用,过程则可以,然而函数可以在SQL命令中以及PL/SQL语句中调用,而过程不可以。
11.5 在SQL中使用任何函数都必须满足:
(1)必须是一个存储数据库对象(或者在存储软件包里)
(2)只能使用IN参数
(3)形参数据类型必须使用数据库数据类型(不允许PL/SQL数据类型,如BOOLEAN)
(4)返回的数据类型必须是数据库数据类型
(5)在执行之前不能发出事务控制语句来结束当前的事务
(6)不能发出ALTER SESSION 或ALTER SYSTEM命令
11.6 查询数据库对象结构的几种方法
数据字典
DESCRIBE
DEPTREE
IDEPTREE
11.7 关于多级触发(行级和语句级?),ORACLE采用以下的执行模型:
(1)执行所有的BEFORE语句级触发器;
(2)对遍历所涉及的每一行:a.执行所有的BEFORE行级触发器;b.锁定并修改行,执行完整性约束检测;c.执行所有的AFTER行级触发器。
(3)完成滞后完整性的约束检测;
(4)执行所有的AFTER语句级触发器。
11.8 PRAGMA AUTONOMOUS_TRANSACTION 自主事务处理
当提交自主事务处理后,COMMIT只提交子过程中的DML,不会影响当前的自主事务处理。这个Transaction通常用在写LOG信息查找错误什么的……