oracle 和informix
Oracle与sinoregal DS对比文档
一 sinoregal DS sql语句
1、创建数据库
eg1. 创建不记录日志的库testdb,参考语句如下:
CREATE DATABASE testdb;
eg2. 创建带缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解析),参考语句如下:
CREATE DATABASE testdb WITH BUFFERED LOG;
eg3. 创建无缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解析),参考语句如下:
CREATE DATABASE testdb WITH LOG;
添加字段:
alter table tableName add column varchar(10);
修改字段类型
ALTER TABLE TABLE1 MODIFY( COL1 VARCHAR(255))
删除表:
drop table table_name;
创建普通数据表:
eg1、如下语句创建了一个集团信息表cti_vccinfo:
create table cti_vccinfo(
vccid CHAR(6) not null,
vccname VARCHAR(255),
effective INTEGER default 0 not null,
agentmax INTEGER default 0 not null,
ivrmax INTEGER default 0 not null,
updatekey VARCHAR(30),
primary key (vccid) constraint PK_CTI_VI
);
更新语句:
例如想将student中的id为1000的记录的name字段更新为amigo,age字段更新为28,语句参考如下:
update student set name='amigoxie', age=28 where id='1000';
使用如下的写法也是等效的:
update student set (name, age)=('amigoxie', 28) where id='1000';
删除语句:
例如,删除student表中的所有数据,参考语句如下:
delete from student;
例如,删除student表中id为1001的数据,参考语句如下:
delete from student where id='1001';
查询语句:
我们使用select语句从数据库中查询数据,select语句的使用语法如下所示:
SELECT 字段列表(各个字段之间用英文逗号隔开)
FROM 表列表(多个表之间用英文逗号隔开)
[WHERE 查询条件]
[GROUP BY 字段列表]
[HAVING 条件]
[ORDER BY 字段列表]
[INTO TEMP 临时表的名称]
视图的创建:
create view view_name(
col1, -- 先将列明列出
col2,
col3
)as
select a.col1,
null::varchar(20) as col2 --col2列为空值
b.col3
from table1 a left join
tbale2 b on (a.id=b.id)
where 1=1
and b.type1=c.type1
函数(存储过程)的创建:
CREATE FUNCTION(PROCEDURE) function_name(
v_begin_date datetime year to day,
v_hours int) --传入值及类型
returning int --返回值类型
DEFINE name1 varchar(20); --定义参数类型
DEFINE num_1 INTEGER; --定义参数类型
DEFINE ts INTEGER; --定义参数类型
let ts = 5 ; --赋值
return ts; --返回值
end function(PROCEDURE); --结束
二 Oracle到 sinoregal DS调试
1.关于表连接的使用:
Oracle:select A.id,B.name from emp A,Customer B where A.id(+)=B.id 右连接
DS :select A.id,B.name from emp A right join Customer B on (A.id =B.id)
Oracle:select A.id,B.name from emp A,Customer B where A.id=B.id(+) 左连接
DS :select A.id,B.name from emp A left join Customer B on (A.id =B.id)
Oracle:select A.id,B.name from emp A,Customer B where A.id(+)=B.id(+) 全外连接
DS :select A.id,B.name from emp A full join Customer B on (A.id =B.id)
2.时间to_char和to_date用法:
Oracle :
select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual
//显示:08-11-07 13:22:42
select to_date('2005-12-25,13:25:59','yyyy-mm-dd,hh24:mi:ss') from dual
// 显示:2005-12-25 13:25:59
DS:
select to_char(current,'%y-%m-%d %H:%M:%S' ) from sysmaster:sysdual
//显示 16-08-06 10:26:13
select to_date('2005-12-25 13:25:59','%Y-%m-%d %H:%M:%S') from sysmaster:sysdual
//显示 2005-12-25 13:25:59
3. rownum的用法
Oralce: select rownum rn from dual;
DS :select rownum() rn from sysmaster:sysdual;
4.round函数的使用:
Oracle:select round(1/34,3)*100||'%' from dual 结果为:2.9%
select round(1/34*100,3)||'%' from dual 结果为:2.941%
DS : select round(1/34*100,1)||'%' from dual 结果为:2.9%
select round(1/34*100,3)||'%' from dual 结果为:2.941%
5.引用其他库的表:
Oracle:select * from base.table1
DS: select * from base:table1
6.分页查询:
Oracle : select * from (select rownum as rn from table_a ) where rn>=4 and rn<=10;
- -从第四条开始取,到第10条结束,共7条
DS: (1)select skip 3 * from (select first 10 * from table_a )
(2)select skip 3 first 7 * from table_a; -- 越过前3条,连续取7条
7.一条sql中使用多个rownum
Oracle:Select Rownum, to_char(add_months(to_date('20151020', 'yyyymmdd'),Rownum-1),'yyyyMM') as month from dual Connect by add_months(to_date('20151020','yyyymmdd'),rownum-2)< to_date('20160220', 'yyyymmdd')
DS:Select Rownum(),to_char((to_date('20151020', '%Y%m%d')+(Rownum_1()-1) units month),'%Y%m') as month from sysmaster:sysdual connect by (to_date('20151020', '%Y%m%d') + (rownum_2()-1) units month)< to_date('20160220', '%Y%m%d')
注:DS中的rownum()是一个计数器,当一个sql中出现多个是,使用不同的计数器,我们一共设置了四个,分别是:rownum(),rownum_1(),rownum_2(),rownum_3().执行rownum()之前,先执行call init_rownum();
最后一行,rownum-2 改为 rownum-1查询结果是一致的
8.时间计算:
oracle:(sysdate) |
DS:(current) |
ADD_MONTHS ( SYSDATE , +12) |
current +1 units year --日期加一年 |
ADD_MONTHS ( SYSDATE , +1) |
current +1 units month --日期加一个月 |
sysdate+1 |
current +1 units day --日期加一天 |
sysdate+1/24 |
current +1 units hour --日期加一小时 |
sysdate+1/24/60 |
current +1 units minute --日期加一分钟 |
sysdate+1/24/60/60 |
current +1 units second --日期加一秒 |
Oracle: Select sysdate+1 from dual
DS: select current +1 units day from sysmaster:sysdual
9.Oracle和sinoregal DS的数据类型对比:
10.时间差的计算:
Oracle: select ceil(date1 - date2) * 24 * 60 * 60) 相差秒数 FROM DUAL;
DS: select fn_dev_datetime(date1 ,date2 ) from sysmaster:sysdual
Oracle:select ceil((date1 - date2) * 24 * 60 * 60)相差分钟数 FROM DUAL;
DS: select ceil(fn_dev_datetime(date1,date2)/60 )from sysmaster:sysdual
Oracle:select ceil((date1 - date2) * 24 * 60 * 60) 相差小时数 FROM DUAL;
DS: select fn_dev_datetime((date1 ,date2 )/(60*60)) from sysmaster:sysdual
Oracle:select ceil((date1 - date2) * 24 * 60 * 60)) 相差天数 FROM DUAL;
DS: select fn_dev_datetime((date1 ,date2 ) /(60*60*24)) from sysmaster:sysdual
11.递归算法(CONNECT BY PRIOR):
如果只是一个表的connect by,不需要修改。如果是两个或多个表:
oracle:
SELECT a1.id ,a1.parent _id FROM table1 a1, table2 a2 WHERE 1 = 1
AND a1.id = a2.id
CONNECT BY PRIOR a1.dic_item_id = a1.parent_id
START WITH parent_id = '1'
DS:select a1.id ,a1.parent_id from ((SELECT a3.dic_item_id ,a3.parent_id Table1 a3
CONNECT BY PRIOR a3.dic_item_id = a3.parent_id START WITH parent_id = '1') a1, Table2a2
WHERE 1 = 1 AND a1.id = a2.id)
注:先将递归需要的表查询出来之后,在于其他表进行连接。
12.索引-oracle:
CREATE INDEX index_name
ON table_name ( "col1", "col2" ) TABLESPACE SRITNG
索引-DS:
CREATE INDEX index_name
ON table_name(col1,col2);
外键-oracle:
ALTER TABLE ACT_RU_EVENT_SUBSCR ADD ( CONSTRAINT ACT_FK_EVENT_EXEC FOREIGN KEY ( "EXECUTION_ID_" ) REFERENCES ACT_RU_EXECUTION ( "ID_" ) );
DS:
ALTER TABLE ACT_RU_EVENT_SUBSCR
ADD CONSTRAINT FOREIGN KEY (EXECUTION_ID_) REFERENCES ACT_RU_EXECUTION(ID_) CONSTRAINT ACT_FK_EVENT_EXEC;
13.计算时间差(两个日期的差值):
oralce
select ceil(date1-date2) * 24 * 60 * 60 相差秒数 FROM DUAL;
select ceil(date1-date2) * 24 * 60 相差分钟数 FROM DUAL;
select ceil(date1-date2) * 24 相差小时数 FROM DUAL;
select ceil(date1-date2) 相差天数 FROM DUAL;
DS:
select fn_dev_datetime(date1-date2) from sysmaster:sysdual 相差的秒
select ceil(fn_dev_datetime(date1-date2)/60 )from sysmaster:sysdual 相差分钟数
select ceil(fn_dev_datetime(date1-date2) /(60*60))from sysmaster:sysdual 相差小时数
select ceil(fn_dev_datetime(date1-date2)/(60*60*24))from sysmaster:sysdual 相差天数
注:fn_dev_datetime(date1,date2)函数,返回时间差是秒,date1-date2
14.求第几个季度:
Oracle : select to_char(sysdate,'q') from dual
DS: select qofyear(date1) from sysmaster:sysdual
15.求第几周:
oracle:select to_char(sysdate,'ww') from dual;
DS: select weekofyear(date1) from sysmaster:sysdual
16.存储过程中的游标的处理:
oracle:
CURSOR cursor1
IS
SELECT RPT_NAME,RPT_USER_ID
FROM FACT_CASE_USER_DAY;
OPEN cursor1;
LOOP
FETCH cursor1
INTO l_name,l_rpt_user_id;
EXIT WHEN cursor1%NOTFOUND;
insert into tb1 (col1,col2) values(l_name,l_rpt_user_id);
END LOOP;
CLOSE cursor1;
DS(隐形):
define l_name varchar(20);
define l_rpt_user_id integer;
foreach SELECT RPT_NAME,RPT_USER_ID
into l_name,l_rpt_user_id
FROM FACT_CASE_USER_DAY;
if SQLCODE=100
then exit;
end if;
insert into tb1 (col1,col2) values(l_name,l_rpt_user_id);
end foreach;
17.存储过程 — EXCEPTION
18.游标的处理——cursor
oracle:
CURSOR cursor1
IS
SELECT RPT_NAME,RPT_USER_ID
FROM FACT_CASE_USER_DAY;
OPEN cursor1;
LOOP
FETCH cursor1
INTO l_name,l_rpt_user_id;
EXIT WHEN cursor1%NOTFOUND;
insert into tb1 (col1,col2) values(l_name,l_rpt_user_id);
END LOOP;
CLOSE cursor1;
DS(显性):
prepare mycur from 'SELECT RPT_NAME,RPT_USER_ID
FROM FACT_CASE_USER_DAY';
declare attach_lists cursor for mycur ;
open attach;
loop
fetch attach into l_name_1, l_rpt_user_id_1;
if SQLCODE=100
then exit;
end if;
insert into tb1 (col1,col2) values(l_name_1,l_rpt_user_id_1);
end loop;
close myCur;
DS(隐形):
define l_name varchar(20);
define l_rpt_user_id integer;
foreach SELECT RPT_NAME,RPT_USER_ID
into l_name,l_rpt_user_id
FROM FACT_CASE_USER_DAY;
if SQLCODE=100
then exit;
end if;
insert into tb1 (col1,col2) values(l_name,l_rpt_user_id);
end foreach;
19.动态sql 的处理
Oracle:
SELECT item_name, REPLACE (exec_sql, '@DEPART_ID', v_depart_id)
INTO l_item_name, l_exec_sql
FROM stat_comm_item_cur
WHERE item_id = '12';
EXECUTE IMMEDIATE l_exec_sql INTO l_item_value;
DS:
SELECT item_name, REPLACE (exec_sql, '@DEPART_ID', v_depart_id)
INTO l_item_name, l_exec_sql
FROM stat_comm_item_cur
WHERE item_id = '12';
drop table if exists tb1;
let exec_sql_1 = l_exec_sql || 'into temp tb1 with no log';
EXECUTE IMMEDIATE exec_sql_1;
select l_exec_sql into l_item_value from tb1;
20.分页
oracle:select * from (select rownum as rn from table_a ) where rn>=4 and rn<=10; --
从第四条开始取,到第10条结束,共7条
DS: (1)select skip 3 * from (select first 10 * from table_a )
(2)select skip 3 first 7 * from table_a; -- 越过前3条,连续取7条