1、使用%TYPE
在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据。在这种情况下,变量应该拥有与表列相同的类型。例如,students表的first_name列的类型为VARCHAR2(20),我们可以按照下述方式声明一个变量
DECLARE
v_FirstName VARCHAR2(20);
但是如果first_name列的定义改变了会发生什么(比如说表改变了,first_name现在的类型变为VARCHAR2(25))?那就会导致所 有使用这个列的PL/SQL代码都必须进行修改。如果你有很多的PL/SQL代码,这种处理可能是十分耗时和容易出错的。
这时,你可以使用”%TYPE”属性而不是将变量类型硬性编码。
例如:
DECLARE
v_FirstName students.first_name%TYPE;
通过使用%TYPE,v_FirstName变量将同students表的first_name列的类型相同(可以理解为将两者邦定起来)。
每次匿名块或命名块运行该语句块以及编译存储对象(过程、函数、包、对象类和触发器)时,就会确定该类型。
使用%TYPE是非常好的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。
例如:
declare
v_id hr.jobs.job_id%type;
v_title hr.jobs.job_title%type;
begin
select job_id,job_title into v_id,v_title
from hr.jo ......
序列(SEQUENCE)序列是一数据库对象,利用它可生成唯一的整数。一个序列的值是由特殊的Oracle程序自动生成,因此序列避免了在应用 层实现序列而引起的性能瓶颈。该序列为上升序列,由1开始,增量为1,没有上限。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降 序,序列可由比最大值小的值开始,缺省值为序列的最大值。修改序列可以:? 修改未来序列值的增量。
ORACLE没有象SQL SERVER中一样的自增加字段,要实现只能通过SEQUENCE来实现
1.创建序列:
create sequence your_seq
nocycle
maxvalue 9999999999
start with 1;
2.使用触发器实现自增:
create or replace trigger your_seq_tri
before insert on your_table1 for each row
declare
next_id number;
begin
select your_seq.nextval into next_id from dual;
:new.id := next_id;
end;
在oraclek中,为了方便我常常用触发器及序列结合起来实现,下面就是一个示例。
先建表、再建序列、然后是触发器,最后测试=============================================
--为主键指定序列编号
--2003-10-8 15:53
======================================== ......
使用Oracle特有的查询语法, 可以达到事半功倍的效果
1. 树查询
create table tree (
id number(10) not null primary key,
name varchar2(100) not null,
super number(10) not null // 0 is root
);
-- 从子到父
select * from tree start with id = ? connect by id = prior super
-- 从父到子
select * from tree start with id = ? connect by prior id = super
-- 整棵树
select * from tree start with super = 0 connect by prior id = super
2. 分页查询
select * from (
select ......
这次是应黎明网络的邀请,去深圳边防检查指挥中心进行ORACLE的培训。培训分二期,每期4天,排在AIX的培训之后。
上课的地点就在罗湖口岸,学员来自各个分站:深圳湾,皇岗口岸,罗湖口岸,总指挥中心,小梅沙,甚至还有汕头和惠州的同行过来听课,所以说培训的规格还是挺高的。其中有一位杨警官,听说还是高级警官,虽然司职挺高,不过,在她的带领下,学员们都非常认真,丝毫没有政府机关那种”走过场”的作风。他们在小梅沙的研发基地花了2年时间,开发了一套边检系统,命名为“梅沙系统”。梅沙系统的OS采用IBM的AIX,数据库采用ORACLE 9I。据说“梅沙系统”计划在全国边检推广。
此次培训可说是非常成功。虽然是警察,可是学员非常认真好学。在培训期间,还帮他们解决了一个小小的ORACLE复制的问题:他们需要不定期同步ORACLE开发数据库。我问他们源数据库可不可以DOWN机,他们说都是开发数据库,数据量不大,都可以DOWN机。最终,我建议他们可以采用复制ORACLE物理文件的方法,这种方法对于他们来说好理解,跟他们平常复制文件差不多,只不过要理解一些概念:实例,ORACLE物理结构,口令文件,监听,服务,网络连接以及一些实例参数.
......
这次去汕头是给汕头电信讲课,主讲ORACLE数据库性能优化,为期4天.从罗湖汽车站出发,走深汕高速,大约4,5个钟就到汕头了.
出发时是傍晚,车子在深汕高速行进,夕阳西下,落日的余辉照映在公路两边的丘陵,山塘上,看上去很美。深汕高速大部分是沿着海岸线蜿蜒,所以,有时在车上就能够看到海,落日的余辉照在大海上,波光鳞鳞,加之海风习习,是我喜欢的那种感觉。我没有心思观看车上的电影,大部分时间我都是打开车窗,饱览海岸风光。公路两边很多小山,不高,但看上去很好玩,好比家乡后面的小山,小的时候我们经常爬上去玩,或在山坡里玩赛跑,看谁第一个从山下跑到山顶,从山顶跑到山窝。童年的欢乐现在很难重拾,我只能倚着车窗,沉禁在童年欢乐的回忆中。
进入汕头市区,迎面也是一座斜拉索大桥,汕头电信的朱俊峰主任在车站等候多时,时间已是晚上9点多了,我们在一家餐厅吃完饭,朱主任就开车送我到龙湖宾馆。
汕头电信的朋友,参加此次培训的都比较年轻,估计很多从大学毕业出来没多久,所以问题也特别的多,课堂气氛热烈,有时差点没把我搞蒙。呵呵,年轻人总是很有激情,记得在讲ORACLE SQL优化时,很多学员直接将他们平时觉得很慢的问题SQL发给我,让我 ......
ORACLE中Like与Instr性能大比拼
作者:丹臣 | 【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】
地址:http://rdc.taobao.com/blog/dba/html/246_like_instr_performance.html
t表中将近有1100万数据,很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标。但经过实际测试发现,like的效率与instr函数差别相当大。下面是一些测试结果:
SQL> set timing on
SQL> select count(*) from t where instr(title,’手册’)>0;
COUNT(*)
———-
65881
Elapsed: 00:00:11.04
SQL> select count(*) from t where title like ‘%手册%’;
COUNT(*)
———-
65881
Elapsed: 00:00:31.47
SQL> select count(*) from t where instr(title,’手册’)=0;
COUNT(*)
———-
11554580
Elapsed: 00:00:11.31
SQL> select count(*) from t where title not like ‘%手册%’;
COUNT(*)
———-
11554580
另外,我在另外一个2亿多的表,使用8个并行,使用like查询很久都不出来结果,但使用ins ......