sysbase转oracle,[原创]sysbase使用经验

现在项目组使用的数据库是Sybase,之前都是用Oralce的,在熟悉Sybase时发现Sybase的资料还是很少的(尤其网上资料),摸索很长时间后才慢慢适应过来,闲余之时,总结了下Sybase IQ的使用心得,由于之前用的的Oralce,所以有的差异也是和Oralce作的比较。

希望能帮到Sybase初学者。

==================================使用总结===========================================

1、字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样;

2、等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较;

3、GROUP BY 可以根据SELECT字段或表达式的别名来 汇总,在编写时也尽量避免SELECT 语句的别名与FROM表中的字段有重复,不然会出现莫名其妙的错误;

4、FROM后的子查询 要定义别名才可使用;

5、存储过程要返回IQ系统错误信息 SQLCODE || ERRORMSG(*) :(两者都为EXCEPTION后第一条SQL语句才有效果);

6、IQ中若采用 FULL JOIN 连接则不能使用 WHERE 条件,否则FULL JOIN将失效,要筛选条件则用子查询先过滤记录后再FULL JOIN;

7、建表时,字段默认为非空;

8、UPDATE语句,如果与目标表关联的表有多条,则不会报错,而是随机取一条更新(第一条);

9、RANK() OVER(PARTITION BY .. ORDER BY ..) 分组分析函数,相同的ORDER BY值,返回顺序值一样,且PARTITION BY 只支持一个字段或一个字段组(需多个字段分组的则要用 || 拼为一个字段(待确认,该问题以前碰过一次,再次验证却不存在这问题))

10、返回可读的 全局唯一字符:UUIDTOSTR(NEWID())

11、存储过程隐式游标语法:

FOR A AS B CURSOR FOR SELECT ... FROM ...

DO

.... 过程语句

END FOR;

需要注意的时,这边的A 和 B 在 过程语句中都不能引用,所以为避免过程语句其他字段名与FOR SELECT 语句的字段名称重复,FOR SELECT 语句的字段最好都定义别名区分

12、根据SELECT 语句建立表的方法(ORACLE的CREATE TABLE)为 SELECT .. INTO table_name FROM ..; 其中如果在table_name加前缀#,则为会话级临时表,否则为实体表;

13、因Sybase为列存储模式,在执行上INSERT语句会比UPDATE语句慢,尤其表数据越多INSERT效率就越慢;所以在ETL时建议多用UPDATE而不是INSERT

14、虽说Sybase为列存储模式,每个字段上都有默认索引,但对于经常的两表的关联键还是要建立索引否则会经常报QUERY_TEMP_SPACE_LIMIT不足的错误;

15、存储过程中也可以显示的执行DDL语句,这点与Oracle不同;

16、空字符串''在Sybase中也是个字符而不是null值,这点要注意;

17、调整SESSION的临时空间SET TEMPORARY OPTION QUERY_TEMP_SPACE_LIMIT = '150000'; 15000为大小,如写0则没限制大小

==================================常用函数===========================================

字符串函数

1)ISNULL(EXP1,EXP2,EXP3,...) :返回第一个非空值,用法与COALESCE(exp1,exp2)相同

3)TRIM(exp) :去除两边空格

4)DATEFORMAT(date_exp,date_format) :日期型转字符型;

5)STRING(exp):转为字符型;

6)SUBSTRING(exp,int-exp1,):截取exp从int-exp1开始,截取int-exp2个字符;

7)REPLACE(o-exp,search-exp,replace-exp):从o-exp搜索search-exp,替换为replace-exp;

8)SPACE(int_exp):返回int个空格;

8)UPPER(exp):转为大写字母,等价于UCASE(exp);

8)LOWER(exp):转为小写字母,

8)CHARINDEX(exp1,exp2):返回exp2字符串中exp1的位置!定位,exp1 查找的字符,exp2 被查找的字符串;

8)DATALENGTH(CHAR_EXPR):在char_expr中返回字符的长度值,忽略尾空;

8)RIGHT(char_expr,int_expr):返回char_expr右边的int_expr个字符;

8)LEFT(char_expr,int_expr):返回char_expr左边的int_expr个字符;

8)REPLICATE(char_expr,int_expr):重复char_expr,int_expr次;

8)STUFF(expr1,start,length,expr2):用expr2代替epxr1中start起始长为length的字符串;

8)REVERSE(char_expr):反写char_expr中的文本;

8)LTRIM(char_expr):删除头空;

8)RTRIM(char_expr):删除尾空;

8)STR(float_expr]):进行数值型到字符型转换;

8)PATINDEX("%pattern%",expression):返回指定样式的开始位置,否则为0;

8)NULLIF(exp1,exp1):比较两个表达式,如果相等则返回null值,否则返回exp1

8)NUMBER(*):返回序号,相当于ORACLE的rowid,但有区别;

其他函数

8)RANK() OVER(PARTITION BY .. ORDER BY ..) 分组分析函数,相同的ORDER BY值,返回顺序值一样,且PARTITION BY 只支持一个字段或一个字段组(需多个字段分组的则要用 || 拼为一个字段(待确认))

8)返回可读的 全局ID UUIDTOSTR(NEWID())

