TRIGGER里的动态SQL
要写一个TRIGGER,把一张表的所有列,修改前后的值,都记录到另外一张修改历史表中。想从user_tab_columns里动态地获取列名,然后用循环自动获取每一列的修改前后值。于是写了一个trigger(仅以scott.emp表的sal列为例)[@more@]CREATE OR REPLACE TRIGGER Print_salary_changesBEFORE DELETE OR INSERT OR UPDATE ON EmpFOR EACH ROWWHEN (new.Empno > 0)DECLAREcursor cur_emp is select * from user_tab_columnswhere table_name='EMP';col_name varchar2(20);sal_new number;state1 varchar2(500);cursor_handle integer;execute_s
Oracle 10g中DB control的host login失败问题
Windows XP上的Oracle10g,在DB control中,有些操作会要求用户进行Host Login(比如start listener, instance startup)。但是用户输入正确的user ID/password后,系统仍然提示错误E"RROR: Wrong password for user",并且登入失败。[@more@]解决办法:1. Control Panel, Administrative Tools.2. Click on Local Security Policy.3. Local Policies, User Rights Assignment.4. Double click, 'Log on as a batch job'.5. Add your local user that you are supplying for the Host Credentials
一台PC上的Data Guard
一台PC上搭建Data Guard,并做Switch-over测试[@more@]具体过程参见http://zhyuh.itpub.net/resource/334/16864中的文档Fail-over测试尚未开始
星型数据库设计
我见过最好的数据仓库入门文章,忍不住花些时间翻译了一下[@more@]http://zhyuh.itpub.net/resource/334/15824 原文请见 http://www.ciobriefings.com/whitepapers/StarSchema.asp
上海南站最新列车时刻表
The latest train list for Shanghai South Railway Station( revised on July. 1st, 2006 )[@more@]Train NumberDestinationDeparture timeGuangzhou 1312Nanjing xi00:01Fuzhou 2002Nanjing xi05:50Ganzhou 2006Suzhou 11:00Yiwu T756Taizhou 12:01T714Nanjing xi12:20Ningbo K256Baotou 12:32Huaihua 1608Wuxi 12:54Hangzhou 1342Qiqihaer17:57Ningbo K76Jilin 22:19Hangzhou T32Beijing 23:45Jilin K75Ningbo 02:11Beijing T31Hangzhou 05:33Qiqihaer 1341Hangzhou06:10N891Jiaxing06:20N521Hangzhou08:30K111Guiyang 08:40N559yiwu09
outer join学习笔记
以scott用户下的表为例,其中的表纪录内容有所变动。[@more@]emp表有6条记录,其中Blake员工对应的部门号为空。SQL> col deptno format a10SQL> select empno,ename,nvl(to_char(deptno),'null') deptno from emp; SQL> col deptno format 999999SQL> select * from dept; 现在查询所有员工和所属部门信息,没有部门的员工也要列出来。使用outer join:SQL> list1 select nvl(to_char(e.deptno),'null') dept_no,nvl(d.dname,'null'),e.empno,e.ename2 from emp e, dept d3* where e.deptno=d.deptno(+)SQL> / 查看执行
Oracle By Example (OBE)
发现一个好地方,里面有很多学习oracle的例子,比起光看文档来,看例子舒服多了。[@more@]http://www.oracle.com/technology/obe/start/index.html
一个UTF8字符集相关问题的解决
一般设计数据库的时候,我们都考虑一个汉字占用两个字节。所以设计数据库的时候,如果认为某字段最长要存四个汉字,该字段都会定义为varchar2(8)。[@more@]SQL> create table t1 (col1 varchar2(8));Table created.但是测试插入三个汉字的时候就报错了。SQL> insert into t1 values('一二三');insert into t1 values('一二三') *ERROR at line 1:ORA-12899: value too large for column "NC31"."T1"."COL1" (actual: 9, maximum:8)检查相关参数及环境变量。SQL> select * fr
查询多张表记录数的存储过程
下面的存储过程,略加修改后,可以用来查看某个用户所有表的记录数,每个表占用的空间等[@more@]CREATE FUNCTION row_count (tab_name VARCHAR2) RETURN INTEGER AS rows INTEGER;BEGIN EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || tab_name INTO rows; RETURN rows;END;/SQL> declare 2 type TabCurTyp is ref cursor; 3 tab_cv TabCurTyp; 4 v_tname varchar2(20); 5 v_sql varchar2(200); 6 v_count number; 7 begin 8 open tab_cv for 9 'select tname from tab where tname in (''EMP''
utl_mail package
Oracle10g中发送email方面,除了原先的utl_smtp包以外,还增加了utl_mail包[@more@]UTL_MAIL package:有cc,bcc,attachment功能, 安装此 package 需要运行utlmail.sql和prvtmail.plb脚本 适合小范围接受用户,附件32k以下,易操作,设置格式 UTL_SMTP package:适合附件32k以上,接收者众多的场合
参数compatible的不可逆性
Oracle10g中,设置compatible参数时,其值不能比上一个值小,以保证Oracle10g不向下兼容,只能向上兼容。[@more@]详细解释如下:For example, let's say you set the COMPATIBLE parameter to 10.0.0 on the Initialization Parameters page in Enterprise Manager (EM), and start the database. If you then shut down the database and restart with the COMPATIBLE parameter set to 9.2.0, an error displays during startup informing you that the compatible setting cannot be reversed. A problem arises if you set the COMPAT
sql*plus参数传递
关于sql*plus里面参数传递的设置和命令[@more@]SQL> column object_name format a15 SQL> column object_id format 999,999 SQL> column object_type format a15 1. SET DEFINE 变量替换标志,默认为'&',可以用set define命令修改成其他字符,如'*'等 SQL> show define define "&" (hex 26) SQL> select object_name,&col2 2 from dba_objects 3 where rownum<2; Enter value for col2: object_id old 1: select object_name,&col2 new 1: select object_name,ob
在sql*plus里编辑SQL命令
常用的编辑命令,包括append, change, input, del, list, clear buffer等[@more@]SQL> select owner,object_nam 2 from dba_objects;select owner,object_nam*ERROR at line 1:ORA-00904: "OBJECT_NAM": invalid identifier1. 将object_name改成object_name,用change (C)SQL> c/nam/name1* select owner,object_name查看修改后结果,用listSQL> list1 select owner,object_name2* from dba_objects SQL> / 2. 在结果集中增加一列object_id,用append (A)--先列出buffer中第一行sqlSQL> list 11* select owner,o
在sql*plus里制作报表 (4)
介绍两个经典的制作报表台头(TITLE)的脚本,该脚本可在台头中显示当前的日期,时间,连接的用户名,当前页码,同时用户可以自己输入抬头标题title80.sql -- 报表的行宽为80个字符title132.sql -- 报表的行宽为132个字符[@more@]title80.sql脚本:可参见http://www.redwingnet.com/hioug/Presentations/Kens-25-Jun-05-Presentation/TITLE80.SQLremrem TITLE80.SQL remrem FUNCTION: This SQL*Plus script builds a standard report heading rem heading for database reports that are 80 columns remcolumn TODAY N
在sql*plus里制作报表 (3)
如何定制台头(TITLE)部分[@more@]20. 给sql结果加上title,做成报表用TTITLE和BTITLE命令TTITLE: Top TitleBTITLE: Bottom Title上述命令可以加参数 CENTER/LEFT/RIGHT确定TITLE的位置居中,还是在左/右侧,也可以用COL n设定从第n列开始显示TITLESQL> TTITLE CENTER 'TEST TOP TITLE' skip 1 -> COL 40 '--by zhyuh'SQL> BTITLE CENTER 'ACCENTURE CONFIDENTIAL'SQL> select object_name,object_type from user_objects where rownum<6;21. 如果某个TITLE内容特别长,可以用以下办法 SQL>
在sql*plus里制作报表 (2)
行显示设置部分主要包括压缩某一列的重复行,尾部增加统计信息[@more@]11. 某一列如果在多条记录中有相同的值,显示时只显示一条一般用在ORDER BY的列中SQL> column owner format a15SQL> column object_name format a2512. 在SYS和SYSTEM的纪录之间加入一条空格行SQL> break on owner skip 1SQL> /13. 在SYS和SYSTEM的纪录之间换页SQL> break on owner skip page14. 在报表的底部增加一统计行统计信息包括SUM: 某一列求和 MINIMUM: 最小值 MAXIMUM: 最大值 AVG: 平均值 STD: 标准差VARIANCE: 方差 COUNT: 值
在sql*plus里制作报表 (1)
列显示设置部分[@more@]以表dba_users为例SQL> select username,user_id,default_tablespace from dba_users where username='OUTLN';1. 改变username列的显示宽度SQL> column username format a10SQL> /2. 改变列user_id的显示头(Heading)SQL> column user_id heading 'user ID'SQL> /3. 将列default_tablespace分成两行显示SQL> column default_tablespace heading DEFAULT|TABLESPACE format a12SQL> /4. 改变column head下面的分割线类型SQL> set underline *SQL> /5. 显示某一列的显示格式设置SQL> co
SHARED POOL (6)
察看Library Cache信息[@more@]rem rem Title: libcache.sql rem rem FUNCTION: Generate a library cache report rem column namespace heading "Library Object" column gets format 9,999,999 heading "Gets" column gethitratio format 999.99 heading "Get Hit%" column pins format 9,999,999 heading "Pins" column pinhitratio format 999.99 heading "Pin Hit%" column reloads format 99,999 heading "Reloads" column invalidations format 99,999 he
SHARED POOL (5)
判断哪些stored procedure和package应该pin在shared pool里[@more@]rem rem FUNCTION: Report Stored Object Statistics rem column owner format a11 heading Schema column name format a30 heading Object|Name column namespace heading Name|Space column type heading Object|Type column kept format a4 heading Kept column sharable_mem format 999,999 heading Shared|Memory column executions format 999,999 heading Executes set lines 132 pages 47 feedback off @title132 'Oracle Objects Report' break on
SHARED POOL (4)
在shared pool中,确定每个用户的Good SQL和Bad SQL所占的内存比例。[@more@]1. 先建立区分Good和Garbage SQL的视图 运行一次以上的sql定义为Good 只运行一次的定义为Garbage 根据业务特点,可以调整Good SQL和Bad SQL的区分标准,即调整标准的运行次数a.executions REM REM View to sort SQL into GOOD and GARBAGE REM CREATE OR REPLACE VIEW sql_garbage AS SELECT b.username users, SUM(a.sharable_mem+a.persistent_mem) Garbage, TO_NUMBER(null) good FROM sys.v_