存档
Sybase ASE在15.0.2后支持用户自定义函数,但是只能返回标量值,且调用的时候必须在函数名前加创建者的用户名,这一点很不友好哦。数据库的dbowner默认就有创建函数的权限。普通的用户默认不具有创建函数的权限。
用户escourt4创建自定义函数的时候报下面的错误:
Msg 10331, Level 14, State 1:
Server 'TEST', Procedure 'datefmt_lzf', Line 4:
CREATE FUNCTION permission denied, database ultranms2, owner dbo
但是Sybase自动的客户端工具Sybase Central中却没有能够授予创建函数权限的地方。
只能授予创建缺省值(create default),创建过程(create procedure),创建规则(create rule),创建表(create table),创建视图(create view),创建加密密钥的权限。
--gcc安装---
1 查看sun os版本
uname -a的命令查看系统版本。得知是SunOS 5.8。
SunOS 5.8 叫做Solaris 8
SunOS 5.9 叫做Solaris 9,以后就没有5.x的说法了,到Solaris 10了。。。
2 安装gcc
1. 到www.sunfreeware.com下载gcc-3.4.6-sol8-sparc-local.gz
2. gunzip gcc-3.4.6-sol8-sparc-local.gz
3. pkgadd -d gunzip gcc-3.4.6-sol8-sparc-local
4. 手工设置root环境变量,添加PATH 、LD_LIBRARY_PAT
export PATH=$PATH: /usr/local/bin
export LD_LIBRARY_PATH=$ LD_LIBRARY_PATH: /usr/local/lib
完毕后发现gcc -v报错:ld.so.1: gcc: fatal: libintl.so.3: open failed: No such file or directory,那么要安装libintl库
3 安装libintl库
1. 从www.sunfreeware.com下载libintl-3.4.0-sol8-sparc-local.gz
2. gunzip libintl-3.4.0-sol8-sparc-local.gz
3. pkgadd -d libintl-3.4.0-sol8-sparc-local
完毕后发现gcc -v报错:ld.so.1: gcc: fatal: libiconv.so.2: open failed: No such file or directory,那么要安装libiconv库
convert函数的style截止到ASE15.0.3有以下的样式!
Date format conversions using the style parameter
Without century (yy) |
With century (yyyy) |
Standard |
Output |
- |
0 or 100 |
Default |
mon dd yyyy hh:mm AM (or PM) |
1 |
101 |
USA |
mm/dd/yy |
2 |
2 |
SQL standard |
yy.mm.dd |
3 |
103 |
English/French |
dd/mm/yy |
4 |
104 |
German |
dd.mm.yy |
5 |
105 |
dd-mm-yy |
|
6 |
106 |
dd mon yy |
|
7 |
107 |
mon dd, yy |
|
8 |
108 |
HH:mm:ss |
|
- |
9 or 109 |
Default + milliseconds |
mon dd yyyy hh:mm:ss AM (or PM) |
10 |
110 |
USA |
mm-dd-yy |
11 |
111 |
Japan |
yy/mm/dd |
12 |
112 |
ISO |
yymmdd |
13 |
113 |
yy/dd/mm |
|
14 |
114 |
mm/yy/dd |
|
14 |
114 |
hh:mi:ss:mmmAM(or PM) |
|
15 |
115 |
dd/yy/mm |
|
- |
16 or 116 |
mon dd yyyy HH:mm:ss |
|
17 |
117 |
hh:mmAM |
|
18 |
118 |
HH:mm |
|
19 |
hh:mm:ss:zzzAM |
||
20 |
hh:mm:ss:zzz |
||
21 |
yy/mm/dd HH:mm:ss |
||
22 |
yy/mm/dd HH:mm AM (or PM) |
||
23 |
yyyy-mm-ddTHH:mm:ss |
更新:2021-09-23
ASE 16.0 SP02 新增日期时间样式:
Without century (yy) |
With century (yyyy) |
Standard |
Output |
36 | 136 |
<hh:mm:ss.zzzzzz>AM (PM) |
|
37 | 137 |
<hh:mm.ss.zzzzzz> | |
38 |
138 |
<mon dd yyyy hh:mm:ss.zzzzzz>AM (PM) | |
39 |
139 |
<mon dd yyyy hh:mm:ss.zzzzzz> | |
40 |
140 |
<yyyy-mm-dd hh:mm:ss.zzzzzz> |
在上一篇文章中,查看表中列属性的SQL语句
查看Oracle中表的简要列属性信息。利用上面的SQL语句,可以改进出来统计表所占物理存储空间大小的语句。
在Oracle中number数字类型所占的空间,计算公式为:
number(p,s) 占用的字节数为: floor( ( p + 1 ) / 2 ) + 1
select object_name,sum(decode(data_type,'NUMBER',floor((col_length+1)/2) + 1,col_length)) table_size
from
(select object_name,column_name,data_type,decode(data_precision,NULL,data_length,data_precision) col_length
from
(select o.name object_name,c.column_name column_name,c.data_type,c.data_length,c.data_precision,c.data_scale
from sys.tab$ t,dba_tab_cols c,sys.obj$ o,sys.user$ u
where o.obj#=t.obj#
and o.name=c.table_name
and c.owner=u.name
and o.owner#=u.user#
and u.name='SCOTT'
/*and o.name='EMP'*/
) tab_cols
) col_len
group by object_name;
上面的SQL语句统计用户scott的所有表占用的物理空间的字节数。
————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:oracle table storage 表字段 占用空间大小
————————————————————————————————-
在数据库备份策略中,因为磁盘空间所限,需要删除N天前的备份文件。
本博客中有篇:实现连续N次备份数据库的脚本
其中有删除七日前的数据库备份文件的命令。那篇博客中利用了vbs处理日期的方法。但是,有点不妥当的地方,假如近七日内没有备份成功,或者说近七日内没有任何备份文件。如果删除了七日前的备份文件,那么就没有任何一个有效的备份文件了。这在数据库备份策略中是尤其需要注意的。
下面的命令不仅仅能够删除4天前的备份文件,而且能够保证有4天的备份文件。说白了也就是保留4份备份文件。呵呵。
del /f d:\123.txt && FOR /F "usebackq tokens=1,2,3*" %i IN (`dir E:\oracle\oradata\orcl /A-D /O-D ^| find ":"`) DO @echo %i %j=%l >>d:\123.txt
for /F "usebackq skip=5 delims== tokens=1*" %i in (d:\123.txt) do echo del /f %j
注释:skip=5表示跳过前4行记录。d:\123.txt是保存临时数据的文件,可以改成其他,比如: %temp%\123.txt
目录E:\oracle\oradata\orcl为备份文件所在路径。
如果放在bat脚本文件中执行上面的2行命令。需要将 %i之类的替换成 %%i
将上面2行命令的第2行中加粗字体的echo去掉,就能够实现删除操作了。 为了保险起见,先打印出删除文件的语句。
另:关于for循环命令的用法可以参考:CMD命令行:for命令详解[转]
讲FOR之前呢,咋先告诉各位新手朋友,如果你有什么命令不懂,直接在CMD下面输入:
name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!当然许多菜鸟都看不懂....所以才会有那么多批处理文章!!!!俺也照顾菜鸟,把FOR命令用我自己的方式说明下!
正式开始:
一、基本格式
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母表示可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释
现在开始讲每个参数的意思
二、参数 /d
FOR /D %%variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件
名匹配。
如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的
Sybase ASE自15.0.2后增加了用户自定义函数的功能。
在Sybase中,以 2010-10-18 12:30:01格式显示日期数据时,用convert函数不能实现,需要替换一下字符。
select convert(varchar,getdate(),117)
go
------------------------------
2010/10/18 20:51:10
(1 row affected)
利用函数str_replace替换上面返回的日期字符串中的/为-
str_replace(convert(char(19),getdate(),117),'/','-')
1> select str_replace(convert(char(19),getdate(),117),'/','-')
2> go-------------------
2010-10-18 20:53:13(1 row affected)
在oracle的sqlplus中有一个命令:desc,能够简要的显示基表、视图等的结构。desc的显示结果简单明了,比较实用。虽然在Sybase ASE中的存储过程sp_help也能实现查看表结构的目的;但是,显示结果很多尤其换行混乱,让人看得眼花缭乱。显示的存储过程:sp_desc能够实现oracle的sqlplus中desc相同的功能,仅仅多了一列:列序号。
效果图如下:
存储过程sp_desc的语法如下: