Oracle MERGE命令
具体来说,MERGE语句会检查原数据表记录和目标表记录。如果记录在原数据表和目标表中均存在,则目标表中的记录将被原数据表中的记录所更新(执行Update操作);如果目标表中不存在的某(些)记录,在原数据表中存在,则原数据表的这(些)记录将被插入到目标表中(执行Insert操作)。
"merge into exam_date_set using (select ? id from dual) b " +"on (exam_date_set.academyId=b.id) " +
"when matched then " +
"update set exam_date_set.examStartDate=to_date(?,'YYYY-MM-DD HH24:MI:SS'),exam_date_set.examEndDate=to_date(?,'YYYY-MM-DD HH24:MI:SS')," +
"exam_date_set.deadline=to_date(?,'YYYY-MM-DD HH24:MI:SS') " +
"when not matched then " +
"insert(exam_date_set.academyId,exam_date_set.examStartDate,exam_date_set.examEndDate,exam_date_set.deadline) " +
"values(?,to_date(?,'YYYY-MM-DD HH24:MI:SS'),to_date(?,'YYYY-MM-DD HH24:MI:SS'),to_date(?,'YYYY-MM-DD HH24:MI:SS'))";
oracle中rownum效率低的原因以及解决办法
--A低效率 select t.* from ( select * from GET_ENTER_EXAM_SCORE t where signupyear='2013' and signupseason='春季') t where rownum <100
--B高效率 select t.* from ( select b.*,rownum r from (select * from GET_ENTER_EXAM_SCORE a where signupyear='2013' and signupseason='春季' order by zkzh) b ) t where r <100
其中B中要嵌套三层是因为最里面一层用于排序,倒数第二层用于查询排好序的记录并按顺序标记rownum
如何删除存在多个重复记录中的一个
delete from i a where a.rowid<(select max(rowid) from i b where a.no=b.no)
oracle跨库查询dblink的用法
1.创建之前的工作
在创建dblink之前,首先要查看用户是否有相应的权限。针对特定的用户,使用 sqlplus user/pwd登录后,执行如下语句:
select
*
from
user_sys_privs t
where
t.privilege
like
upper
(
'%link%'
);
|
在sys用户下,显示结果为:
SYS CREATE DATABASE LINK NO SYS DROP PUBLIC DATABASE LINK NO SYS CREATE PUBLIC DATABASE LINK NO
可以看出在数据库中dblink有三种权限:
CREATE DATABASE LINK--所创建的dblink只能是创建者能使用,别的用户使用不了 CREATE PUBLIC DATABASE LINK--public表示所创建的dblink所有用户都可以使用 DROP PUBLIC DATABASE LINK--删除指定dblink
如果想要改变某个用户的权限,需要在sys用户下修改:
grant
CREATE
PUBLIC
DATABASE
LINK,
DROP
PUBLIC
DATABASE
LINK
to
scott;
|
查看dblink,有两种方式,分别如下:
1.
select
owner,object_name
from
dba_objects
where
object_type=
'DATABASE LINK'
;
2.
select
*
from
dba_db_links;
|
2. 创建dblink
create
public
database
link
LINK_NAME
connect
to
USRNAME identified
by
"
PASSWORD"
using
'(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = XXX.XXX.XXX.XXX)(PORT = 1521))
(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = XXX))
)'
;
|
注意:using后跟的是一个字符串,其中一定不要出现不必要的空格,否则会出错ORA-12514,在上面的代码中为了方便阅读其中进行了换行,可能会出现空格而导致错误,所以使用的时候将空格去掉就ok了。
这里LINK_NAM为自定的名称;USERNAME和PASSWORD为指定的oracle数据库中的用户名和密码,SERVICE_NAME如果不确定的话,可以通过以下语句获得:
show parameter service_names;
或者
select
name
,value
from
v$parameter
where
name
=
'service_names'
|
3.dblink的使用
dblink的使用相对比较简单,把一般访问本地表时的表名改为如下格式即可:[user.]table@link_name。
select
studentid
from
abc.studeng@abc_ten;
|
4.删除dblink
确定要删除的dblink名字以后,可以通过drop命令直接将其删除:
drop
public
database
link abc_ten;
Oracle中INSTR、SUBSTR和NVL的用法
INSTR用法:INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号)
返回找到的位置,如果找不到则返回0. 默认查找顺序为从左到右。当起始位置为负数的时候,从右边开始查找。若起始位置为0,返回值为0。
SELECT INSTR('CORPORATE FLOOR', 'OR', 0, 1) FROM DUAL; 返回值为0 SELECT INSTR('CORPORATE FLOOR', 'OR', 2, 1) FROM DUAL; 返回值为2 SELECT INSTR('CORPORATE FLOOR', 'OR', 2, 2) FROM DUAL; 返回值为5 SELECT INSTR('CORPORATE FLOOR', 'OR', -1, 1) FROM DUAL; 返回值为14 SELECT INSTR('CORPORATE FLOOR', 'OR', -5, 1) FROM DUAL; 返回值为5
SUBSTR用法:SUBSTR( 源字符串, 查找起始位置, [ 长度 ] )
返回值为源字符串中指定起始位置和长度的字符串。
SELECT SUBSTR('This is a test', 0, 2) value from dual; 返回值Th SELECT SUBSTR('This is a test', 1, 2) value from dual; 返回值Hi SELECT SUBSTR('This is a test', -1, 2) value from dual; 返回值t SELECT SUBSTR('This is a test', -2, 2) value from dual; 返回值st
NVL用法:NVL(eExpression1, eExpression2)
从两个表达式返回一个非 null 值。如果eExpression1的计算结果为null值,则 NVL( ) 返回eExpression2。如果eExpression1的计算结果不是null值,则返回eExpression1。eExpression1 和eExpression2可以是任意一种数据类型。如果eExpression1与eExpression2 的结果皆为 null值,则NVL( )返回NULL。
SELECT nvl('pos1',null) from dual; 返回值为pos1 SELECT nvl(null,'pos2') from dual; 返回值为pos2 SELECT nvl(null,null) from dual; 返回值为null