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_
SHARED POOL (2)
显示每个用户在shared pool 中的内存使用情况[@more@]先建立视图sql_summary,以备后面脚本调用: rem FUNCTION: Creates summary of v_$sqlarea and dba_users for use in rem sqlmem.sql and sqlsummanry.sql reports rem rem create or replace view sql_summary as select username, &nb
SHARED POOL (1)
检查当前 shared pool 空间使用情况,包括已用空间,剩余空间,使用率等[@more@]REM Script to report on shared pool usageREMcolumn shared_pool_used format 9,999.99column shared_pool_size format 9,999.99column shared_pool_avail format 9,999.99column shared_pool_pct format 999.99start title80 'Shared Pool Summary'spool shared_pool.outselect sum(a.bytes)/(1024*1024) shared_pool_used, max(b.value)/(1024*1024) shared_pool_size, (max(b.value)-sum(a.bytes))/(1024*1024) shared_pool_avail, (sum(a.bytes)/
深入了解SCN
SCN: System Change NumberSCN是顺序递增的一个数字,在Oracle 中用来标识数据库的每一次改动,及其先后顺序。SCN的最大值是0xffff.ffffffff。[@more@]Oracle对SCN的管理单节点的Instance中 单节点的instance中,SCN值存在SGA区,由system commit number latch保护。任何进程要得到当前的SCN值,都要先得到这个latch。RAC/OPS环境中Oracle通过排队机制(Enqueue)实现SCN在各并行节点之间的顺序增长。具体有两种方法: Lamport算法:又称面包房算法,先来先服务算法。跟很多银行采用的排队机制一样。客户到了银行,先领取一个服务号
OWI --用 stored procedure 收集session wait 信息
包括对象如下:event_seq: 序列,用于唯一标识每一条记录dc_event_data: 表,用于存储session wait信息dc_collect:存储过程,用于定期收集各个session wait信息,并保存到dc_event_data表中。根据建议,频率可保持在一分钟一次,而不影响系统性能。dc_analyze: stored procedure. 用于分析和具体化表dc_event_data中的记录--想法来源于<<Oracle Wait Interface A Practical Guide to Performance Diagnostics & Tuning>>[@more@]--------------------------------------------SEQUENCE:-- event_seq 这个序列其实不是很有
OWI -- 用 logoff trigger 保留每个 session 的性能信息
如果某个开发人员跟你说他的程序最近跑得很慢,你问他做了什么修改,他说没有。你说能不能跑给你看一下,他说程序只在每天凌晨跑。这时候收集每个session的性能历史信息就很重要。event 10046对于不确定的session,收集信息太多,成本太高。statspack缺乏追踪每一个数据库连接的功能。用l ogoff trigger 是个不错的选择,该 trigger 会在每个 session 正常退出时自动触发。脚本如下,可根据具体情况作适当修改。--from <<Oracle Wait Interface A Practical Guide to Performance Diagnostics & Tuning>>[@more@]--创建表