ORACLE杂记

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值