2009 年 05 月 14日, 星期四
Design Pattern 新解
什么是 Design Pattern?许多人一讲到 Design Pattern,就会扯到什么建筑设计,因为他们全都是看四人帮的「Design Patterns」经典本的解释,没消化就照单全收。 如果不能用更生活化的方式解释 Design Pattern,我会怀疑他们是不是真的了解 Design Pattern 的真义。 什么是 Pattern Pattern 最简单的定义是:只要是一再重复出现的事物,就是 Pattern。依照此定义,生活中就可以找到一堆 Pattern 的例子: 第四台广告中的 Pattern: 原价 ...,现在购买只要 ...,还送你一组 ...,请马上来电 ...,如忙线中请稍后再拨。 查看全文2007 年 04 月 17日, 星期二
分区表的经典比喻
分区表的经典比喻普通表呢像一个小学生用的新华字典,分区表呢像一套博士们辞海,在同一个漂亮的盒子里面(表名)有若干本辞海分册(每一册就是一个分区了)。
如果说检索一张普通表就像查新化字典,检索分区表就像查辞海了。具体而言呢,又这么几种方式:
1). 因为你知道你查的内容只会出现在某些分册里面,于是你很快的从辞海盒子 查看全文
杀掉Oralcle的一些session
一、问题的提出很多的时候我们迅速的杀掉Oralcle的一些session,理由大体如下:
1、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做shutdown immediate的时候会花费好多的时间,而我们却想用shutdown immediate的方式,而又要把数据库迅速的shutdown下来。
2、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为Inactive的状态。当我们用alter system kill session ‘sid,serial#’进行清除时,这些session的状态又变成了killed,这些就由Pmon进程来慢慢进行清除了,而你恰恰又是个急脾气。
3、 系统忽然慢了现来,你发现是某个session在做怪,想迅速把它迅速结束掉。
二、处理方法
其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个session 查看全文
2007 年 02 月 28日, 星期三
Pl/sql 和 T-Sql中事务的使用方法对比
>oracle和Sqlserver的存储过程里面使用事务是不同的
Sqlserver里面是用的Begin trans ...commit/rollback
oracle里面用的是
savepoint <sptname> ... commit/rollback to savepoint <sptname>;
或者... commit/rollback
oralle一般都使用try catch结构,在catch里面rollback
表 employee和employeeA的字段ID上建立了主键
>例子1:
[效果:]和Sqlserver的
set xact_abort on
对Oracle的模式或者方案的理解
对Oracle的模式或者方案的理解
一个模式就是一个用户以及它所有的对象.
那么oracle的用户和Sqlserver的用户的概念是大大的不同了.
创建一个用户,并在这个用户下面创建对象(过程,函数,表等)
此时,表的定义,过程,函数的定义会在System表空里面的数据字典里面
而表的记录会存放到指定的表空间的数据文件里面.
在Oracle的OEM里面删除一个用户,会提示是否删除此用户的对象,就是这个意思.
也就是说:我们exp一个用户下面的所有对象,其实就是在system表空,和其他指定的表空
里面吧数据字典和记录都导出来,
那么imp回去的时候,也是吧这些东西还到相应的表空上去,
如果还原的机器上,缺少某一个表空,就会还原失败.
注:如果有大块的存储过程代码从数据字典中读取,过多的使用存储过程会明地增加缓存的工作量,因为存储过程使通过数据块缓存被读入共享SQL区的
2007 年 01 月 23日, 星期二
关于回滚段
回滚段:
>oracle9i中自动管理回滚段:
9i开始引入自动管理回滚段,如果选择使用自动管理,那么用户就不能创建或删除回滚段.
有几个新的参数:
1.undo_management: auto表示自动管理,manual表示手动
2.undo_tablespace: 自动管理模式下,当前实例使用那个Undo表空间
[注意:]此表空间的创建必须要写成 CREATE UNDO TABLESPACE "UNDOTBS3" DATAFILE
2006 年 12 月 25日, 星期一
Sqlserver和Oracle的事务和锁机制
在SQL Server中,一个表的修改是以页面级来锁定的,对表的修改是阻塞读操作的(如Select),所以SQL Server的锁是非常昂贵的,如果不是特别指定,一个语句就是一个事务。在ORACLE中,这一切都变了,ORACLE可以提供最小的行级锁,所有对表的锁定不影响Select查询,在ORACLE中,锁的资源占用是非常小的,所以ORACLE默认开启事务,直到你提交或回滚。
--//以下是上机的实例
1>oracle的锁
在Pl/Sql Developer里面 开一个查询窗口执行
2006 年 12 月 18日, 星期一
pl/sql表原理,以及应用的例子
pl/sql表的定义:
是一维的(说明pl/sql表只能有1列,于一维数组很相似)、无边界的(表行数没有限制,动态增长,定义时并没有为其分配任何行)、由同类(pl/sql表只有1列,自然同类)元素组成的稀疏(行被赋值后,该行才会存在于表中,行不必按顺序定义,可以给表中的任何行赋值,如1行和100行赋值,他们中间可不给行赋值;VARRAY就不行,VARRAY声明后即分配内存等待被使用)集合,并通过整数来索引(单索引模式,BINARY_INTEGER来索引,充当主键,正负2的31次方减1的范围,可以为负数是因为这个行好仅仅是一个数字而已,本身并不代表顺序)。pl/sql表驻留在oracle server的私有pl/sql区域中。由于pl/sql表只是pl/sql中定义的一种结构,并不是真实可访问的表(所以不存在commit,rollback,select,insert,update,delete操作),RDBMS或SQL内核并不识别他,所以对他的操作受到限制,比如pl/sql中的DML就不能操作他,因为DML要提交给RDBMS来处理。
只能通过循环一次一行的浏览pl/sql表的内容。
1,声明pl/sql表
[语法:TYPE <table_type_name> IS TABLE OF <datatype> [NOT NULL] INDEX BY BINARY_INTEGER;]
--下面是一个例子:
declare
type empRec is record
(
empNo varchar2(50),
empName varchar2(50),
empAge number
);
TYPE emptblTYPE IS TABLE OF empRec INDEX BY BINARY_INTEGER;
tEmp emptblTYPE;
CURSOR c_dept IS SELECT * from employee;
--//定义变量
EmpCount number;
MaxEmpNo number;
BEGIN
FOR curEmp IN c_dept LOOP
tEmp(c_dept%ROWCOUNT).empNo:=curEmp.No;
END LOOP;
select count(1),max(NO) into EmpCount,MaxEmpNo from employee;
For I In 1..EmpCount Loop
DBMS_OUTPUT.PUT_LINE(tEmp(I).empNo);
End Loop;
DBMS_OUTPUT.PUT_LINE('the maxNo is:'||MaxEmpNo);
END;
使用弱类型的Ref Cursor和Record的应用
--//使用弱类型的Ref Cursor和Record的应用
declare
--声明记录类型
type empRec is record
(
empNo varchar2(50),
empName varchar2(50),
empAge number
);
--声明REF CURSOR,返回值为该记录类型
type empRefcurType is ref cursor;
--return empRec; //这儿不用制定返回
--定义REF CURSOR游标的变量
empRefcur empRefcurType;
emp empRec;
begin
open empRefcur for
'select * from employee';
--select * from employee; 使用非动态的也可以
fetch empRefcur into emp;
while empRefcur%found loop
dbms_output.put_line(emp.empNo);
dbms_output.put_line(emp.empName);
fetch empRefcur into emp;
end loop;
end;
编号问题的处理
code连续的做为一个段,找出每段的开始编号和结束编号
比如说b 的code 为 4,6,7 那么结果就是 开始编号4,结束编号4;开始编号6,结束编号7
create table CodeExample
(
name varchar2(50),
code number
);
begin
insert into CodeExample
select 'b',6 from dual
union all
select 'b',7 from dual
union all
select 'b',4 from dual
union all
select 'c',1 from dual
union all
select 'c',2 from dual
union all
select 'c',7 from dual
;
commit;
end;
--//使用子查询---------------------------
with AA as
(
select A.*,
(select min(code) from CodeExample where name=A.name and code>A.code) as nextCode
from
CodeExample A
)
select Name,
min(code) as begincode,
max(code) as endcode
from
(
select tmpA.*,
(select count(1) from AA where name=tmpA.name and code < tmpA.code and NextCode-Code > 1) as groupNo
from AA tmpA
) tmpB
group by name,groupno
order by Name,groupno;
--//使用分析函授+子查询-------------------------------
with AA as
(
select CodeExample.*,
case when Lead(name) OVER (ORDER BY Name,code)=Name then Lead(code) OVER (ORDER BY Name,code) else null end as nextCode
from CodeExample
)
select Name,
min(code) as begincode,
max(code) as endcode
from
(
select tmpA.*,
(select count(1) from AA where name=tmpA.name and code < tmpA.code and NextCode-Code > 1) as groupNo
from AA tmpA
) tmpB
group by name,groupno
order by Name,groupno;
恭喜您成功申请ITPUB BLOG
请牢记您BLOG的域名http://zxbyhcsdn.itpub.net/
您BLOG的控制面板在
http://zxbyhcsdn.itpub.net/admin.php
登陆口令就是论坛口令,BLOG的口令和论坛是捆绑的。您可以在控制面板里完成发表文章,修改名称,模版以及观察统计数据等功能
全体ITPUB BLOG的内容首页在
http://weblog.itpub.net/
可以在这里了解整个ITPUB BLOG的状况,包括最新文章,BLOG列表,排名,统计数据等
怎样才可以使自己的BLOG变得知名?
只有宣传才可以使网站的访问增多,您可以把您的BLOG连接写在签名档里,或者在帖子里介绍给别的会员,也可以在别的网站和现实场合进行广泛的宣传。如果您的BLOG能被搜索引擎收录,那也对增加流量有所帮助。这也许需要您到一些常用搜索引擎那里登录一下。百度的登录入口:
http://www.baidu.com/search/url_submit.html
google的登录入口
http://www.google.com/intl/zh-CN/add_url.html
登录可以帮助您的BLOG尽快被收录(否则可能要等待比较长的时间)
法律责任
ITPUB是中华人民共和国境内网站,请大家在发表言论时注意遵守中华人民共和国法律,尊重知识产权,ITPUB只提供寄存平台,任何网友的个人言论都不代表ITPUB的观点,ITPUB也不会为网友的个人行为承担法律义务和责任。