引言

     此文记录日常开发中容易遇到的oracle编程误区和一些使用技巧,不定期更新.

1.sum(),max(),min(),avg()等函数会得到null值

declare
n_num number(5):='';
begin
select sum(1) into n_num from dual where 1=2 ;
n_num:= n_num+2;
dbms_output.put_line(n_num);
end;

上面代码描述了我们日常开发的一个场景,将某个表的数据求和,然后再各种计算.正常情况是没有问题的,但是求和表没有数据的,我们就会得到一个空值,然后导致后面的一系列计算都是空值,

造成业务误差.

处理办法:加上nvl()函数处理这种异常,如下:

declare
n_num number(5):='';
begin
select nvl(sum(1),0) into n_num from dual where 1=2 ;
n_num:= n_num+2;
dbms_output.put_line(n_num);
end;

 2.超长字符拼接

     我们一般用函数wm_concat拼接字段,但是拼接超长字符串(长度大于32767)时,就抛错了.后来找到一个自定义函数能够无压力拼接超长字符串,代码是抄下来了,但是出处网址没记下来.......函数如下:

CREATE OR REPLACE TYPE t_long_concat
AUTHID CURRENT_USER AS OBJECT
(
CURR_STR clob,
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT t_long_concat) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT t_long_concat,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN t_long_concat,
RETURNVALUE OUT clob,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT t_long_concat,
SCTX2 IN t_long_concat) RETURN NUMBER
); CREATE OR REPLACE TYPE BODY t_long_concat
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT t_long_concat)
RETURN NUMBER
IS
BEGIN
SCTX := t_long_concat(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT t_long_concat, P1 IN VARCHAR2)
RETURN NUMBER
IS
BEGIN
IF(CURR_STR IS NOT NULL) THEN
CURR_STR := CURR_STR || ',' || P1;
ELSE
CURR_STR := P1;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN t_long_concat,
RETURNVALUE OUT clob,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT t_long_concat,
SCTX2 IN t_long_concat)
RETURN NUMBER
IS
BEGIN
IF(SCTX2.CURR_STR IS NOT NULL) THEN
SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;
END IF;
RETURN ODCICONST.SUCCESS;
END;
END; CREATE OR REPLACE FUNCTION long_concat(P1 VARCHAR2)
RETURN clob AGGREGATE USING t_long_concat ;

3.Group by 和 Having

通常我们在存储过程中判断表的字段中有没有重复数据,可能会用到下面的SQL

select count(*) into N_Count from T_Table t Group by t.Name having count(*)>1;

if N_Count>0 then
--操作
end if;

然而这种写法是有问题的.1.当没有重复数据时会引发NO_DATA_FOUND异常.2.当有多个重复组时会引发返回多行异常,正确的写法应该是这样的.

select  count(*) into N_Count from  ( select t.Name  from T_Table t group by t.Name having count(*)>1 )
if N_Count>0 then
--操作
end if;

4.行转列

有时候要将行数据转换为列.下面给出一个例子,目的是将成绩排名数据转成列显示.

  select * from (
select 100 score, 1 ranknum, '一班' nam from dual
union all
select 99 score, 2 ranknum, '一班' nam from dual
union all
select 98 score, 1 ranknum, '二班' nam from dual
union all
select 90 score, 2 ranknum, '二班' nam from dual
)
PIVOT(
max(score) --要转成行的字段
for ranknum --根据哪个字段的信息进行转换
IN(1 as col1, 2 as col2, 3 as col3)--根据字段信息生成对应的列
)

【Oracle】容易犯的错误和技巧集合的更多相关文章

  1. 在CMMI推广过程中EPG常犯的错误(转)

    本文转自: http://developer.51cto.com/art/200807/86953.htm 仅用于个人收藏,学习.如有转载,请联系原作者. ---------------------- ...

  2. 十个JAVA程序员容易犯的错误

    十个JAVA程序员容易犯的错误 1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays. ...

  3. Oracle ORA-07445 evaopn2()+128错误问题

    Oracle ORA-07445 evaopn2()+128错误问题 问题描述 Plsql developer执行一段sql报错: 经查alert log详细报错信息为: ORA-07445: exc ...

  4. C#新手常犯的错误

    虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记.1.遍历List的错误,比如如下代码: List<String> strList ...

  5. js定义对象的几种容易犯的错误

    //js定义对象的几种容易犯的错误function Person() { getName = function (){ console.info(1); }; return this;}//Perso ...

  6. java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法 (2011-05-05 16:08:05) 转载▼ ...

  7. 网站移植到linux上后常犯的错误

    常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...

  8. Oracle连接的若干错误

    用PL/SQL连接Oracle时会抛若干错误,如下: 1.ora-12154:TNS:无法解析指定的连接标识符 答:plsql在%Oracle_Home%\Network\Admin或者c:\inst ...

  9. Oracle登录时提示错误,导致用户无法登录

    Oracle登录时提示错误,导致用户无法登录,错误如下 ------------------------------------------------------------------------ ...

随机推荐

  1. Redis3.2.8配置参数及说明

    bind 127.0.0.1# 绑定的主机地址,不设置默认将处理所有请求protected-mode yes# 是否开启保护模式,默认开启,要是配置里面没有指定bind和密码,开启该参数后,redis ...

  2. PyQt4 UI设计和调用 使用eric6

    使用工具eric6 安装包地址: http://eric-ide.python-projects.org/eric-download.html 1.需要安装python和pyqt为前提,然后安装eri ...

  3. C# Ajax 技术

    Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写.下面是 Ajax 应用程序所用到的基本技术:• HTML 用于建立 Web 表单并确定应用程 ...

  4. 佳能相机操作 EDSDK 教程 C# 版本

    http://blog.csdn.net/zajin/article/details/17021339    介绍 佳能EOS数码SDK是一个 可以用来远程控制其数码单反相机相当强大的SDK.不幸的是 ...

  5. python默认参数不能定义为可变对象类型

    python的默认参数只会在函数定义时被确定,而不是每次调用时重新确定,所以,一旦在函数中修改了默认参数,则在随后的调用中都会生效 由于这个特性,在定义函数时,如果默认参数使用可变的对象类型,如空列表 ...

  6. FANCO工程机械云平台

    此系统专门为工程机械设备使用单位定制合理的生产要求,监控生产状况,快速体现产值,通过算法计算绩效等

  7. uboot无法引导uImage错误及其解决方法

    先编译友善提供的linux内核: make ARCH=arm mini2440_defconfigmake CROSS_COMPILE=arm-linux- uImage 在arch/arm/boot ...

  8. iOS_mapKit与Core Location

    目 录: 一.使用MKMap控件 二.根据地址定位 三.在地图上添加锚点   iOS从3.0版本开始提供了MapKit.frameword支持.该框架提供了一个可被嵌入到应用程序中的地图视图类MKMa ...

  9. 同类型元素,只有一个被选中js

    <div class="wrap-box flex_row"> <div class="wrap-block"> <div cla ...

  10. 【bzoj1925】地精部落[SDOI2010](dp)

    题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各 ...