容易忽视的oracle函数问题 数据类型
最近始终被数据库问题困扰,出于项目应用原因,定义了一些oracle自定义函数(User Defined function),用于在实际查询SQL语句中调用,目的是为了简化SQL语句的复杂度。实际使用中发现,这些函数会出现一个莫名奇妙的问题,先上实例:
CREATE OR REPLACE FUNCTION "GETSINGLEUSER" --返回第一个字符串
(sStr in nvarchar2)
return nvarchar2
as
sReturn nvarchar2(50);
begin
if instr(sStr,',') > 0 then
sReturn := SUBSTR(sStr,1,instr(sStr,',') - 1);
else
sReturn := sStr;
end if;
return sReturn;
exception
when others then
return 'error';
end;
这是其中一个函数,功能很简单就是取,分隔的多个串集中的第一个元素返回,但是在实际SQL语句中使用中发现,如果查询返回行数超过100行,100行后的记录中函数没有执行结果(可排除传入参数问题)。见图
应用函数GETSINGLEUSER 进行查询某表某列数据时,100行后的记录明明是有值的,而且在函数体中如果出现异常也会有返回值error,但是实际效果就像100行的记录没有执行过一样。为什么呢?其实这个问题到现在我也没有完全搞明白。只是自己反复测试实验后,感觉与数据类型有一定关系,我的函数入口参数声明类型为:nvarchar2,而实际查询中引用列的定义如下图,是char类型:
所以在函数调用处就采取了将参数强制转换为入口类型:
结果问题消失,本文只能说明该问题的解决方法,但却不能完全说明成因,以及类似为什么是100行呢等问题。
相关文档:
-- 查询某表的数据字典
SELECT A.TABLE_NAME AS "表名",A.COLUMN_NAME AS "字段名",
DECODE(A.CHAR_LENGTH,0,DECODE(A.DATA_SCALE,NULL,A.DATA_TYPE,A.DATA_TYPE||'('||A.DATA_PRECISION||','||A.DATA_SCALE||')'),
A.DATA_TYPE||'('||A.CHAR_LENGTH||')') as "字段类型1",A.DATA_TYPE AS "字段 ......
用oracle的卸载程序并不能完全卸载干净。如之前的命名的oracle sid 不能再使用。会提示sid存在。下面是在winxp下完全卸载oracle的方法。
1、开始->设置->控制面板->管理工具->服务
停止所有Oracle服务。
2、开始->程序->Oracle - OraHome81->Oracle ......
问题描述
1、应用连接数据异常缓慢,包括客户端使用plsql连接;
2、数据库主机cpu占用率居高不下,IO写入居高不下。
3、主机日常维护操作响应慢,如man或w;
分析问题
Ø系统及oracle应用为什么响应慢
1、为什么系统连w这么简单的操作都会觉得卡呢?
2、为什么没有任何应用接入的情况下,数据库会有大量的写入 ......
介绍to_char(数字, ‘格式’),比较常用的格式
9 表示有效位数
0 用0补足位数
B 用空格补足位数
原数的位置有实际数字占位的时候,0和9的效果是一样的。
0和9的区别在于格式中的那一位置实际数字没有站位的情况下。
select to_char(0.45,'0.99'); 结果是0.45
select ......