【Oracle】容易犯的错误和技巧集合
引言
此文记录日常开发中容易遇到的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】容易犯的错误和技巧集合的更多相关文章
- 在CMMI推广过程中EPG常犯的错误(转)
本文转自: http://developer.51cto.com/art/200807/86953.htm 仅用于个人收藏,学习.如有转载,请联系原作者. ---------------------- ...
- 十个JAVA程序员容易犯的错误
十个JAVA程序员容易犯的错误 1. Array 转 ArrayList 一般开发者喜欢用: List<String> list = Arrays.asList(arr); Arrays. ...
- Oracle ORA-07445 evaopn2()+128错误问题
Oracle ORA-07445 evaopn2()+128错误问题 问题描述 Plsql developer执行一段sql报错: 经查alert log详细报错信息为: ORA-07445: exc ...
- C#新手常犯的错误
虽然这篇post的标题是新手常犯的错误,实际上很多有经验的程序员也经常犯这些错误,我整理了一下,就当是笔记.1.遍历List的错误,比如如下代码: List<String> strList ...
- js定义对象的几种容易犯的错误
//js定义对象的几种容易犯的错误function Person() { getName = function (){ console.info(1); }; return this;}//Perso ...
- java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法 (2011-05-05 16:08:05) 转载▼ ...
- 网站移植到linux上后常犯的错误
常犯的错误 1:gcc库没装或者没装全 表现:没有可用的C编译器 同类错误:提示g++ not found, 解决:出现以上错误,则是因为gcc编译器没装,或者是没装全. 挂载光盘,到Pakeges里 ...
- Oracle连接的若干错误
用PL/SQL连接Oracle时会抛若干错误,如下: 1.ora-12154:TNS:无法解析指定的连接标识符 答:plsql在%Oracle_Home%\Network\Admin或者c:\inst ...
- Oracle登录时提示错误,导致用户无法登录
Oracle登录时提示错误,导致用户无法登录,错误如下 ------------------------------------------------------------------------ ...
随机推荐
- Maven学习笔记—安装和配置
Maven的安装和配置 1 在windows上安装maven 1.1 下载maven 访问maven的下载页面:http://maven.apache.org/download.cgi,选择版本下载即 ...
- ABAP发邮件函数
步骤: 一.检查输入参数, (1)未指定文件類別代碼,(2)未指定郵件主題, (3)未指定郵件內容, (4)未指定發送人郵件地址, (5)未指定接收人郵件地址, 二.调用发送功能, (1)创建发送请求 ...
- Eclipse解决JSP页面乱码问题
解决方案 1.首先选择 Window --> Preferences --> General--> Content Types --> text (点击左边的+,显示 ...
- 阿里云公网IP不能使用
1.开通专用网络 2.在ECS的安全组 创建 专用网络 3.配置规则 4.快速创建规则,增加自己需要入网的端口号,授权对象写:0.0.0.0/0
- Ajax知识
一.Ajax介绍前戏 1.json介绍 1.什么是json? json(JavaScript Object Notation,JS对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript ...
- 怎样在不对控件类型进行硬编码的情况下在 C#vs 中动态添加控件
文章ID: 815780 最近更新: 2004-1-12 这篇文章中的信息适用于: Microsoft Visual C# .NET 2003 标准版 Microsoft Visual C# .NET ...
- SQL模糊查找
编辑器加载中... /*********************实现模糊查找**************************/ SELECT [UserId] ,[UserName] ,[User ...
- 进程理论基础(Day32)
背景知识 顾名思义,进程即一个软件正在进行的过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老的也是最重要的抽象概念之一.操作系统的其他 ...
- MySQL数据库(8)_MySQL数据库总结
sql语句规范 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出“做什么” ...
- XSS - 禁止浏览器读取Cookie - HttpOnly
1.什么是HttpOnly? 如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,具体一点的介绍请google进行搜索. C ...