Oracle死锁
1、什么是死锁
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。死锁产生有四个必要的条件:互斥条件,不可剥夺条件,部分分配,循环等待,这四个条件不是充分条件,即使这四个条件同时存在,系统也不一定发生死锁,但系统一但发生死锁,这四个条件一定是满足的。
死锁产生的必要条件是:
1.互斥条件:系统中存在一个资源一次只能被一个进程所使用;
2.非抢占条件:系统中存在一个资源仅能被占有它的进程所释放,而不能被别的进程强行抢占。
3.占有并等待条件:系统中存在一个进程已占有了分给它的资源,但仍然等待其他资源。
4.循环等待条件:在系统中存在一个由若干进程形成的环形请求链,其中的每一个进程均占有若干种资源中的某一种,同时每个进程还要求(链上)下一个进程所占有的资源。
在ORACLE中,为了保证数据的一致性,在对数据库中的数据进行操作时,系统会进行对数据相应的锁定。
当程序对所做的修改进行提交(commit)或回滚后(rollback)后,锁住的资源便会得到释放,从而允许其它用户进行操作。
2、死锁测试
--创建表
CREATE ......
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 ......
lob字段不能做group by,而union中需要使用group by过滤掉重复纪录,所以不行 。 用union all就可以了。
另:union 和 union all区别:
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 ......
在处理数据时发现一个问题,Oracle对于小于1的小数,小数点前面的0是不显示的。
SQL> create table t1_number (num number);
Table created
SQL> insert into t1_number values(0.3268);
1 row inserted
SQL> insert into t1_number values(0.57965686);
1 row inserted
SQL> insert into t1_number values(52345234.5686);
1 row inserted
SQL> insert into t1_number values(4.552686);
1 row inserted
SQL> commit;
Commit complete
SQL> column num format 99999999999.9999999999999
SQL> select * from t1_number;
NUM
--------------------------
.3268000000000
.5796568600000
52345234.5686000000000
......
oracle(测试环境为oralce10g)中,若为同一库中,查询时于表名前添加用户名即可。 若为跨库处理,有两种方法。
第一种方法,用DB_link处理。而其不足之处为不能操纵大字段。如下操作:
1. 设置监听服务tnsnames.ora。
2. 创建 db_link,执行以下命令:
create database link db_link名 connect to 用户名 identified by 密码 using '监听服务名';
3. 使用链接的数据库(表名为“实际表名@db_link名”)。
select * from 表名@db_link名;
&nbs ......
一、语法:
TRANSLATE(string,from_str,to_str)
二、目的
返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string。TRANSLATE是REPLACE所提供的功能的一个超集。如果from_str比 to_str长,那么在from_str中而不在to_str中的额外字符将从string中被删除,因为它们没有相应的替换字符。to_str不能为空,Oracle将空字符串解释为NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是NULL。
三、允许使用的位置
过程性语句和SQL语句。
四、示例
SELECT TRANSLATE('abcdefghij','abcdef','123456') from dual;
TRANSLATE
--------------
123456ghij
SELECT TRANSLATE('abcde ......