存档

2010年10月 的存档,文章数:8

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中却没有能够授予创建函数权限的地方。

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相同的功能,仅仅多了一列:列序号。

效果图如下:

实现类似oracle的sqlplus中desc想类似功能的sp_desc存储过程

 

存储过程sp_desc的语法如下: