随笔分类 - Oracle & PL/SQL
关于PL/SQL的一些总结
摘要:什么是真实执行计划 获取Oracle的执行计划,有几种方式。(本文使用Oracle 11g XE版本,以及普通用户scott登录) explain plan for 有两个步骤: explain plan for ${SQL} select from table(dbms_xplan.display
阅读全文
摘要:这个问题在半年前,花了我两天的时间才解决,现在刚好想起来,顺便记录一下以防忘了。通过jdbc,预编译的sql,无法查询到固定长度的字段。用例子说话:创建一个表,只有一个字段,长度为固定的char类型。并插入一条数据。create table tblchar( name char(20) );在Ja...
阅读全文
摘要:今天发现了一个问题,一个长度设置为2000字节的字段,插入一条长度为1000的汉字数据,竟然报错了。一个汉字占两个字节,按理说刚好是2000个字节。但通过查看日志,发现插入数据的长度为3000字节。百度了一下,原来是不同的字符集造成的。一般情况下,数据库的NLS_CHARACTERSET 为AL32...
阅读全文
摘要:最近在写DAO层的时候,遇到一个问题,就是使用like进行模糊查询时,输入下划线,无法精确查到数据,而是返回所有的数据。这让我很好奇,百度之后才发现,原来是因为有些特殊字符需要进行转义才可以进行查询。首先理解一下什么是特殊字符。在ascii码表中,特殊字符的范围如下。即从32~47 58~64 91...
阅读全文
摘要:层级关系:server.database.schema.object客户端通过实例连接数据库。sql server使用实例时,需使用登录名(如默认的sa)。一个登录名可以映射到多个数据库的用户名,而用户可以拥有不同的架构,但架构只能有一个拥有者,包括用户和角色等。因此,登录后要指定使用哪个数据库。指定之后就以对应的用户名进行操作。例如登录名test_login,映射到table1的a用户(只能映射数据库的一个用户,但可以映射多个数据库),那么当你使用test_login登录之后就可以指定使用table1数据库,然后以以a用户的身份操作数据库了。而a用户又会有相应的架构,如果使用对象时没有指定哪
阅读全文
摘要:使用order by排序,有时候不是根据字符或数字顺序,而是根据实际要求排序。例如有客户A,B,C,我希望排序结果是B,C,A,那么就要通过自定义的规则排序。第一种方法,可以构造一张映射表,将客户映射到所需要的顺序。第二种方法,如果要排序的客户不多,可以直接写出,那就使用如下方法:order by case customer when B then 1 when C then 2 when A then 3 end;这样就可以排出B,C,A的顺序了。
阅读全文
摘要:批量SQL包括:FORALL语句BULK COLLECT子句FORALL语句FORALL具有如下结构:FORALL loop_counter IN bounds_clause [SAVE ECEPTIONS]SQL_STATEMENT;其中, bounds_clause是下面形式之一:lower_limit .. upper_limitINDICES OF collection_name [BETWEEN lower_limit .. upper_limit]VALUES OF collection_name第一种与for循环一样。第二种用于稀疏数组,比如一个嵌套表,删除了其中某几项,遍历时会
阅读全文
摘要:关于PL/SQL中这三种数组的介绍,不想写了。转一篇日志吧……链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html作者:decode360补充一点:假如从first到last的遍历过程中,存在被删除的占位符,如果使用则会报错。可用Exists(下标)的方法来判断是否存在。不能用is null 来判断……记录类型不能整体用null判断,我能想到并测试成功的方法是判断里面的NOT NULL字段(推荐主键)是否为null。PLSQL学习(二) 数组专题 PLSQL中提供了三种数据的形式,功能还是比较强大的。但是总的来说
阅读全文
摘要:在使用select into 为变量赋值时,如果变量是集合类型,不会产生异常,而如果是基本类型或记录类型,则会报异常。异常产生了怎么办?当然是捕获并处理啦。对于普通的代码块来说,在代码块的结尾处理就可以了。但是在循环里面呢?根据异常的传播,产生异常程序会中止。但如果想要在发生异常后,达到continue的效果,可不能在结尾的exception那里添加when others then continue;的语句,否则报错。要达到在循环中,找不到数据就continue,可以在赋值时,no_data_found的情况下作异常处理。即是让赋值语句包含在begin exception end的结构中。另外
阅读全文
摘要:在PL/SQL代码块中使用select into 赋值的话,有可能返回的是一个结果集。此时,如果使用基本类型或自定义的记录类型,将会报错。因此,需要定义一个变量,是某种类型的集合。下面以一个基于表的行类型的集合为例简单介绍一下(相信基本类型同理吧)。 1 DECLARE 2 CURSOR cur_tx IS SELECT GKEY from t ; 3 SUBTYPE TX_TYPE IS t%ROWTYPE ; -- 定义类型 4 TYPE TX_TAB IS TABLE OF TX_TYPE;--定义新类型,是某个类型的集合 5 K t.GKEY%TYPE...
阅读全文
摘要:与公司同事交流了一下,得知触发器很少用。性能是一方面,主要是如果用太多触发器,可能到时你都不知道会有什么操作自动发生。有些操作可以在程序中控制。例如在插入某个表时,写个log表的记录。这可以用触发器实现,但比较好的做法还是在程序中写个插入到log的语句实现。所以,就只学习了很简单的部分。触发器的通用语法如下:CREATE [OR REPLACE] TRIGGER Trigger_name{BEFORE | AFTER } {INSERT | DELETE | UPDATE} ON TABLE_NAME[FOR EACH ROW][FOLLOWS another_trigger][ENABLE
阅读全文
摘要:显式游标的处理过程包括:声明游标,打开游标,检索游标,关闭游标。声明游标CURSOR c_cursor_name IS statement;游标相当于一个查询结果集,将查询的结果放在游标里,方便在块里进行处理。记录一个记录就是一个复合的数据结构,相当于结果集里的一行数据,用于遍历游标时存放结果。记录支持三种定义:基于表,基于游标,自定义。如果是基于表或游标,其定义格式为:record_name table_name or cursor_name%ROWTYPE;打开游标OPEN cursor_name;检索游标存在两种游标检索方式:FETCH cursor_name INTO pl/sql v
阅读全文
摘要:做好了准备想要接受难一点的概念,结果发现,其实这一章很水。1. raise_application_errorraise_application_error 是Oracle提供的一种特殊的内置过程,允许程序员为特定应用程序创建有意义的错误消息,也即自定义。语法如下:raise_application_error(error_number,error_message);orraise_application_error(error_number,error_message,keep_errors);error_number是与特定错误消息相关联的错误编号,这个编号的范围在-20999到-2000
阅读全文
摘要:今晚看了关于PL/SQL异常传播的内容,做个笔记。1.PL/SQL执行语句块发生运行时错误PL/SQL 语句块的可执行部分发生某个运行时错误,执行权会转到该语句块的异常处理部分。当与该异常相关的语句执行完毕之后,执行权会转到主机环境或者外围语句块。如果不存在该错误的异常处理程序,该异常就会被传播到外围语句块,然后再次执行刚才所描述的步骤。如果没有发现异常处理程序,则程序执行会终止,执行权会转到主机环境。请看下例: 1 begin 2 declare 3 a number := 4; 4 b number := 0; 5 begin 6 a := a/b; 7 ...
阅读全文