随笔分类 -  Oracle - PL/SQL

利用Oracle VPD(虚拟专用数据库)实现类似EBS R12里的多OU屏蔽
摘要:EBS R11通过建立带有CLIENT_INFO过滤条件的视图来实现多OU屏蔽,而R12使用的则是VDP(Virtual Private Database)来实现,关联的package是MO_GLOBAL,ORG_SECURITY。假设我们想让员工只能查看到本部门的所有员工信息:没有应用VDP之前:select * from scott.emp;-----------------------------------------------------------------------------7369 SMITH CLERK 7902 12/17/1980 00:00:0... 阅读全文

posted @ 2012-04-03 16:23 生活不是用来挥霍的

Oracle约束的4种状态小结
摘要:约束的4种状态:disable novalidate 既不会约束新增数据也不会验证已有数据,等同于disableenable novalidate 约束新增数据但不会验证已有数据disable validate 约束新增数据但不会验证已有数据,启用后禁止DMLenable validate 约束新增数据并验证已有数据,等同于enable扩展解释:disable / enable 针对新增数据(对于唯一性约束,enable会自动创建唯一性索引,disable会自动drop索引);novalidate / validate 针对已有数据。测试:Connected to Oracle Databas 阅读全文

posted @ 2012-03-10 17:48 生活不是用来挥霍的

very_confusing
摘要:以下这段代码摘自oracle_pl_sql_programming_5th_edition.pdf第741页,真的是very_confusing:package:CREATE OR REPLACE PACKAGE t01 AS PROCEDURE very_confusing ( arg1 IN VARCHAR2 ,arg2 IN OUT VARCHAR2 ,arg3 IN OUT NOCOPY VARCHAR2 ); END t01; CREATE OR REPLACE PACKAGE BODY t01 AS PROCEDURE very_confusi... 阅读全文

posted @ 2011-11-25 17:21 生活不是用来挥霍的

使用PL/SQL Developer进行DEBUG时Step into会直接跳过procedure
摘要:使用PL/SQL Developer的DEBUG功能我们可以很方便的对PL/SQL代码进行逐行跟踪,但今天突然发现不好使了,检查了一下,确保一下两点即可:1. 不要用sys用户去调试;2. 编译package时需加入debug信息:alter package t01 compile debug; 阅读全文

posted @ 2011-11-25 16:37 生活不是用来挥霍的

Oracle PLSQL之HAVING后面的条件可由聚合函数构成,也可由GROUP BY后的字段构成
摘要:HAVING主要用于对分组后的数据进行过滤,一般我们在其后接聚合函数(SUM,COUNT等),除此之外我们还可以用GROUP BY后面的字段组成HAVING后的过滤条件。SQL> select * from dept; DEPTNO DNAME LOC ------ -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 ... 阅读全文

posted @ 2011-10-27 15:18 生活不是用来挥霍的

Oracle PLSQL之cursor取得是open时的数据
摘要:当我们定义了一个很复杂的cursor,这个cursor需要执行很长时间,在这个cursor执行的过程中,其它用户又修改了该cursor所引用的表的数据时,cursor得到的是修改前还是修改后的数据呢? 答案是cursor得到的始终是cursor在open时的数据,接下来我们将通过一个小实验来验证。 首先,session1执行以下匿名块,该匿名块通过cursor取得t1表的所有数据,不过在open cursor后将暂停30秒,在这30秒中我们将在session2中删除t1表的所有数据: DECLARE CURSOR c IS SELECT deptno ,dna... 阅读全文

posted @ 2011-10-26 23:07 生活不是用来挥霍的

Oracle PL/SQL之对象权限与系统权限的撤销差异
摘要:对象权限测试: 初始状态下,user2和user3都没有user1.t1的对象权限 user1下存在t1表: duzz$user1@orcl>select * from t1; C1 ---------- 1111 Elapsed: 00:00:00.00 user2不能查询user1.t1: duzz$user2@orcl>select * from user1.t1; select * from user1.t1 * ERROR at line 1: ORA-00942: table or view does not... 阅读全文

posted @ 2011-09-12 22:01 生活不是用来挥霍的

Oracle PL/SQL正则表达式之脱字符caret(^)与中括号square brankets([])的组合使用小例
摘要:脱字符(^)放在方括号([])外面表示匹配以方括号([])里面的任何字符开头的字符串;脱字符(^)放在方括号([])里面表示匹配包含有任何不在方括号([])里面的字符的字符串。SQL> select 1 x from dual where regexp_like('0a','^[0-9]'); X ---------- 1 SQL> select 1 x from dual where regexp_like('1a','^[0-9]'); X ---------- 1 SQL> select 1 x fr... 阅读全文

