- 博客(30)
- 资源 (6)
- 收藏
- 关注
原创 触发器(五、复合触发器)
Oracle11g开始提供了一种复合触发器,简单的说就是支持把语句级和行级触发器组合在一起。实际应用场景不多,这里就做个记录。与单个触发器语法有所区别:1.单个触发器的头部是 BEFORE(AFTER) 【动作】 ON 【对象】 FOR 【触发级别】而组合触发器的头部是 FOR 【动作】 ON 【对象】 COMPOUND TRIGGER2.每个触发条件都各自写一段代码块,有自己的begin和end...
2018-02-24 16:53:24 566
原创 触发器(四、执行顺序控制)
Oracle11g开始提供了一个触发器顺序控制的功能,对于同时触发的多个触发器,可以用FOLLOWS语句来控制先后执行顺序。但是FOLLOWS语法有一定的限制:只能用在同类型的多个触发器上(before、after要一样;update、insert、delete要一样;行级、语句级要一样)否则会报错ORA-25022: cannot reference a trigger of a differe...
2018-02-24 16:23:00 6236 1
原创 触发器(三、条件触发)
在使用触发器的过程中,我们经常发现真正关注的只有一部分数据,并不需要对每个操作都进行触发或处理。此时可以用到条件触发,条件触发是有限制的,根据不同的需求,可以分为以下几个应用场景:1.只关注某几列的数据变更,用update of只有在update后面才能跟of,在insert和delete中无法只关注某几列,会报错ORA-04073: column list not valid for this ...
2018-02-24 12:46:41 11294
原创 触发器(二、BEFORE和AFTER的区别及使用场景)
DML操作的行级触发器,分为before和after两类。比如下面在同一张表上分别建了2个触发器然后用一个insert语句进行触发结果发现,这2类触发器捕捉的:OLD和:NEW数据实际是一样的。那么什么时候用before,什么时候用after呢?我们先要知道这2种触发器的特性区别:before触发器(针对insert和update操作)可以修改NEW的值那么before的应用场景就是:需要修改NE...
2018-02-24 10:35:09 11410 1
原创 触发器(一、语句级和行级的区别及使用场景)
Oracle触发器分为语句级(STATEMENT)和行级(ROW)两种,从字面意思上理解,语句级触发器是指一条SQL语句触发一次;行级触发器是指一条SQL语句影响的每一行触发一次。看个案例就很明显了先建2张测试表from_table和to_table,from_table插入5条记录接着在to_table上建2个触发器,分别是语句级和行级,其中行级触发器有for each row的声明下面执行一条...
2018-02-24 09:57:14 9425 1
原创 用PACKAGE封装数据的一个简单演示
读一些接口代码,或者是github上下载一些成熟的PLSQL包,经常会发现对底层数据多少都做了一些封装。数据封装有几个好处:1.代码可读性提高了;2.数据结构发生变化时,代码更新工作可以最小化且集中化处理;3.隐藏了底层数据结构,对商业保密起到一定作用。下面以一个案例演示一下数据封装的过程:在common用户下,我有一个T_LOG表用来记录程序运行日志,其结构如下:为了将写日志的接口开放给其他用户...
2018-02-23 22:32:39 362
原创 Oracle12C中With FUNCTION新特性
通过with子句,我们可以把很多原本需要存储过程来实现的复杂逻辑用一句SQL来进行表达,在12C中,with的功能又有所增强,在with里可以直接定义一个函数。比如甚至可以支持自治事务函数,在函数中进行DML操作而在11G中,则直接报错ORA-00905需要注意的是:在function定义的end后面不能跟函数名称这种语法在查询DG备库查询中可以派上用场,在一个STANDBY备库中,我们不能在只读...
2018-02-23 17:30:27 1883
原创 细粒度依赖(三)数据库对象失效的处理
由于表结构变更导致的数据库对象失效,需要如何处理。这在Oracle官方文档中有一个专题,叫做Managing Object Dependencies(管理对象依赖关系)。实质上无非是将失效的对象进行重编译,而重编译的方法大概分为3种:1.执行时自动编译失效的对象在下次执行时会自动进行编译:2.手工编译可以用ALTER ...COMPILE...的语句重编译也可以生成重编译的批量脚本后一起执行:SE...
2018-02-23 14:03:40 400
原创 细粒度依赖(二)依赖关系导致的对象失效
上次说到可以通过数据字典找到Oracle数据对象的依赖关系,从而做好DDL操作的关联操作,以避免数据库对象失效。在Oracle10g以及更早的版本中,依赖关系是以程序单元的粒度进行跟踪的,比如一张表的一个字段被修改,即使程序中没有用到这个字段,也会失效。从Oracle11g开始,细粒度依赖已经优化到单元中的元素,比如上述的情况中,程序只在引用字段被修改时才会失效。比如我有一张表T_CUR2,有ID...
2018-02-23 13:15:21 255 1
原创 细粒度依赖(一)通过数据字典找到数据库对象之间的引用关系
开发过程中,我们经常碰到这样的问题,一个好好的程序某一天忽然报错了。重新编译,发现程序里引用的某个对象不存在或表结构被改了,往往是在团队合作时,由于业务需要某个成员修改了结构,但是不清楚哪些地方引用了这个对象,因此没有处理好善后工作,最后搞得焦头烂额。事实上,ORACLE提供了细粒度依赖的数据字典*_dependencies,可以找出引用关系来解决这个麻烦。先看下数据字典的结构:从表结构可以看出,...
2018-02-23 08:49:46 774
原创 自治事务pragma autonomous_transaction的使用场景(3、解决ORA-14551错误)
有时候,我们想在一个函数中做一些复杂的处理,比如更新一个临时表数据,然后做一些UPDATE处理,最后返回一个处理结果。想必大部分开发人员在初期都试过这样的操作,最终的结果是啥?PLSQL函数中不能做DML操作,报错ORA-14551: cannot perform a DML operation inside a query此后,我们可能转而用带out参数的存储过程来间接实现业务需求。其实,另一个...
2018-02-20 22:28:36 781
原创 ORACLE中的自定义聚合函数(User-Defined Aggregate Functions)
聚合函数也叫分组函数,是对多行进行计算的一种函数,比如SUM、COUNT、AVG、MAX、MIN等等。Oracle中为了增强扩展性,提供了一个自定义聚合函数的接口,ODCIAggregate(),用户可以用Oracle支持的各类编程语言(PLSQL、C、C++、JAVA等)定义一个聚合函数,并在程序中按照一样的语法进行使用。实际应用中,使用到自定义聚合函数的场景极少,理由是:1.PLSQL语言已经...
2018-02-20 21:47:25 2062
原创 where current of语句
PLSQL为循环游标提供了where current of语句的功能,用来避免二次定位游标记录,以提高程序效率。在此之前,我们已经在做类似的事情,使用的方法是用rowid来定位,因此看到有where current of语法的时候,就想到一个问题:WHERE CURRENT OF与ROWID定位的性能哪个高?做个实验看看。100万+的数据,分别用where current of和rowid做upd...
2018-02-18 17:42:43 11674 4
原创 PLSQL中的隐含声明
PLSQL总体来说是一种比较严谨的语言,但是相对C、JAVA之类传统语言又显得随意多了,隐含声明(implicitly declare)就是一个体现。这种隐含声明出现在for循环中,作为for循环的循环索引变量,无需事先声明其数据类型就可以直接使用。比如:1.数值型循环索引,比如这个for语句中的idx是个PLS_INTEGER类型的本地变量2.记录类型循环索引,比如下面的rec是%ROWTYPE...
2018-02-17 09:24:31 179
原创 关于for update的几个误解(二)
接着上次的文章,关于for update还有一些误解误解3.for update可以仅对字段加锁FOR UPDATE有个语法是加OF,比如SESSION68中,对T_HOLIDAY表中一行记录的REMARK字段FOR UPDATE在SESSION132中对该行的另1个字段FLAG做UPDATE操作,结果还是被BLOCK了事实上,虽然用了OF字段,实际上FOR UPDATE锁的还是一整行误解4.多行...
2018-02-15 17:15:44 1493
原创 关于for update的几个误解(一)
初学sql开发的同学经常会在plsql developer中使用for update来修改表中记录,然后被经验丰富一点的老鸟教导这个方法不如rowid修改好,于是摒弃了for update的语法。事实上,对于for update我们可能存在不少误解。误解1.for update是表级锁SESSION1对表T_HOLIDAY的一行SELECT .... for update,可以看到在表级别是3号行...
2018-02-15 16:40:47 5716
原创 用SQL%ROWCOUNT返回SQL语句的影响数量
早前在做一个短信接口时,客户端通过webservice接口发送短信请求,我用一个PLSQL存储过程接收后进行一些处理,然后返回一个处理结果,其中有一段是这样的:大致意思是把短信申请中号码有效的部分进行发送,然后返回总共成功了多少条。当查询的基表数据量比较大,或者SQL的处理逻辑本身比较慢的时候,这种做法效率就显得太低了。比如另外一个更常见的场景是根据输入文本模糊查找企业清单,同时返回结果数:一样的...
2018-02-13 13:38:28 5342
原创 PLS_INTEGER类型
PLS_INTEGER是PLSQL环境中的一个特殊的数字类型,这种类型的值是通过硬件平台原生整数格式来表示的。它存在的意义完全是为了加速运算,具有以下特点1.是一个整数类型2.支持范围-2147483648到2147483647(正负2的31次方)3.未声明的loop循环索引默认是用pls_integer类型的2147483647没有问题,但2147483648就溢出了,从下面图中可以看出,在lo...
2018-02-13 10:26:40 5312
原创 PLSQL自定义EXCEPTION异常
PLSQL开发经常需要用到异常处理(exception)来做一些逻辑处理或者规避一些异常情况,PLSQL中专门有一个异常处理模块的语法来处理这个事情。异常可以分成几类:1.可以预期的数据错误 开发人员已经预料到自己的程序中可能发生的错误,比如主键重复、除数为0等,此时用异常处理来捕捉这些错误,并进行相应的处理,规避或者纠正错误。2.不可预期的错误开发人员并没有预料到的一些错误,比如应用程序端做了...
2018-02-12 19:12:48 5287
原创 前置声明解决相互递归时的PLS-00313
碰到了一个互相递归的情况,在一个存储过程中,函数A需要调用B,同时函数B也需要调用A,此时发生了PLS-00313: XXXX not declared in this scope的错误。原因很直接,在编译函数F_A时,发现F_B函数没有声明过,报错!此时陷入了一个死循环,先放F_B函数,也会因为F_A函数未声明而报错,幸好PLSQL已经考虑到了这种偶发情况,解决的方法是“前置声明”。即在F_A前...
2018-02-11 23:33:11 1355 1
原创 确定性函数(Deterministic)
确定性函数用关键词Deterministic标识,表示函数的返回值完全由输入参数决定。确定性函数有以下用处:1.可以在基于函数的索引中使用该函数;2.可以在物化视图中调用;3.Oracle11g开始会对其参数及其返回结果进行缓存处理以提升性能。但是,是不是一个确定性函数是需要用户来负责的,就是说对函数进行编译的时候不会检查出这个函数是否是确定性的。来看个例子:这个函数返回当前输入时间+1天,只要输...
2018-02-10 14:20:57 26911 2
原创 Oracle PLSQL包和局部模块的区别使用
为了减少重复代码量,需要将存储过程中可以模块化的部分代码封装成一个新的存储过程或函数。刚开始写plsql程序时,每逢遇到这种场景我就会把原来的存储过程改写成一个包(PACKAGE),问题就迎刃而解了。后来得知,实际上不是必须使用包才能解决问题,在原存储过程中把需要封装的代码定义成局部模块(Local or Nested Module),效果是一样的。显然这2种方式都可以剥离重复代码减少代码量,提高...
2018-02-10 09:18:26 542
原创 PLSQL中的重载
跟其他高级语言一样,PLSQL也支持重载,包括存储过程和函数都可以重载,实际上PLSQL自身的很多函数或过程也都是具有重载的。比如dbms_output.put_line过程可以打印数字、字符、日期等各种类型;instr函数对VARCHAR2、Clob类型都支持等等。下面举个简单的存储过程重载的例子:在一个包的声明中,定义了print函数,可以打印布尔型、数字型、字符型和日期型变量,其中字符型是2...
2018-02-08 21:08:47 938
原创 用RAW类型解决不同字符集数据库中文乱码问题
在跟外单位做数据交换时,对方提供了一个默认字符集(WE8MSWIN1252)的数据库我这边是ZHS16GBK的数据库,我需要每天从对方库里抽取增量数据,跨字符集后查询是乱码:对方仅给我方开放了一个查询用户,可以查询一个视图。我方通过DBLINK方式获取对方数据,此时考虑了一下只能通过RAW类型中转的方式进行处理,要求对方修改视图,对中文字段转换成raw类型。现在我方
2018-02-07 14:24:05 2878
原创 短路估算
短路估算很简单的一个逻辑,但是经常会被忽略,对于开发人员来说就像是养成的一个节俭的生活习惯,一点一滴的节省社会资源。短路估算主要用于多条件判断语句,比如IF,CASE WHEN,比如:IF (条件A) AND (条件B) THEN...ELSE....END IF;或者CASE WHEN (条件A) THEN ...WHEN (条件B) THEN ...END
2018-02-07 01:44:31 206
原创 PLSQL标签的3个使用场景
PLSQL标签是对程序中特定的部分代码进行命名的方法,格式是>;其中标签名的命名规则和其他PLSQL对象命令类似,最长30位。标签放在需要命名的代码前面(标签后面必须有代码,实在没有也要写一句NULL;)标签的作用有3个:1.提高代码可读性;比如可以对程序中的一段匿名块进行命名2.程序逻辑跳转;一种是goto跳转无论如何方便,还是建议尽量不要使用goto
2018-02-07 01:28:39 1372
原创 VARCHAR2的最大长度是32767还是4000
VARCHAR2的最大长度是32767还是4000?截止目前的答案应该是这样的:1.Oracle12c之前的版本,表字段类型最大长度是4000个字节;(Oracle12c通过设置初始化参数MAX_SQL_STRING_SIZE为EXTENDED可以支持到32767个字节)2.PLSQL环境中VARCHAR2变量的最大长度是32767个字节;可以通过几个测试观察一下VARCHAR2变量类型的特性:1...
2018-02-07 00:50:33 9242
原创 Oracle分析函数(一、用row_number做后台分页)
提到Oracle的分析函数,最常用的就是row_number、rank、dense_rank这3个函数,具体的用法有无数的文章写过,就不重复了,这里只描述一个row_number的使用场景。大家都知道,分页是个比较复杂的问题,如果数据量比较大,前台一次性缓存的性能就很差,一般都会考虑后台分页取数,这时就需要数据库做分页支持。然后oracle数据库并没有MYSQL里面的limit语法,所以分页一
2018-02-04 18:34:28 1535
原创 用Oracle PLSQL做彩票开奖数据爬虫(二、读取网页数据)
用Oracle PLSQL做彩票开奖数据爬虫(二、读取网页数据)通过配置ACL,我们已经可以获取到网页数据。 可是,我们发现utl_http.request函数返回的数据并不全,最多只能返回1999个字符。 幸运的是Oracle当然已经准备了一套完整的工具来保证满足我们的需求,主要是提供了几个函数,可以把网页数据存入lob类型的字段里。我这里写了一个存储过程,用来爬某期双色球的开奖结果
2018-02-01 22:53:55 1445
原创 用Oracle PLSQL做彩票开奖数据爬虫(一、ACL配置)
oracle PLSQL也可以访问http,意味着可以用oracle来做网络爬虫,之前用python写过彩票开奖历史爬虫,这次也爬一下彩票数据。需要用到PLSQL中UTL_HTTP这个包,用这个包首先需要配置ACL(Access Control List,访问控制列表)。否则就会报错,比如SQL> select utl_http.request('http://www.500.com'
2018-02-01 21:41:38 886
PLSQL开发命名和编码规范(加水印).pdf
2019-09-06
Some Naming and Coding Standards.doc
2019-08-21
《Java Web开发与实战:Eclipse+Tomcat+Servlet+JSP整合应用》光盘代码
2013-05-03
oracle优化大全
2008-10-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人