漫谈PL/SQL开发经验
文章平均质量分 77
分享经验,收获快乐!
linwaterbin
当时明月在,曾照彩云归。
展开
-
PL/SQL批处理语句:BULK COLLECT 和 FORALL对优化的贡献
我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理 这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换,每次却换时,都有额外的开销 请看下图: 但是,FORALL和BULK COLLECT可以让PL/SQL引擎把多个上下文却换压缩成一个,这使得在PL/SQL中的要处理多行记录的SQL语句执行的花原创 2013-02-15 13:48:48 · 3794 阅读 · 2 评论 -
存储过程的运用之print_table
create or replaceprocedure print_table( p_query in varchar2, p_date_fmt in varchar2 default 'dd-mon-yyyy hh24:mi:ss' )原创 2013-01-21 18:09:17 · 2462 阅读 · 0 评论 -
切莫硬编码VARCHAR2长度
看个例子先,DECLARE think_big VARCHAR2(2000); 不看不知道,一看吓一跳呀,这容器够大也够辣,啥俺们都能吞进去,绝不挑食 然而,这绝对是一颗定时炸弹 Oracle 8时代,VARCHAR2的最大长度是2000 Oracle 8i之后,变成了4000, 为了向后兼容,还会变成啥哩?who knows?原创 2013-01-21 13:08:59 · 1960 阅读 · 1 评论 -
捕获声明部分的异常
异常捕获作用于执行部分,而在声明部分抛出的异常是无法被捕获的 比如,DECLARE var_id number :='Think';BEGIN NULL;EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Exception captured');END; 处理的方法,其实也很简原创 2013-01-21 12:29:26 · 1948 阅读 · 0 评论 -
oracle pl/sql 从if 到 then的“艺术鉴赏”
在oracle开发中,if和then之间的条件表达式,有很多行为充满“艺术”,需要我们去发现,去鉴赏。 欣赏一:三值逻辑 如果一个表达式中包含null值,那么表达式的最终结果会是什么呢?比如:2 例子:IF salary>4000THEN give_bonus(employee_id);END IF; 布尔表达式中的null值,会导致整个表达式的结果也是nul原创 2012-08-07 20:57:01 · 5426 阅读 · 0 评论 -
pl/sql 之三大循环的完全学习指南
1 循环的概述 每个循环包括两个部分:循环边界和循环体。其中,循环边界由一些pl/sql保留字组成。位于循环体外部的代码不应该知道循环内部的工作。但是,循环是把双刃剑,程序的性能问题很容易定位到循环。 2 循环的类型 2.1 简单循环 语法: loop 可执行的语句 end loop;原创 2012-08-20 12:17:24 · 3429 阅读 · 0 评论 -
pl/sql条件和顺序控制
在前一篇blog,写了if的condition的控制,见:点击打开链接 接着这个话题,这里谈if和case。 if先。 几种常见的if组合: 1)if-then组合 语法:原创 2012-09-06 19:43:48 · 2906 阅读 · 0 评论 -
不安装oracle、3分钟直接用pl/sql连接oracle server
很多人、尤其是不喜欢oracle、但却必须在oracle上学习、而且认为oracle占用了很大内存 就很不喜欢在物理机上装oracle、大部分是windows使用者、也大部分是开发人员 基于上面的需求、本人提供一个方案: 在虚拟机上装oracle server,给个最小内存给虚拟机 在物理机,大多数人是windows,上直接下个免安装版的pl原创 2012-11-02 19:09:24 · 2792 阅读 · 0 评论 -
存储过程与权限
在执行存储过程时,我们可能会遇到权限问题 ● 定义者权限存储过程 ● 调用者权限存储过程 在数据库中创建存储过程时,定义者权限是缺省模式 当指定AUTHID CURRENT_USER关键字后,便是调用者权限存储过程 他俩之间最根本的差异在于role能否在存储过程中原创 2012-12-04 12:25:04 · 2014 阅读 · 0 评论 -
理解游标(1):游标的概述
eygle说,数据库的活动主要就是游标的活动 游标的重要可见一斑 为此,我做了系列的文章,循序渐进对游标进行学习 第一篇,是概述,便大体了解先: ① 定义 官方定义: A cursor is a handle or name for a private SQL area原创 2012-12-18 12:31:29 · 1968 阅读 · 0 评论 -
理解游标(2)游标的属性介绍及不同游标类别的案例演示
PL/SQL提供了六种游标属性:游标属性名字说明举例%FOUND如果成功取到记录就返回true;否则,返回falsebegin update t set name='f' where id=2;if SQL%FOUND then dbms_output.put_line('cursor attribute');end if;end;%NOTFOUND如果没有成功取到记录就返回true;否则,原创 2012-12-24 01:45:47 · 3306 阅读 · 0 评论 -
理解游标(3)隐式游标的使用
当我们执行DML或Select into时,PL/SQL引擎会为我们声明一个隐式游标并管理这个游标 之所以谓之“隐式”是因为和游标相关的工作数据库已经替我们自动做好了 我们使用隐式游标,实际就是期待返回一行,这里有一个原则: 对于单行记录查询,我们应该总是将它封装到一个位于包里的函数,把这个查询隐藏在一个函数接口后面,然后用return语句返回数据 隐式游标原创 2012-12-24 17:38:59 · 2179 阅读 · 0 评论 -
异常的定义、抛出和处理
任何错误都叫异常,不期而遇时,执行单元必须交割控制权,这是一个肉包子打狗--有去无回的过程 PL/SQL引擎对系统异常、用户异常或者应用异常皆是一视同仁 异常仅是异常吗?有些异常如NO_DATA_FOUND,我们更愿意待他是逻辑的一个分支 下面详细介绍异常的定义、抛出和处理 ㈠ 定义异常 隐姓埋名的异常仍是合法公民,但他们是原创 2013-01-15 14:36:31 · 2709 阅读 · 0 评论 -
DML触发器的缺憾
TOM说过他希望三样东西不曾存在:触发器,自治事务,WHEN OTHERS 级联删除、级联修改,在设计良好的系统中是不存在的 即使有,那也是小概率事件,必须专门写一段脚本来解决,而不是作为常规功能存在 不得不用触发器,要么是原系统模块化做得不够好,要么是不允许改动原有的代码 当然有时候不是不允许,而是风险太大 每个触发原创 2013-01-15 15:09:20 · 1722 阅读 · 0 评论 -
浅析IF和ELSIF的不平等
之前写过一篇博客,叫:Oracle PL/SQL 从if 到 then的“艺术鉴赏”,地址:点击打开链接 现在范围扩展至每个平行的IF条件,是否应该注意点啥 在条件是平行的时候,是否IF一定是可以无序的呢? 先看个小实验:hr@ORCL> edWrote file afiedt.buf 1 create or replace procedure p_t原创 2013-01-16 14:54:13 · 2457 阅读 · 0 评论 -
显示游标的使用详解
显示游标就是在声明单元明确定义的SELECT子句,并同时指定一个名字 通过这个名字规范化地引用游标属性,同时在OPEN,FETCH,CLOSE语句中通过名字来引用显示游标 INSERT,UPDATE,DELETE或者MERGE都没有显示游标这一说 ㈠ 声明显示游标 语法: CURSOR cursor_name [ ( [pa原创 2013-01-16 20:16:02 · 2677 阅读 · 0 评论 -
PLS_INTEGER类型对性能的些许奉献
如果用PLS_INTEGER值运算,Oracle会使用原生机器算法 其他的所有数值型的数据类型都和NUMBER数据类型一样使用C语言算法库 结果就是PLS_INTEGER值的处理速度比NUMBER型的整数快很多 而且,PLS_INTEGER在移植硬件平台时不会遇到兼容性问题 对于密集型的整数运算,Think建议大家使用PLS_INTEG原创 2013-01-16 21:07:48 · 2038 阅读 · 0 评论 -
SELECT INTO 技巧:0 & 1问题
当我们必须从一个表选择数据插入到临时变量,但所选的数据或者存在或者不存在 也就是返回或者0行或者1行 那么该如何有效的避免数据不存在的情况? 下面有几种技巧,希望可以帮到你 方法一:DECLARE l_sal emp.sal%TYPE; p_empno emp.empno%TYPE := 123; -- Invalid empn原创 2013-01-17 10:02:47 · 2757 阅读 · 0 评论 -
INSTEAD OF 触发器的使用陷阱
对于两张表以上关联起来的视图,Oracle是分不出来应该对哪个表进行更新 而INSTEAD OF 触发器实现了我们对视图DML的需求,显示的告诉告诉Oracle要更新哪个表 和其他类型触发器不同的是,INSTEAD OF 触发器实际上并不是由某个事件触发的 语法:CREATE OR REPLACE TRIGGER trigger_nameINSTEAD OF原创 2013-01-17 13:39:14 · 2124 阅读 · 0 评论 -
触发器内的代码封装
实验准备:hr@ORCL> drop table t purge;Table dropped.hr@ORCL> create table t (code number);Table created.hr@ORCL> create table t_audit (code number,ins_date date);Table created.hr@ORCL> create o原创 2013-01-18 13:33:38 · 1799 阅读 · 0 评论 -
SUBTYPE正规化数据类型
SUBTYPE是类型的别名,倘若需求变更,只需修改一个地方的定义,其他代码都不用改动 也许我们习惯了变量来代表未知数,但却不习惯变量来代表变量类型 而subtype正是起到了这样的作用,他可以用一个新的类型变量来代表一个已知的类型 如果你定义的变量很可能需要改变变量类型,则使用subtype能大大减少你的代码修改量 好处N多,比如,可以重用,能让各模原创 2013-01-21 10:52:23 · 2119 阅读 · 0 评论