posted @ 2011-09-02 22:43 生活不是用来挥霍的

Oracle PL/SQL之函数索引(Function-based indexes)使用示例
摘要:函数索引(Function-based indexes)只有在where条件使用了与索引中相同的基于相同列的函数时才起作用。duzz$scott@orcl>set autotrace on duzz$scott@orcl>create table t1 as select * from dept; Table created. Elapsed: 00:00:00.01 duzz$scott@orcl>create index loc_idx on t1(upper(loc)); Index created. Elapsed: 00:00:00.06 duzz$scott@or 阅读全文

posted @ 2011-08-29 23:30 生活不是用来挥霍的

Oracle PL/SQL之WITH查询
摘要:为什么要用WITH?1. 如果需要在一段复杂查询里多次应用同一个查询,用WITH可实现代码重用;2. WITH查询类似将查询结果保留到用户临时表里,在大的复杂查询中可以减少IO,有一定的性能优化作用。WITH查询有何限制与特性?1. 如果当前schema下有与WITH查询别名相同的表,查询中WITH查询生成的表优先;2. 只能用于select 语句;3. WITH可包含一个或多个查询;4. WITH查询可被其它查询或WITH查询引用。示例:duzz$scott@orcl>select * from dept; DEPTNO DNAME LOC ----------... 阅读全文

posted @ 2011-08-29 22:54 生活不是用来挥霍的

Oracle PL/SQL之Flashback Table与外键约束
摘要:我们知道 Flashback Table可以把drop掉的表从回收站里恢复回来,但是并不是关于该表的所有东西都能被Flashback回来,比如外键约束。duzz$scott@orcl>create table d(deptno number primary key, deptname varchar2(20)); Table created. Elapsed: 00:00:00.28 duzz$scott@orcl>create table e(empno number primary key, ename varchar2(20), deptno number, constrai 阅读全文

posted @ 2011-08-25 23:55 生活不是用来挥霍的

Oracle PL/SQL之NEXT_DAY - 取得下一个星期几所在的日期
摘要:NEXT_DAY(date,char):返回指定日期(由date指定)后的第一个星期几(由char指定)所在的日期,char也可用1~7替代,1表示星期日。duzz$scott@orcl>select sysdate,to_char(sysdate,'day') weekday,next_day(sysdate,1) n_day,to_char(next_day(sysdate,1),'day') n_weekday from dual; SYSDATE WEEKDAY N_DAY N_WEEKDAY ---------------... 阅读全文

posted @ 2011-08-22 23:15 生活不是用来挥霍的

Oracle PL/SQL之递归查询 - CONNECT BY PRIOR
摘要:duzz$scott@orcl>SELECT employee_id, last_name, job_id, manager_id 2 FROM employees 3 START WITH employee_id = 101 4 CONNECT BY PRIOR employee_id=manager_id; (PRIOR:先前的,优先的;按照先前的employee_id等于本行的manager_id进行递归查询,从上至下) EMPLOYEE_ID LAST_NAME JOB_ID MANAGER_ID ---... 阅读全文

posted @ 2011-08-20 19:18 生活不是用来挥霍的

Oracle PL/SQL之内联接、外联接、交叉连接
摘要:oracle的联接分如下几种:内联接(inner join)。外联接(outer join):全联接(full join)、左联接(left join)、右联接(right join)。交叉联接(cross join)。外联接与内联接不一样,外连接返回到查询结果中的不仅包含符合条件的行,还包括左表(左外连接),右表(右外连接)或者两个连接表(全外连接)中的所有不符合条件的数据行。0.内联接 ([inner] join)内联结就是将左表的所有数据分别于右表的每条数据进行连接组合,返回的结果为同时满足左右表联接条件的数据。SQL语句如下:select * from mt_pb_org o [inn 阅读全文

posted @ 2011-08-13 22:41 生活不是用来挥霍的

Oracle PL/SQL之DDL导致的隐式提交
摘要:1. 如果DDL语法正确,即使执行失败,也会导致隐式提交:duzz$scott@orcl>create table t1 as select * from dept;Table created.Elapsed: 00:00:00.03duzz$scott@orcl>update t1 set loc='xx' where deptno=10;1 row updated.Elapsed: 00:00:00.03duzz$scott@orcl>drop table xx;drop table xx *ERROR at line 1:ORA-00942: table 阅读全文

posted @ 2011-07-31 01:19 生活不是用来挥霍的