索引的Selectivity
选择性,表示一个行集当中的一小部分行 这个行集可以是基表,视图,或者一个join的结果集,或者一次group by操作 选择性受限于查询谓词,比如,last_name=\'Smith\',或者一个联合谓词,比如,last_name=\'Smith\' ADN job_type=\'Clerk\' 一个谓词就像一个过滤器,从行集当中过滤掉某些行 &nb
深入理解Oracle表(2):驱动表的那些事儿
以一个比较两本字典来做例子: 一本字典有索引目录(dict a), 一本没有(dict b) 现在要找出所有a开头的单词的异同 那么比较的时候,你会怎么比较? 合理的做法应该是以没有索引的字典dict b开始, 找到a开头的那一页, 然后对于每个单词, 通过使用索引在dict a中找到相应的条目
深入理解Oracle表(1):ORDERED和USE_NL
ORDERED好理解,就是表示根据 from 后面表的顺序join,从左到右,左边的表做驱动表 use_nl(t1,t2):表示对表t1、t2关联时采用嵌套循环连接,其并不能让优化器确定谁是驱动表或谁是被驱动的表 USE_NL(),先看看oracle doc怎么说: In this statement, the USE_NL hint explicitly chooses a nested loops joi
Oracle监听器的常用操作手册
大纲:LSNRCTL> help The following operations are available An asterisk (*) denotes a modifier or extended command: start stop status services version reload save_config trace spawn change_password quit exit set* show* ps -ef|grep tnslsnr 列
存储过程的运用之print_table
create or replace procedure print_table ( p_query in varchar2, p_date_fmt in varchar2 default \'dd-mon-yyyy hh24:mi:ss\' ) -- this utility is designed to be installed ONCE in a database and used -- by all. Also, it is nice to have roles enabled so that queries by -- DBA\'s that use a role to gain access to the DBA_* views still work -- that is the purpose of AUTHID C
切莫硬编码VARCHAR2长度
看个例子先,DECLARE think_big VARCHAR2(2000); 不看不知道,一看吓一跳呀,这容器够大也够辣,啥俺们都能吞进去,绝不挑食 然而,这绝对是一颗定时炸弹 Oracle 8时代,VARCHAR2的最大长度是2000 Oracle 8i之后,变成了4000, 为了向后兼容,还会变成啥哩?who knows?
捕获声明部分的异常
异常捕获作用于执行部分,而在声明部分抛出的异常是无法被捕获的 比如,DECLARE var_id number :=\'Think\'; BEGIN NULL; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(\'Exception captured\'); END; 处理的方法,其实也很简单,就是在外面套一层,天凉了,多件外套哟~BEGIN DECLARE var_id number :=\'Think\'; BEGIN NULL; EXCEPTION
SUBTYPE正规化数据类型
SUBTYPE是类型的别名,倘若需求变更,只需修改一个地方的定义,其他代码都不用改动 也许我们习惯了变量来代表未知数,但却不习惯变量来代表变量类型 而subtype正是起到了这样的作用,他可以用一个新的类型变量来代表一个已知的类型 如果你定义的变量很可能需要改变变量类型,则使用subtype能
触发器内的代码封装
实验准备:hr@ORCL> drop table t purge; Table dropped. hr@ORCL> create table t (code number); Table created. hr@ORCL> create table t_audit (code number,ins_date date); Table created. hr@ORCL> create or replace trigger tri_audit_t 2 before insert 3 on t 4 for each row 5 begin 6 insert into t_audit values(:new.code,sysdate); 7 end; 8 / 同时打开两个session,
INSTEAD OF 触发器的使用陷阱
对于两张表以上关联起来的视图,Oracle是分不出来应该对哪个表进行更新 而INSTEAD OF 触发器实现了我们对视图DML的需求,显示的告诉告诉Oracle要更新哪个表 和其他类型触发器不同的是,INSTEAD OF 触发器实际上并不是由某个事件触发的 语法:CREATE OR REPLACE TRIGGER trigger_name INSTEAD OF operation --delete,updat
SELECT INTO 技巧:0 & 1问题
当我们必须从一个表选择数据插入到临时变量,但所选的数据或者存在或者不存在 也就是返回或者0行或者1行 那么该如何有效的避免数据不存在的情况? 下面有几种技巧,希望可以帮到你 方法一:DECLARE l_sal emp.sal%TYPE; p_empno emp.empno%TYPE := 123; -- Invalid empno
PLS_INTEGER类型对性能的些许奉献
如果用PLS_INTEGER值运算,Oracle会使用原生机器算法 其他的所有数值型的数据类型都和NUMBER数据类型一样使用C语言算法库 结果就是PLS_INTEGER值的处理速度比NUMBER型的整数快很多 而且,PLS_INTEGER在移植硬件平台时不会遇到兼容性问题 对于密集型的整数运算,Think
显示游标的使用详解
显示游标就是在声明单元明确定义的SELECT子句,并同时指定一个名字 通过这个名字规范化地引用游标属性,同时在OPEN,FETCH,CLOSE语句中通过名字来引用显示游标 INSERT,UPDATE,DELETE或者MERGE都没有显示游标这一说 ㈠ 声明显示游标 语法: CURSOR cu
浅析IF和ELSIF的不平等
之前写过一篇博客,叫:Oracle PL/SQL 从if 到 then的“艺术鉴赏”,地址:点击打开链接 现在范围扩展至每个平行的IF条件,是否应该注意点啥 在条件是平行的时候,是否IF一定是可以无序的呢? 先看个小实验:hr@ORCL> ed Wrote file afiedt.buf 1 create or replace procedure p_test_if(p_num pls_integer) 2 as 3 v_num
DML触发器的缺憾
TOM说过他希望三样东西不曾存在:触发器,自治事务,WHEN OTHERS 级联删除、级联修改,在设计良好的系统中是不存在的 即使有,那也是小概率事件,必须专门写一段脚本来解决,而不是作为常规功能存在 不得不用触发器,要么是原系统模块化做得不够好,要么是不允许改动原有的
异常的定义、抛出和处理
任何错误都叫异常,不期而遇时,执行单元必须交割控制权,这是一个肉包子打狗--有去无回的过程 PL/SQL引擎对系统异常、用户异常或者应用异常皆是一视同仁 异常仅是异常吗?有些异常如NO_DATA_FOUND,我们更愿意待他是逻辑的一个分支 下面详细介绍异常的定义、抛出和处理 ㈠
在sqlplus中使用帮助系统
① 以system用户登入 ② 到/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/help 执行helpbld.sql 这时会有两个输入值 第一个是:/u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/help 第二个是:执行help.sql help.s
PL/SQL每日一题:含有NULL的IF条件
哪些选项在执行之后会显示"Hello Earth"?(A) DECLARE l_total NUMBER; l_name VARCHAR2 (10) := \'PL/SQL\'; BEGIN IF l_name = \'PL/SQL\' OR l_total > 100 THEN DBMS_OUTPUT.put_line (\'Hello Earth\'); ELSE DBMS_OUTPUT.put_line (\'Hello Moon\'); END IF; END; / (B) DECLARE l_total NUMBER; l_name VARCHAR2 (10) := \'PL/SQL\'; BEGIN IF l_total > 100 THEN DBMS_OUTPUT.put_line (\'Hello Earth\'); ELSE
记一条子查询的SQL优化
表a 中有上百万条记录,且不断有新记录插入。 现在要汇总此表中小于某个时间的记录条数,SQL两种写法如下: 写法一:select count(*) from a where date < to_date(\'20100101\',\'YYYYMMDD\') ; 写法二:select count(*) from ( select * from a where date < to_date(\'20100101\',\'YYYYMMDD\') ) ; 结果发
编写健壮的PL/SQL代码(一):同字段同类型、%TYPE、SUBTYPE
面对每天繁重的开发任务和交付工期的压力 我们不会花太多的时间(更多的时候是根本没时间去考虑或经验不够丰富)考虑自己的代码在未来会如何? 或者说在相关环境变化后还能否工作?面对需求变化被修改的量有多大? 说的直白一点,就我们写出的代码没有前瞻性,不够健壮,自适应能力太差 将