【序】
为了在工作中写存储过程,。同时,我准备写学习《精通 Oracle 10g PL/SQL 编程》(水利水电)一书的学习笔记。
这些你能不能写全:
Data Query Language--SELECT
Data Manipulation Language--INSERT,UPDATE,DELETE
Transactional Control Language--COMMIT,ROLLBACK,SAVEPOINT
Data Definition Language--CREATE TABLE,ALTER TABLE,DROP TABLE
Data Control Language--GRANT,REVOKE
一次应聘面试中,我就没能答出此类问题。想来只有惭愧,无他。
PL/SQL 能将 SQL 语句组合成块,一次传输,降低了网络开销,此等高效,往日用 SQL Server 时可没这等好事。
** PL/SQL ** ** 块结构 **
DECLARE
/* 定义部分 */
BEGIN
/* 执行部分 */
EXCEPTION
/* 例外处理部分 */
END; /* 块结束标记,此处有分号 */
/ /* 这是命令行中的结束符 */
四大块类型
匿名块、命名块、子程序(过程、函数、包)、触发器
四大变量类型
标量 (Scalar) 、复合 (Composite) 、参照 (Reference) 、 LOB(Large Object)
Composite:PL/SQL 记录、 PL/SQL 表、嵌套表、 VARRAY
参照:游标变量 (REF CURSOR) 、 对象类型变量 (REF obj_type)
LOB: 内部 LOB(CLOB,BLOB,NCLOB) 、外部 LOB(BFILE)
DECLARE
v_num NUMBER(6,2); ß 变量定死了长度,将来无法动态改变,只能手动修改
v_num tbl.num%TYPE; ß 动态确定新的类型和长度
挺像 Delphi: 1 变量赋值 := 2 记录 RECORD
在命令行中写 SQL 语句时注意:单条结束要用 ; 模块结束要用 / 才能显示你的查询
不重复显示查询: SELECT DISTINCT *FROM A_TBL
处理 NULL : NVL(expr1,expr2) 如果 expr1 是 null 则返回 expr2; 如果不是则返回 expr1 两者类型要匹配
删除表数据并释放空间: TRUNCATE TABLE
Oracle 不允许其他用户读取脏数据(未提交事务),确保数据库数据的读一致性
加锁,确保同一时间对文件的操作只能有一人
Savepoint 用于取消部分事务,事务结束后自动删除所有保存点。
只读事务: SET TRANSACTION READ ONLY;
或者: exec dbms_transaction.read_only
分组函数
MAX 、 MIN 、 AVG 、 SUM 、 COUNT 、 VARIANCE( 方差 ) 、 STDDEV( 标准偏差 )
GROUP BY 用于对查询结果进行分组统计――比如每组最大值
HAVING 用于限制分组显示结果――比如最大值小于 2800
ROLLUP 在原统计结果基础上生成横向小统计
CUBE 在原统计结果基础上生成纵向小统计
** Oracle ** ** 的流程控制语句 **
IF 语句
IF THEN
ELSIF THEN
ELSE
END IF;
CASE 语句 (9i)
CASE
WHEN THEN
ELSE
END CASE;
基本循环
LOOP
EXIT[WHEN ];
END LOOP ;
WHILE 循环
WHILE LOOP
END LOOP ;
FOR 循环
FOR _v in[REVERSE] lo..hi LOOP
END LOOP ;