8)COL_LENGTH(tab_name,col_name):返回定义的列长度;兼容性:IQ&ASE

8)LENGTH(exp):返回exp的长度;兼容性:IQ

转换函数

8)CONVERT(datetype,exp):字符转日期型 或DATE(exp);兼容性:IQ&ASE

format-style值  输出:

112            yyyymmdd

120  yyyy-mm-dd hh:nn:ss

SELECT CONVERT(date,'20101231',112),CONVERT(varchar(10),getdate(),120) ;

--结果

2010-12-31                   2011-04-07

8)CAST(exp AS data-type):返回转换为提供的数据类型的表达式的值; 兼容性:IQ

日期函数

8)DAY(date_exp):返回日期天值,DAYS(date_exp,int):返回日期date_exp加int后的日期;MONTH与MONTHS、YEAR与YEARS同理;

8)DATE(exp):将表达式转换为日期,并删除任何小时、分钟或秒;兼容性:IQ

8)DATEPART(date-part,date-exp): 返回日期分量的对应值(整数);

8)GETDATE():返回系统时间;

8)DATENAME(datepart,date_expr):以字符串形式返回date_expr指定部分的值,转换成合适的名字;

8)DATEDIFF(datepart,date_expr1,date_expr2):返回date_expr2-date_expr1,通过指定的datepart度量;

8)DATEADD(date-part,num-exp,date-exp):返回按指定date-part分量加num-exp值后生成的date-exp值;兼容性:IQ&ASE

date-part日期分量代表值:

缩写  值

YY   0001-9999

***   1-4

MM   1-12

WK   1-54

DD   1-31

DY   1--366

DW   1-7(周日-周六)

HH   0-23

MI   0-59

SS   0-59

MS   0-999

数值函数

8)CEIL(num-exp):返回大于或等于指定表达式的最小整数;兼容性:IQ&ASE;

8)FLOOR(numeric_expr):返回小于或等于指定值的最大整数;

8)ABS(num-exp):返回数值表达式的绝对值;兼容性:IQ&ASE;

8)TRUNCNUM(1231.1251,2):截取数值;不四舍五入;

8)ROUND(numeric_expr,int_expr):把数值表达式圆整到int_expr指定的精度;

8)RAND():返回0-1之间的随机浮点数,可指定基值;

8)SIGN(int_expr):返回正+1,零0或负-1;

8)SQRT(float_expr):返回指定值的平方根;

8)PI():返回常数3.1415926;

8)POWER(numeric_expr,power):返回numeric_expr的值给power的幂;

8)EXP(float_expr):给出指定值的指数值;

==================================常用DDL语句===========================================

Sybase中DDL语句不能修改字段的数据类型,只能修改空与非空:

1.删除列:

ALTER TABLE table_name DELETE column_name;

2.增加列:

ALTER TABLE table_name ADD (column_name DATA_TYPE  NULL);

3.修改列的空与非空:

ALTER TABLE table_name MODIFY column_name  NULL;

4.修改列名:

ALTER TABLE table_name RENAME old_column_name TO new_column_name;

5.快速建立临时表:

SELECT * INTO table_name FROM .....;

6、修改表名:

ALTER TABLE old_table_name RENAME new_table_name

7.增加主键约束:

ALTER TABLE tb_name ADD CONSTRAINT pk_name PRIMARY KEY(col_name,..)

8.删除主键约束:

ALTER TABLE tb_name DROP CONSTRAINT pk_name;

9.建立自增长字段,与Oracle的SEQUENCE类似:

CREATE TABLE TMP_001 (RES_ID INTEGER IDENTITY NOT NULL);

10.添加表注释:

COMMENT ON TABLE table_name IS '....';

11.创建索引:

CREATE INDEX index_name ON table_name(column_name);

---Sybase 游标使用

Sybase  游标使用例子

---游标使用 (游标名字为appeal_num_cursor)

DECLARE @serial_112 int, @dir_num  char(15),@complaint_time  datetime

--申明一个游标

DECLARE  appeal_num_cursor  CURSOR

FOR SELECT  serial_112,dir_num,complaint_time FROM #iptv_guang  order by dir_num,complaint_time

--打开一个游标

OPEN  appeal_num_cursor

--循环一个游标

FETCH  /*NEXT FROM*/  appeal_num_cursor INTO@serial_112,@dir_num,@complaint_time

WHILE @@SQLSTATUS = 0     -- @@FETCH_STATUS = 0  --

BEGIN

declare @c_num  int,@appeal_numint

select @c_num = appeal_num from#iptv_guang where dir_num = @dir_num

if @c_num = 0

begin

select @appeal_num= 1

end

else begin

select @appeal_num= @c_num + 1

end

update #iptv_guang

set appeal_num =@appeal_num

where dir_num = @dir_num and

complaint_time = @complaint_time  and

serial_112 = @serial_112

FETCH  /*NEXT FROM*/   appeal_num_cursor INTO@serial_112, @dir_num,@complaint_time

END

--关闭游标

CLOSE appeal_num_cursor

--释放资源

DEALLOCATE cursor appeal_num_cursor

内容由用户发布,不代表本站观点。如发现有害或侵权内容。请点击这里

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值