15. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
判断某个字符串是否为数字的方法
By:bzszp
测试数据库版本:8.1.6
测试操作系统:windows2000 server
--第一种方法 通过 to_number 转换是否发生异常来判断
SQL> create or replace function f_str_or_num(str varchar2) return varchar2 is
2 v_num number;
3 v_return varchar2(60);
4 begin
5 v_num:=to_number(str);
6 v_return:=str||' is a number string!';
7 return v_return;
8 exception when others then
9 v_return:=str||' is not a number string!';
10 return v_return;
11 end f_str_or_num;
12 /
Function created.
SQL> select f_str_or_num('123.56') from dual;
F_STR_OR_NUM('123.56')
--------------------------------------------------------------------------------
123.56 is a number string!
SQL> select f_str_or_num('12aa.56') from dual;
F_STR_OR_NUM('12AA.56')
--------------------------------------------------------------------------------
12aa.56 is not a number string!
SQL>
--第二种通过 translate 函数来以及其他相关函数来实现
SQL> select decode(replace(translate('12a3.456','0123456789.',' '),' ',''),null,
2 'is number','is not a number') from dual;
DECODE(REPLACE(
---------------
is not a number
SQL> select decode(replace(translate('123.456','0123456789.',' '),' ',''),null,
2 'is number','is not a number') from dual;
DECODE(RE
第 15 页 共 131 页
20. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
三 2 进制转换为 10 进制
从 Oracle9i 开始,提供函数 bin_to_num 进行 2 进制到 10 进制的转换
SQL> select bin_to_num(1,1,0,1) a,bin_to_num(1,0) b from dual;
AB
----- ----------
13 2
SQL> select bin_to_num(1,1,1,0,1) from dual;
BIN_TO_NUM(1,1,1,0,1)
---------------------
29
四 通过自定义函数实现进制转换
以下函数来自 AskTom 网站,是 Tom 给出的例子,供参考:
create or replace function to_base( p_dec in number, p_base in number )
return varchar2
is
l_str varchar2(255) default NULL;
l_num number default p_dec;
l_hex varchar2(16) default '0123456789ABCDEF';
begin
if ( trunc(p_dec) <> p_dec OR p_dec < 0 ) then
raise PROGRAM_ERROR;
end if;
loop
l_str := substr( l_hex, mod(l_num,p_base)+1, 1 ) || l_str;
l_num := trunc( l_num/p_base );
exit when ( l_num = 0 );
end loop;
return l_str;
end to_base;
/
create or replace function to_dec
第 20 页 共 131 页
21. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
( p_str in varchar2,
p_from_base in number default 16 ) return number
is
l_num number default 0;
l_hex varchar2(16) default '0123456789ABCDEF';
begin
for i in 1 .. length(p_str) loop
l_num := l_num * p_from_base + instr(l_hex,upper(substr(p_str,i,1)))-1;
end loop;
return l_num;
end to_dec;
/
show errors
create or replace function to_hex( p_dec in number ) return varchar2
is
begin
return to_base( p_dec, 16 );
end to_hex;
/
create or replace function to_bin( p_dec in number ) return varchar2
is
begin
return to_base( p_dec, 2 );
end to_bin;
/
create or replace function to_oct( p_dec in number ) return varchar2
is
begin
return to_base( p_dec, 8 );
end to_oct;
/
[作者简介]
盖国强,网名 eygle
曾任 ITPUB MS 版版主,现任 itpub Oracle 管理版版主.
曾任职于某国家大型企业,服务于烟草行业,开发过基于 Oracle 数据库的大型 ERP 系统,属国家信息产业
部重点工程.同时负责 Oracle 数据库管理及优化,并为多家烟草企业提供 Oracle 数据库管理、优化及技术支
持.
目前任职于北京某电信增值业务系统提供商企业,首席 DBA,负责数据库业务.管理全国 30 多个数据库
系统。项目经验丰富,曾设计规划及支持中国联通增值业务等大型数据库系统.
实践经验丰富,长于数据库诊断、性能调整与 SQL 优化等.
第 21 页 共 131 页
24. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
cache 10
create table user_information
(
user_id number primary key, --用户序号
user_login_name varchar2(30) not null, --登陆名
user_password varchar2(50) not null, --用户密码
user_name varchar2(20), --用户姓名
user_telephone varchar2(20), --用户电话
user_type number(5) , --用户类型
creation_date date not null, --创建日期
last_update_date date not null --最后修改日期
)
2、在 Oracle 中建执行插入操作的存储过程:
create or replace procedure insert_user_information
(
p_user_login_name in varchar2,
p_user_password in varchar2,
p_user_name in varchar2,
p_user_telephone in varchar2,
p_user_type in number,
p_out out number
) as
v_count number;
begin
if p_user_login_name is null or p_user_password is null then
p_out:=-1; --用户名和密码不能为空,
return ;
end if;
if p_user_type is null then
p_out:=-2; --用户类型不能为空
return ;
end if;
select count(*) into v_count from user_information a where
.user_login_name=upper(p_user_login_name);
if v_count>0 then
p_out:=-3; --该用户名已经存在
return ;
end if;
insert into user_information
values(seq_user_information.nextval,upper(p_user_login_name),
p_user_password,p_user_name,p_user_telephone,
第 24 页 共 131 页
25. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
p_user_type, sysdate,sysdate);
commit;
p_out:=0; --操作成功
return ;
exception
when others then
p_out:=-4; --插入过程中出现异常
return ;
end ;
3、在.NET 项目建一个到数据库的联结:
在项目中新增加一个类文件。名称:clsPublic,
//添加引用:
using System;
using System.Data;
using System.Data.OleDb;
//连接字符串
private string connectora="Provider=MSDAORA.1;Password=fran;User
ID=fran;Data Source=demo;Persist Security Info=True";
//连接 Oracle 数据库
public OleDbConnection ConnectDB()
{
try
{
OleDbConnection conn=new OleDbConnection();
conn.ConnectionString=connectora;
conn.Open();
return conn;
}
catch
{
return null;
}
}
4、在类文件中添加如下内容,用来执行 Oracle 中的过程:
public int Insert_User_Information(string v_user_login_name,string
v_user_password,string v_user_name,string v_user_telephone,int
v_user_type,string proc_name)
{
第 25 页 共 131 页
32. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
140 buffer busy waits 17 file#
66 buffer busy waits 17 file#
10 db file sequential read 17 file#
18 db file sequential read 17 file#
54 db file sequential read 17 file#
49 db file sequential read 17 file#
48 db file sequential read 17 file#
46 db file sequential read 17 file#
45 db file sequential read 17 file#
35 db file sequential read 17 file#
30 db file sequential read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
29 db file sequential read 17 file#
22 db file sequential read 17 file#
178 db file sequential read 17 file#
175 db file sequential read 17 file#
171 db file sequential read 17 file#
123 db file sequential read 17 file#
121 db file sequential read 17 file#
120 db file sequential read 17 file#
117 db file sequential read 17 file#
114 db file sequential read 17 file#
113 db file sequential read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
111 db file sequential read 17 file#
107 db file sequential read 17 file#
80 db file sequential read 17 file#
222 db file sequential read 17 file#
218 db file sequential read 17 file#
216 db file sequential read 17 file#
213 db file sequential read 17 file#
199 db file sequential read 17 file#
198 db file sequential read 17 file#
194 db file sequential read 17 file#
192 db file sequential read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
188 db file sequential read 17 file#
249 db file sequential read 17 file#
第 32 页 共 131 页
33. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
242 db file sequential read 17 file#
239 db file sequential read 17 file#
236 db file sequential read 17 file#
235 db file sequential read 17 file#
234 db file sequential read 17 file#
233 db file sequential read 17 file#
230 db file sequential read 17 file#
227 db file sequential read 17 file#
336 db file sequential read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
333 db file sequential read 17 file#
331 db file sequential read 17 file#
329 db file sequential read 17 file#
327 db file sequential read 17 file#
325 db file sequential read 17 file#
324 db file sequential read 17 file#
320 db file sequential read 17 file#
318 db file sequential read 17 file#
317 db file sequential read 17 file#
316 db file sequential read 17 file#
313 db file sequential read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
305 db file sequential read 17 file#
303 db file sequential read 17 file#
301 db file sequential read 17 file#
293 db file sequential read 17 file#
290 db file sequential read 17 file#
288 db file sequential read 17 file#
287 db file sequential read 17 file#
273 db file sequential read 17 file#
271 db file sequential read 17 file#
257 db file sequential read 17 file#
256 db file sequential read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
254 db file sequential read 17 file#
252 db file sequential read 17 file#
159 db file sequential read 17 file#
153 db file sequential read 17 file#
第 33 页 共 131 页
34. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
146 db file sequential read 17 file#
142 db file sequential read 17 file#
135 db file sequential read 17 file#
133 db file sequential read 17 file#
132 db file sequential read 17 file#
126 db file sequential read 17 file#
79 db file sequential read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
77 db file sequential read 17 file#
72 db file sequential read 17 file#
70 db file sequential read 17 file#
69 db file sequential read 17 file#
67 db file sequential read 17 file#
63 db file sequential read 17 file#
55 db file sequential read 17 file#
102 db file sequential read 17 file#
96 db file sequential read 17 file#
95 db file sequential read 17 file#
91 db file sequential read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
81 db file sequential read 17 file#
15 db file sequential read 17 file#
19 db file scattered read 17 file#
50 db file scattered read 17 file#
285 db file scattered read 17 file#
279 db file scattered read 17 file#
255 db file scattered read 17 file#
243 db file scattered read 17 file#
196 db file scattered read 17 file#
187 db file scattered read 17 file#
170 db file scattered read 17 file#
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
162 db file scattered read 17 file#
138 db file scattered read 17 file#
110 db file scattered read 17 file#
108 db file scattered read 17 file#
92 db file scattered read 17 file#
330 db file scattered read 17 file#
第 34 页 共 131 页
35. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
310 db file scattered read 17 file#
302 db file scattered read 17 file#
299 db file scattered read 17 file#
89 db file scattered read 17 file#
5 smon timer 300 sleep time
SID EVENT P1 P1TEXT
---------- ------------------------------ ---------- ----------------------------------------------------------------
20 SQL*Net message to client 1952673792 driver id
103 SQL*Net message to client 1650815232 driver id
....
148 SQL*Net more data from client 1952673792 driver id
291 SQL*Net more data from client 1952673792 driver id
244 rows selected.
发现存在大量 db file scattered read 及 db file sequential read 等待.显然全表扫描
等操作成为系统最严重的性能影响因素.
关于常见的等待事件,你可以在以下网址找到更为详细的说明.
http://www.eygle.com/statspack/statspack12.htm
5.捕获相关 SQL
这里用到了我的以下脚本 getsqlbysid:
SELECT sql_text
FROM v$sqltext a
WHERE a.hash_value = (SELECT sql_hash_value
FROM v$session b
WHERE b.SID = '&sid')
ORDER BY piece ASC
/
该脚本根据用户 sid,结合 v$session 和 v$sqltext 视图,获得用户 sql 语句的完整文
本.
使用该脚本,通过从 v$session_wait 中获得的等待全表或索引扫描的进程 SID,捕获
问题 sql:
SQL> @getsql
Enter value for sid: 18
old 5: where b.sid='&sid'
new 5: where b.sid='18'
第 35 页 共 131 页
36. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
SQL_TEXT
----------------------------------------------------------------
select i.vc2title,i.numinfoguid from hs_info i where i.intenab
ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <=
sysdate and i.numcatalogguid = 2047 order by i.datpublishdate d
esc, i.numorder desc
SQL> /
Enter value for sid: 54
old 5: where b.sid='&sid'
new 5: where b.sid='54'
SQL_TEXT
----------------------------------------------------------------
select i.vc2title,i.numinfoguid from hs_info i where i.intenab
ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <=
sysdate and i.numcatalogguid = 33 order by i.datpublishdate des
c, i.numorder desc
SQL> /
Enter value for sid: 49
old 5: where b.sid='&sid'
new 5: where b.sid='49'
SQL_TEXT
----------------------------------------------------------------
select i.vc2title,i.numinfoguid from hs_info i where i.intenab
ledflag = 1 and i.intpublishstate = 1 and i.datpublishdate <=
sysdate and i.numcatalogguid = 26 order by i.datpublishdate des
c, i.numorder desc
对几个进程进行跟踪,分别得到以上 SQL 语句,这些 SQL 可能就是问题产生的根源.
以上语句如果良好编码应该使用绑定变量.但是现在这个不是我们关心的.
使用该应用用户连接,检查以上 SQL 的执行计划:
SQL> set autotrace trace explain
SQL> select i.vc2title,i.numinfoguid
2 from hs_info i where i.intenabledflag = 1
3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate
4 and i.numcatalogguid = 3475
5 order by i.datpublishdate desc, i.numorder desc ;
Execution Plan
第 36 页 共 131 页
37. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=228 Card=1 Bytes=106)
1 0 SORT (ORDER BY) (Cost=228 Card=1 Bytes=106)
2 1 TABLE ACCESS (FULL) OF 'HS_INFO' (Cost=218 Card=1 Bytes=106)
SQL> select count(*) from hs_info;
COUNT(*)
----------
227404
以上查询使用了全表扫描,该表这里有 22 万记录,全表扫描已经不再适合.
检查该表,存在以下索引:
SQL> select index_name,index_type from user_indexes where table_name='HS_INFO';
INDEX_NAME INDEX_TYPE
------------------------------ ---------------------------
HSIDX_INFO1 FUNCTION-BASED NORMAL
HSIDX_INFO_SEARCHKEY DOMAIN
PK_HS_INFO NORMAL
检查索引键值:
SQL> select index_name,column_name
2 from user_ind_columns where table_name ='HS_INFO';
INDEX_NAME COLUMN_NAME
------------------------------ --------------------
HSIDX_INFO1 NUMORDER
HSIDX_INFO1 SYS_NC00024$
HSIDX_INFO_SEARCHKEY VC2INDEXWORDS
PK_HS_INFO NUMINFOGUID
SQL> desc hs_info
Name Null? Type
--------------------------------- -------- --------------------------------------------
NUMINFOGUID NOT NULL NUMBER(15)
NUMCATALOGGUID NOT NULL NUMBER(15)
INTTEXTTYPE NOT NULL NUMBER(38)
VC2TITLE NOT NULL VARCHAR2(60)
VC2AUTHOR VARCHAR2(100)
第 37 页 共 131 页
38. http:/emag.csdn.net CSDN 电子杂志
------------------------- 创刊号总第一期
NUMPREVINFOGUID NUMBER(15)
NUMNEXTINFOGUID NUMBER(15)
NUMORDER NOT NULL NUMBER(15)
DATPUBLISHDATE NOT NULL DATE
INTPUBLISHSTATE NOT NULL NUMBER(38)
VC2PUBLISHERID VARCHAR2(30)
VC2INDEXWORDS VARCHAR2(200)
VC2WAPPREVPATH VARCHAR2(200)
VC2WEBPREVPATH VARCHAR2(200)
VC2WAP2PREVPATH VARCHAR2(200)
NUMVISITED NOT NULL NUMBER(15)
INTENABLEDFLAG NOT NULL NUMBER(38)
DATCREATETIME NOT NULL DATE
DATMODIFYTIME NOT NULL DATE
VC2NOTES VARCHAR2(1000)
INTINFOTYPE NOT NULL NUMBER(38)
VC2PRIZEFLAG VARCHAR2(1)
VC2DESC VARCHAR2(1000)
6.决定创建新的索引以消除全表扫描
检查发现在 numcatalogguid 字段上并没有索引,该字段具有很好的区分度,考虑在该
字段创建索引以消除全表扫描.
SQL> create index hs_info_NUMCATALOGGUID on hs_info(NUMCATALOGGUID);
Index created.
SQL> set autotrace trace explain
SQL> select i.vc2title,i.numinfoguid
2 from hs_info i where i.intenabledflag = 1
3 and i.intpublishstate = 1 and i.datpublishdate <=sysdate
4 and i.numcatalogguid = 3475
5 order by i.datpublishdate desc, i.numorder desc ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=12 Card=1 Bytes=106)
1 0 SORT (ORDER BY) (Cost=12 Card=1 Bytes=106)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'HS_INFO' (Cost=2 Card=1
Bytes=106)
3 2 INDEX (RANGE SCAN) OF 'HS_INFO_NUMCATALOGGUID'
(NON-UNIQUE) (Cost=1 Card=1)
第 38 页 共 131 页