2012 年 05 月 04日, 星期五

oracle ebs APP-FND-00027:Oracle Application发现当前的NLS_LANG或NLS_DATE_LANGUAGE环境变量为掩码'MOD'生成的值大于3个字节。请通知管理员必须指定另一个NLS_DATE_LANGUAGE。系统无法在当前配置下运行。

英文的错误信息如下:
APP-FND-00027:Oracle Application has detected that the current NLS_LANG or NLS_DATE_LANGUAGE environment variables produce valuse for the mask 'MOD' that are greater than 3 bytes.Please notify your System Administrator that a different NLS_DATE_LANGUAGE must be specified.The system cannot be run with the current configuration.

只有这此用户报错,其它的用户没事。 查看全文
itpub120 发表于:2012.05.04 13:30 ::分类: ( oracle ERP专栏 ) ::阅读:(17次) :: 评论 (0) :: 引用 (0)

2012 年 05 月 03日, 星期四

form的历史记录问题

表结构中,字段命名错误和遗漏。
目前程序中:
created_by, created_date, last_update_date, last_update_by
标准的应该是:
created_by, creation_date, last_update_date, last_updated_by, last_update_login
itpub120 发表于:2012.05.03 12:46 ::分类: ( oracle ERP专栏 ) ::阅读:(14次) :: 评论 (0) :: 引用 (0)

2012 年 04 月 26日, 星期四

Redhat 浏览网页有乱码 安装中文字体

RedHat Enterprise Linux 5是RedHat新出的版本,现在需要在RHEL5下面用到一些中文的东西,NND,发现中文全是方框框,怎么办?重装?NO,经过仔细分析,发现是没有支持中文的字体,所以我想了想,就把我windows下面的“宋体&新宋体”更新上去。过程如下:
1,cd /usr/share/fonts
2,mkdir truetype
3,cd truetype
4,mkdir simsun
5,使用FTP或SFTP将windows下的simsun文件传到/usr/share/fonts/truetype/simsun/目录中
6,执行 mkfontscale
生成了fonts.scale文件
7,执行 mkfontdir
生成了fonts.dir文件
9,service xfs reload
重起


itpub120 发表于:2012.04.26 13:25 ::分类: ( LINUX园地 ) ::阅读:(17次) :: 评论 (0) :: 引用 (0)

2012 年 03 月 20日, 星期二

REP-3000: 启动 Oracle Toolkit 时发生内部错误.

在服务器的本地机器上执行 xhost + 命令,或者通过VNC的方式,方法如下:

如果要修改DISPLAY参数,请按照下面的方法:

1、使用oratest用户登陆服务器,加载应用环境变量
. /secom/testerp/testappl/APPSORA.env
2、停止应用环境
3、修改$CONTEXT_FILE
vi $CONTEXT_FILE
修改358行
standbyerp:0.0

standbyerp:1.0
4、执行autoconfig
cd $COMMON_TOP/admin/scripts/TESTP_standbyerp
adautocfg.sh
5、启动应用环境
6、在vnc窗口执行xhost +


itpub120 发表于:2012.03.20 15:37 ::分类: ( oracle ERP专栏 ) ::阅读:(46次) :: 评论 (0) :: 引用 (0)

2012 年 03 月 08日, 星期四

insert 中append 用法详解

总结:
关于Nologging与append测试的一些总结,通过上面的SQL语句查看可以得出在大量数据插入过程的语句中加入/*+append*/的这个SQL语句产生的REDO日志明显示是会少同时时间节约了很多,当然这样可能会影响备份因此nologging加载数据后要做一个数据库的全备。

insert append并不是在任何时候都可以节省时间的以下是测试的一些总结:

第一种情况:

database为archivelog状态,这种情况下,就算你用insert append也是不一定提高插入效率的。但是如果你将目标表设置为nologging,然后再使用insert append就会很快。
第二种情况:

database为noarchivelog状态,如果在这种情况下直接采用insert方法而不加入append向表中插入数据,占用的redo空间的大小与archivelog状态下占用的大小是相当的,不论表是否为nologging。但是如果采用insert append方法的话,通过redo的占用值大家可以发现,不论表是否为nologging,所占用的redo的大小都是很小的。也就说明:在数据库为noarchivelog的状态下,采用insert append方法,如果表不是nologging,系统也会自动将表转换为nologging(即在执行insert append之前,先执行一个alter table arch1 nologging)。
第三种情况:

如果表上有索引,则append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo数量可能比表的redo数量还要大。用insert append可以实现直接路径加载速度是快很多,但有一点需要注意: insert append时在表上加”6”类型的锁,会阻塞表上的所有DML语句,因此在有业务运行的情况下要慎重使用。若同时执行多个insert append对同一个表并行加载数据,并不一定会提高速度,因为每一时刻只能有一个进程在加载(排它锁造成)à此观点是在网上查到的对于此疑问对于锁的问题此兄弟可能不是太理解,对于ORACLE数据库来说只要DML特别是insert操作他肯定会将表给锁住而且是独占锁除非进行commit,rollback,及其它的DDL操作来释放否则锁会一直独占导致其它的DML操作无法进行正常的操作,而跟所谓的APPEND无关。

以下是关于表模式(LOGGING/NOLOGGING),插入模式(APPEND/NOAPPEND),数据库运行模式(归档/非归档),REDO日志产生的关系


数据库模式
表模式
插入模式
REDO生成

ARCHIVELOG
LOGGING
APPEND
有REDO

NO APPEND
有REDO

NOLOGGING
APPEND
无REDO

NO APPEND
有REDO

NOARCHIVELOG
LOGGING
APPEND
无REDO

NO APPEND
有REDO

NOLOGGING
APPEND
无REDO

NO APPEND
有REDO


itpub120 发表于:2012.03.08 18:08 ::分类: ( ORACLE技术 ) ::阅读:(112次) :: 评论 (0) :: 引用 (0)

怎么查看ebs里面的请求运行时间

select * from ( select crs.ACTUAL_START_DATE,crs.ACTUAL_COMPLETION_DATE , floor(to_number(crs.ACTUAL_COMPLETION_DATE- crs.ACTUAL_START_DATE )*24*60) as spanMinutes ,crs.PROGRAM from FND_CONC_REQ_SUMMARY_V crs ) a where a.spanMinutes>5 查看全文
itpub120 发表于:2012.03.08 10:47 ::分类: ( oracle ERP专栏 ) ::阅读:(57次) :: 评论 (0) :: 引用 (0)

2011 年 10 月 19日, 星期三

进程查询

ps auxw --sort=%cpu

按CPU查看哪个进程耗的资源比较多
--------------------------------------------------
输入进程号,看是谁在执行

select sa.MODULE,sl.OPNAME, to_char(sl.start_time, 'yyyy-mm-dd hh24:mi:ss') start_time,sa.SQL_TEXT, pr.*,'||',se.*
from v$session se ,v$process pr ,v$session_longops sl,v$sqlarea sa
where se.PADDR=pr.ADDR(+)
and se.SID=sl.SID(+)
and sl.sql_hash_value = sa.hash_value(+)

and pr.SPID in (29657)


itpub120 发表于:2011.10.19 11:03 ::分类: ( LINUX园地 ) ::阅读:(430次) :: 评论 (0) :: 引用 (0)

2011 年 10 月 17日, 星期一

Oracle动态性能视图学习之v$sqltext & v$sqlarea

本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内。
注:V$SQLAREA只包括头1000个字符。

 查看全文
itpub120 发表于:2011.10.17 10:23 ::分类: ( ORACLE技术 ) ::阅读:(138次) :: 评论 (0) :: 引用 (0)

2011 年 06 月 24日, 星期五

sqlplus /nolog 是什么意思

sqlplus命令格式如下:

用法: SQLPLUS [ [<option>] [<logon>] [<start>] ]
其中 <option> ::= -H | -V | [ [-M <o>] [-R <n>] [-S] ]
<登录> ::= <用户名>[/<口令>][@<connect_string>] | / | /NOLOG
<启动> : : = @<文件名>[.<ext>] [<参数> ...]
"-H" 显示 SQL*Plus 的版本标帜和使用语法
"-V" 显示 SQL*Plus 的版本标帜
"-M <o>" 使用 HTML 标志选项 <o>
"-R <n>" uses restricted mode <n>
"-S" uses silent mode

/nolog是不登陆到数据库服务器的意思
如果没有/nolog参数,sqlplus会提示你输入用户名和密码

如果在sql*plus环境中使用shutdown命令关闭了数据库,现在要启动数据库的话,必须先用不登陆到数据库服务器的方式进入sqlplus环境,再用startup命令启动数据库。因为数据库没有启动的话,不能登陆数据库,也无法验证用户名和密码。

sqlplus /nolog --运行sqlplus命令,进入sqlplus环境,nolog参数表示不登录;
SQL> connect / as sysdba --以系统管理员(sysdba)的身份连接数据库;如果需要对数据库进行管理操作,那么需要以这种方式登录数据库,或者
connect sys@service_name as sysdba,其中service_name 你配置的客户tnsname服务名.
SQL> startup --如果数据库没有启动的话,经过上述步骤连接后,正常启动数据


1,sqlplus '/ as sysdba '

2,sqlplus /nolog
SQL> connect / as sysdba

1和2是一样的意思。


itpub120 发表于:2011.06.24 11:06 ::分类: ( ORACLE技术 ) ::阅读:(170次) :: 评论 (0) :: 引用 (0)

2011 年 04 月 26日, 星期二

LINUX 自动执行脚本的命令配置

在root或别的用户下执行 crontab -l 如果没结果反馈,说明没配置好crontab

root执行:
crontab -e
编译的方式和vi一样。
增加这条记录 50 16 * * 1-6 /secom/plan.sh
然后保存退出(命令和vi一样)


itpub120 发表于:2011.04.26 15:24 ::分类: ( LINUX园地 ) ::阅读:(155次) :: 评论 (0) :: 引用 (0)

2011 年 02 月 16日, 星期三

PSCP命令

1.从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html下载pscp,将其放入windows的system32 查看全文
itpub120 发表于:2011.02.16 15:30 ::分类: ( LINUX园地 ) ::阅读:(319次) :: 评论 (0) :: 引用 (0)

2011 年 01 月 12日, 星期三

RAC 实例不能启动 ORA-1589 signalled during ALTER DATABASE OPEN

今天启动RAC 做实验,发现RAC 实例怎么启动不了。

 查看全文

itpub120 发表于:2011.01.12 14:46 ::分类: ( ORACLE技术 ) ::阅读:(724次) :: 评论 (0) :: 引用 (0)

2010 年 09 月 25日, 星期六

Linux scp复制文件,不需要输入密码的技巧

当两台LINUX主机之间要互传文件时可使用SCP命令来实现,建立信任关系之后可不输入密码。 把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中 假设本地主机linux100,远程主机linux200 一,在linux100主机里的用户 运行 #ssh-k
当两台LINUX主机之间要互传文件时可使用SCP命令来实现,建立信任关系之后可不输入密码。

把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中
假设本地主机linux100,远程主机linux200
一,在linux100主机里的用户
运行
#ssh-keygen -t rsa

结果如下

QUOTE:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/.username/ssh/id_rsa):#回车
Enter passphrase (empty for no passphrase):#回车
Enter same passphrase again:#回车
Your identification has been saved in /home/.username /.ssh/id_rsa.
Your public key has been saved in /home/.username /.ssh/id_rsa.pub.
The key fingerprint is:
38:25:c1:4d:5d:d3:89:bb:46:67:bf:52:af:c3:17:0c username@localhost
Generating RSA keys:
Key generation complete.

会在用户目录~/.ssh/产生两个文件,id_rsa,id_rsa.pub
二,把linux100主机上的id_rsa.pub文件拷贝到linux200主机的root用户主目录下的.ssh目录下,并且改名为authorized_keys
即:
/root/.ssh/authorized_keys
这样在linux100主机上使用scp命令复制文件到linux200上将不提示输入密码了,直接复制了。也可在linux100主机上使用scp命令将linux200上文件复制到本机;总之不需要验证,就可以在linux100访问linux200
反之亦然!

注:如果有多台计算机需要与linux200进行复制,则只需将id_rsa.pub中的内容复制到authorized_keys文件中即可。(经在ssh上验证不可以,linux200只可以与一台服务器不需要验证)

三,复制文件或目录命令:
复制文件:
(1)将本地文件拷贝到远程
scp 文件名 用户名@计算机IP或者计算机名称:远程路径
(2)从远程将文件拷回本地
scp 用户名@计算机IP或者计算机名称:文件名 本地路径
复制目录:
(1)将本地目录拷贝到远程
scp -r 目录名 --用户名@计算机IP或者计算机名称:远程路径
(2)从远程将目录拷回本地
scp -r 用户名@计算机IP或者计算机名称:目录名 本地路径


itpub120 发表于:2010.09.25 18:48 ::分类: ( LINUX园地 ) ::阅读:(476次) :: 评论 (0) :: 引用 (0)

2010 年 05 月 19日, 星期三

sessions,processes的监控方法

一个连接可能产生多个sessions,一个sessions可能产生多个processes,同样,一个processes可能对应多个sessions;Oracle的sessions和processes的数量关系大概是:sessions=1.1 * processes + 5

可以用一下sql做监控select * from v$resource_limit;

该视图的字段含义如下:

 查看全文
itpub120 发表于:2010.05.19 17:24 ::分类: ( ORACLE技术 ) ::阅读:(642次) :: 评论 (0) :: 引用 (0)

2009 年 11 月 04日, 星期三

linux中内存使用,swap,cache,buffer的含义

首先介绍一下linux中内存是如何使用的。 查看全文
itpub120 发表于:2009.11.04 15:55 ::分类: ( LINUX园地 ) ::阅读:(732次) :: 评论 (0) :: 引用 (0)

2009 年 07 月 07日, 星期二

statspack摘录

以下内容均在window Xp,oracle9.2.0.1下测试,在linux/unix下路径""要换成"/"
   1.Statspack的安装

  sqlplus /nolog
  conn / as sysdba

 查看全文
itpub120 发表于:2009.07.07 17:54 ::分类: ( ORACLE技术 ) ::阅读:(1221次) :: 评论 (0) :: 引用 (0)

2009 年 05 月 19日, 星期二

动态性能表第五篇--V$SESSION

动态性能表第五篇--V$SESSION
  在本视图中,每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWR,LGWR,arcchiver等等。 查看全文
itpub120 发表于:2009.05.19 11:13 ::分类: ( ORACLE技术 ) ::阅读:(1646次) :: 评论 (0) :: 引用 (0)

oracle 数据库里查看表空间使用状况;

oracle表空间的事情状况要经常查看,一般空闲比例过低的时候就应该考虑增大表看空间了。查看方法如下SQL: 查看全文
itpub120 发表于:2007.06.19 14:51 ::分类: ( ORACLE技术 ) ::阅读:(1894次) :: 评论 (0) :: 引用 (0)

2007 年 06 月 12日, 星期二

LINUX命令收集

1:启动restartapache.sh提示权限不够的错误,解决办法:进入该文件的目录中,执行$ chmod u+x restartapache.sh可解决。 查看全文
itpub120 发表于:2007.06.12 14:32 ::分类: ( LINUX园地 ) ::阅读:(1263次) :: 评论 (0) :: 引用 (0)

ORACLE 命令的应用

这个部分的命令都在动态收集中...... 查看全文
itpub120 发表于:2007.06.12 09:31 ::分类: ( ORACLE技术 ) ::阅读:(1246次) :: 评论 (0) :: 引用 (0)

2007 年 06 月 11日, 星期一

SQL 的跟踪方法trace

大致分如下6步骤执行,看下文...

 查看全文
itpub120 发表于:2007.06.11 18:20 ::分类: ( ORACLE技术 ) ::阅读:(773次) :: 评论 (0) :: 引用 (0)

2007 年 05 月 16日, 星期三

discover中的workbook存储在哪个表中

discover中desktop中的所有的workbook名称存储在哪个表中啊,
还有discover中admin中的权限都存储在哪些表中啊,有谁知道啊 查看全文
itpub120 发表于:2007.05.16 23:09 ::分类: ( oracle ERP专栏 ) ::阅读:(912次) :: 评论 (1) :: 引用 (0)

2007 年 04 月 18日, 星期三

oracle 的临时表解析及与其SQLSERVER的比较(转载)

回复: 临时表存放在哪儿?

DML statements on temporary tables do not generate redo logs for the data changes. However, undo logs for the data

and redo logs for the undo logs are generated. Data from the temporary table is automatically

dropped in the case of session termination, either when the user logs off or

when the session terminates abnormally such as during a session or instance failure

undo logs for the data and redo logs for the undo logs 前者不是放在rollback segment中吗?怎么能写到redo log中去呢?

 查看全文
itpub120 发表于:2007.04.18 12:05 ::分类: ( ORACLE技术 ) ::阅读:(923次) :: 评论 (0) :: 引用 (0)

2007 年 04 月 13日, 星期五

oracle rollup,cube子句的应用举例;

rollup,cube子句在ORACLE中可以用来做交叉报表,如:如总计,小计类的功能很容易实现;但是必须和group by 子句一起使用。举例如下:

 查看全文
itpub120 发表于:2007.04.13 12:47 ::分类: ( ORACLE技术 ) ::阅读:(1932次) :: 评论 (0) :: 引用 (0)

2007 年 04 月 01日, 星期日

分析函数的应用(更新版)

前言:
1. 对原文重新排版,增强可读性
2. 文中列举的例子都在scott/tiger用户下测试通过,增强可操作性,易验证。
3. 继续增加:分析函数在美同统计系统中的应用,分析函数性能比较
4. 欢迎大家批评指正.

 查看全文
itpub120 发表于:2007.04.01 10:41 ::分类: ( ORACLE技术 ) ::阅读:(180601次) :: 评论 (227) :: 引用 (0)

2007 年 03 月 12日, 星期一

GOTO语句在PL/SQL中的应用

PL/SQL也提供GOTO语句,其语法是
GOTO label;
这里label是在PL/SQL块中定义的标签.标签是用双箭头括号括起来的.当执行GOTO语句的时候,控制会立即转到由标签标识的语句. 查看全文
itpub120 发表于:2007.03.12 17:45 ::分类: ( ORACLE技术 ) ::阅读:(2124次) :: 评论 (2) :: 引用 (0)

2007 年 03 月 09日, 星期五

如何创建oracle dblink

数据库之间的链接建立在DATABASE LINK上。要创建一个DB LINK,必须先
在每个数据库服务器上设置链接字符串。 查看全文
itpub120 发表于:2007.03.09 11:50 ::分类: ( ORACLE技术 ) ::阅读:(1229次) :: 评论 (0) :: 引用 (0)

2007 年 01 月 26日, 星期五

SQLSERVER中实现返回汉字笔画数的函数;

SQL SERVER的排序规则平时使用不是很多,也许不少初学者还比较陌生,但有一个错误大家应是经常碰到: SQL SERVER数据库,在跨库多表连接查询时,若两数据库默认字符集不同,系统就会返回这样的错误:

“无法解决 equal to 操作的排序规则冲突。”

 查看全文

itpub120 发表于:2007.01.26 15:44 ::分类: ( ORACLE技术 ) ::阅读:(1712次) :: 评论 (0) :: 引用 (0)

2007 年 01 月 23日, 星期二

ORACLE 的加载工具SQLLDR应用

SQLLDR包括三个文件:控制文件,数据文件,日志文件;

日志文件包括三种:错误日志文件(*.bad),丢弃日志文件(*.dsc);常规日志文件(*.log)

 查看全文
itpub120 发表于:2007.01.23 17:07 ::分类: ( ORACLE技术 ) ::阅读:(966次) :: 评论 (0) :: 引用 (0)

2007 年 01 月 19日, 星期五

详解:数据库名、实例名、服务名等

详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
----------------------------------------------------

数据库名、实例名、数据库域名、全局数据库名、服务名 这是几个令很多初学者容易混淆的概念。相信很多初学者都与我一样被标题上这些个概念搞得一头雾水。我们现在就来把它们弄个明白。

 查看全文
itpub120 发表于:2007.01.19 17:21 ::分类: ( ORACLE技术 ) ::阅读:(1043次) :: 评论 (0) :: 引用 (0)

2007 年 01 月 16日, 星期二

ORACLE 测试题:

ORACLE 测试题:

1:描述死锁产生的过程;

2:描述重做与回滚的认识;

3:索引组织表,聚蔟表的用途;

 查看全文

itpub120 发表于:2007.01.16 16:10 ::分类: ( ORACLE技术 ) ::阅读:(1299次) :: 评论 (0) :: 引用 (0)

2007 年 01 月 11日, 星期四

oracle系统表查询

数据字典dict总是属于Oracle用户sys的。   

1、用户:    

select username from dba_users;   

改口令 alter user spgroup identified by spgtest;   

2、表空间:    

select * from dba_data_files;   

select * from dba_tablespaces;//表空间

select tablespace_name,sum(bytes), sum(blocks)   

from dba_free_space

group by tablespace_name;//空闲表空间

where tablespace_name='RBS';//表空间对应的数据文件

where tablespace_name='INDEXS';

select * from dba_segments     
select * from dba_data_files     查看全文
itpub120 发表于:2007.01.11 17:36 ::分类: ( ORACLE技术 ) ::阅读:(893次) :: 评论 (0) :: 引用 (0)

2007 年 01 月 05日, 星期五

ORACLE RMAN备份的脚本配置

一: 备份;

1:连接目标数据库:

rman>connect target sys/sysray@db或者rman target=sys/sysray@db

 查看全文

itpub120 发表于:2007.01.05 17:31 ::分类: ( ORACLE技术 ) ::阅读:(1305次) :: 评论 (0) :: 引用 (0)

Oracle 表级的快速恢复(实习)

Oracle 表级的快速恢复(实习)

1:查询日志记录:

Select * From v$log_history a

Order By a.SEQUENCE# Desc

或者

Select * From v$loghist a

Order By a.SEQUENCE# Desc

其中SEQUENCE#字段就是日志文件的序列号

 查看全文
itpub120 发表于:2007.01.05 15:43 ::分类: ( ORACLE技术 ) ::阅读:(855次) :: 评论 (0) :: 引用 (0)

2006 年 12 月 27日, 星期三

ORACLE 视图介绍

Oracle视图

Oracle的数据库对象分为五种:表,视图,序列,索引和同义词。

视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。

视图是存储在数据字典里的一条select语句。 通过创建视图可以提取数据的逻辑上的集合或组合。

 查看全文
itpub120 发表于:2006.12.27 16:29 ::分类: ( ORACLE技术 ) ::阅读:(1450次) :: 评论 (0) :: 引用 (0)

2006 年 12 月 05日, 星期二

ORACLE 数组在过程中的应用

ORACLE 数组在存储过程中的应用,现在举实例如下:

首先要初始化数组变量,然后对其分配存储数量.......

 查看全文
itpub120 发表于:2006.12.05 17:26 ::分类: ( ORACLE技术 ) ::阅读:(1920次) :: 评论 (0) :: 引用 (0)

2006 年 11 月 30日, 星期四

ORACLE 树形查询(connect by...start with...)的应用(三)

该篇文章承接上篇:ORACLE 树形查询(connect by...start with...)的应用(二)

做进一步的介绍:如下文:

 查看全文
itpub120 发表于:2006.11.30 18:48 ::分类: ( ORACLE技术 ) ::阅读:(1870次) :: 评论 (0) :: 引用 (0)

ORACLE 树形查询(connect by...start with...)的应用(二)

该篇文章承接上篇:ORACLE 树形查询(connect by...start with...)的应用(一)

做进一步的介绍:如下文:显示一个节点的数据.............

 查看全文
itpub120 发表于:2006.11.30 18:38 ::分类: ( ORACLE技术 ) ::阅读:(1362次) :: 评论 (0) :: 引用 (0)

ORACLE 树形查询(connect by...start with...)的应用(一)

关于oracle的树形查询(connect by...start with...)

转录1

org是部门表,其中orgid是当前部门id,porgid是上级目录id,像这种有父子关系的表中做从某一部门向上或向下的查询用到了oracleconnect by语句:

select * from org connect by prior orgid=porgid start with orgid=1
//
从部门id1的部门寻找所有子部门
select * from org connect by prior porgid=orgid start with orgid=1
//
从部门id1的部门寻找所有父部门

转录2

Oracle 中使用层次查询方便处理财务报表

Oracle 中使用层次查询方便处理财务报表

摘要:本文介绍了如何使用Oracle 中的Connect by 子句,并结合一个实例,完成了对一张资产负债表的计算。

Oracle Connect By 子句对在关系表上表现层次关系提供了方便。

使用Connect by 子句需要在表中定义两个字段,一个是父节点字段,一个是节点字段。其中节点字段一般来说是主键。

 查看全文
itpub120 发表于:2006.11.30 18:13 ::分类: ( ORACLE技术 ) ::阅读:(1709次) :: 评论 (0) :: 引用 (0)

2006 年 11 月 23日, 星期四

oracle高级队列在通信方面的应用设计(AQ高级队列设计说明一)

oracle高级队列在通信方面的应用设计

---AQ高级队列设计说明

关键字:队列,接口,性能

1 前言

一般系统的应用可以分为:立即要执行和可以延迟要执行的事情,区分这个很重要。

为了提高系统的性能,缩短系统等待时间,引入队列技术。

队列是一种能将应用程序的处理工作有效地划分为前台任务和后台任务的技术。当处理容量允许时,这种技术通过存储消息、确定消息处理的优先顺序和向应用程序提交消息来发挥作用。它使你能够平衡本地计算机的负荷,或将任务分配到远程计算机。

为了减少用户的等待时间,应用程序可以让说明需要后台处理的消息排入队列。然后就可以从页面的呈递过程中去掉该处理任务。由一个后台进程来读取并队列处理这些消息,或者甚至可以交由一个单独的系统来处理它们。

队列可以实现各个系统之间的数据共享,消息通信。

2 功能概述

书写本文的目的:利用oracle高级队列实现pl/sql代码,为其它语言实现高级队列的功能作接口。

Oracle高级队列有一下好处:

1 高级队列管理是Oracle数据库的一个特性,它提供消息队列管理功能。这是一个非常可靠、安全和可伸缩的消息管理系统,因为它使用与其他基于Oracle技术的应用程序相同的数据库特性。

2 高级队列管理的一个很大优点是它可以通过PL/SQLJavaC来访问,这样你就可以把来自一个Java servlet的消息入队列和使PL/SQL存储过程中的相同消息出队列。

3高级队列管理的另一个优点是你可以利用这一软件通过Oracle Net Services (SQL*Net)HTTP(S)SMTP,在远程节点之间传播消息。高级队列甚至可以通过消息网关与非Oracle的消息管理系统(如IBM MQSeries)相集成。

4 Oracle高级队列管理提供了单消费者队列和多消费者队列。单消费者队列只面向单一的接收者。多消费者队列可以被多个接收者使用。当把消息放入多消费者队列时,应用程序的程序员必须显式地在消息属性中指定这些接收者,或者建立决定每条消息的接收者的基于规则的订阅过程。

队列的开发主要有:队列的管理和队列的操作。

具体开发步骤如下:

1 首先确定应用的需求,是否适合使用高级队列?使用高级队列预计提高性能的预期值

2确定队列包体结构。

3 队列管理。

4 队列操作。

2 确定队列包体结构

底层消息的通信oracle已经实现,并且封装了,现在需要执行消息包体的结构,消息的发送和消息接收要通过一定的消息结构完成。

现在以短信push为例子,完成高级队列在短信push的应用。

安装好oracle数据库后,对smpuser授权

Grant aq_administrator_role To smpuser;

注意:需要把dbms_aq and dbms_aq_admin 包的调用功能权限付给smpuser.

CREATE OR REPLACE Type mt_struc As Object

/*

功能:push 的mt结构,和T_OUTBOX_PUSH结构一致

日期:2006-09-20

write by hancy

*/

(

OP_ID NUMBER ,

DEST_MOBILENO VARCHAR2(32) ,

FEE_MOBILENO VARCHAR2(32) ,

LONG_NO VARCHAR2(21) ,

MT_CONTENT VARCHAR2(500),

SERVICE_ID VARCHAR2(10) ,

MT_FLAG NUMBER(1) ,

MSG_FMT NUMBER(1) ,

FEE_TYPE NUMBER(1) ,

FEE_VALUE NUMBER(4) ,

BEG_REPORT NUMBER(1) ,

CLIENT_ID NUMBER(4) ,

CLIENT_NAME VARCHAR2(10) ,

MT_TIME DATE ,

MT_ID VARCHAR2(40) ,

PLAN_ID NUMBER ,

PUSH_TYPE VARCHAR2(20) ,

SEND_DATE DATE

)

4 队列管理

4.1建立队列表

队列表是队列的集合,代码如下:

创建下行和上行队列表:

exec dbms_aqadm.create_queue_table(queue_table=>'sms_mt_tab', queue_payload_type=>'mt_struc');

默认:只有一个接收者

具体参数如下:

SQL> desc dbms_aqadm.create_queue_table

Parameter Type Mode Default?

------------------ -------------- ---- --------

QUEUE_TABLE VARCHAR2 IN

QUEUE_PAYLOAD_TYPE VARCHAR2 IN

STORAGE_CLAUSE VARCHAR2 IN Y

SORT_LIST VARCHAR2 IN Y

MULTIPLE_CONSUMERS BOOLEAN IN Y

MESSAGE_GROUPING BINARY_INTEGER IN Y

COMMENT VARCHAR2 IN Y

AUTO_COMMIT BOOLEAN IN Y

PRIMARY_INSTANCE BINARY_INTEGER IN Y

SECONDARY_INSTANCE BINARY_INTEGER IN Y

COMPATIBLE VARCHAR2 IN Y

NON_REPUDIATION BINARY_INTEGER IN Y

SECURE BOOLEAN IN Y

参考dbms_aqadm.create_queue_table
1
.存储参数storage_clause 可以是 MAXTRANS,LOB
2
sort_list 可以是PRIORITY,enq_time2个参数或者其中一个。具体可以察看对应的 队列表的数据结构。例如下面的例子
--
创建队列表,‘sms_aq_tab 队列表名,' sms_aq_tab '队列对象名(充当消息体的对象名称),以下同
dbms_aqadm.create_queue_table('WDZAQTABLE','WDZAQMSG');
--
创建具有排序功能的队列表
dbms_aqadm.create_queue_table('WDZSQRTAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time');
3
。消息分组参数 message_grouping 可以是 NONE, TRANSACTIONAL
-- message grouping
dbms_aqadm.TRANSACTIONAL CONSTANT BINARY_INTEGER := 1;
dbms_aqadm.NONE CONSTANT BINARY_INTEGER := 0;
后者表示一个与事务相关的消息分成1组,在提取消息的时候可以当成一组相关消息来提取。例如:
--
创建带带分组功能的消息队列表
dbms_aqadm.create_queue_table('WDZGROUPAQTABLE','WDZAQMSG',
sort_list => 'PRIORITY,enq_time',
message_grouping =>dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/ );
4
multiple_consumers表示消息接受者是否为多个用户。默认是只有1个接收者。如果要多个用户可以接受消息,需要设置=true
--
创建多个接收者的消息队列表
dbms_aqadm.create_queue_table('WDZMUTIAQTABLE','WDZAQMSG',sort_list => 'PRIORITY,enq_time',
message_grouping =>dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/
,multiple_consumers => true);

4.2删除队列表

Exec dbms_aqadm.drop_queue_table(queue_table => 'sms_mt_tab');
Exec dbms_aqadm.drop_queue_table(queue_table =>
'sms_mo_tab');

4.3建立队列

建立队列代码如下:

exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue', queue_table=>'sms_mt_tab');


exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue_exception', queue_table=>'sms_mt_tab',queue_type=>dbms_aqadm.EXCEPTION_QUEUE);

exec dbms_aqadm.create_queue(queue_name=>'sms_mt_queue_backup', queue_table=>'sms_mt_tab');

参数含义:

参考 dbms_aqadm.create_queue
--
创建队列, sms_mt_queue为队列的名称,' sms_mt_tab ' 队列表名
dbms_aqadm.create_queue('WDZQUEUE','WDZAQTABLE',queue_type => dbms_aqadm.NORMAL_QUEUE);
参数queue_type 表示队列是否为正常队列还是异常队列,参数值为dbms_aqadm.NORMAL_QUEUE 或者dbms_aqadm.EXCEPTION_QUEUE

--
创建多用户队列, 'WDZQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名
dbms_aqadm.create_queue('WDZMUTIQUEUE','WDZMUTIAQTABLE',
queue_type => dbms_aqadm.NORMAL_QUEUE);
--
创建分组队列, 'WDZGROUPQUEUE' 为队列的名称,'WDZAQTABLE' 队列表名
dbms_aqadm.create_queue('WDZGROUPQUEUE', 'WDZAQTABLE',
queue_type => dbms_aqadm.NORMAL_QUEUE);

4.4删除队列

代码如下:

Exec dbms_aqadm.drop_queue('sms_mt_queue');

4.5队列参数调整

A 创建非持久队列

非持久队列 顾名思义就是没有永久保存到数据的队列,队列只存在于系统的内存中。

参考 dbms_aqadm.create_np_queue

dbms_aqadm. create_np_queue ('sms_mt_queue', multiple_consumers=>false);

B 启动一个队列,' sms_mt_queue ' 为队列的名称

dbms_aqadm.start_queue('sms_mt_queue',enqueue=>true, dequeue=> true);

C 停止队列

参数的意思参考启动一个队列

dbms_aqadm.stop_queue(sms_mt_queue ',enqueue=>false, dequeue=>true);

5 队列操作

说明:

1 入队

P100_MT_ENQUEUE
(
p_equeue_name In varchar2,
--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_body In t_outbox_push%Rowtype,
--入参,记录类型,数据源头直接调用
p_level In Number:=
3, --优先级别1-5,数值越小越快
p_delay In Number:=
0, --入队延迟时间,单位:秒
p_res_str OUT VARCHAR2,
--0 成功 其它失败
p_msg_id OUT Varchar2
--返回的msgid,主键
)
2 出队列

p102_mt_dequeue
(
p_equeue_name In varchar2,
--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_client_id Out Number,
--短信内部网关
p_res_str Out varchar2,
--返回值 0 成功 -2 队列为空其它失败
p_label out varchar2,
--标签
p_body out varchar2)
--数据包体

3 数据格式转换 p103_change_label_body_str
(
p_dequeue_body In Mt_Struc,
p_res_str Out Varchar2,
p_label Out varchar2,
p_body Out varchar2
)
/*
功能:把出队列的字符串翻译成有规则的label,和body
日期:2006-09-20
write by hancy
*/

4 测试入队

procedure P101_MT_ENQUEUE_TEST
(
p_equeue_name In varchar2,
--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_res_str out Varchar2,
p_msg_id OUT Varchar2
)

5.1入队

create or replace procedure P100_MT_ENQUEUE
(
p_equeue_name In varchar2,
--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_body In t_outbox_push%Rowtype,
--入参,记录类型,数据源头直接调用
p_level In Number:=
3, --优先级别1-5,数值越小越快
p_delay In Number:=
0, --入队延迟时间,单位:秒
p_res_str OUT VARCHAR2,
--0 成功 其它失败
p_msg_id OUT Varchar2
--返回的msgid,主键
)
/*
功能:数据源头,push,的入队操作
日期:2006-09-20
write by hancy
*/

Is
v_enqueue_options dbms_aq.enqueue_options_t;
v_message_properties dbms_aq.message_properties_t;
v_message_handle raw(
16);
v_body mt_struc;
---写日志区域
vPid NUMBER:=
100;
vProName VARCHAR2(
50):='P100_MT_ENQUEUE';
vProTip VARCHAR2(
255);
vErrorCode VARCHAR2(
20);
vErrorMsg VARCHAR2(
2000);
Begin
--1初始化
p_res_str:=
'-1';

--2 P_BODY 到 v_body 的转化 把一个字符串转化为一个结构体
v_body:=mt_struc(
p_body.OP_ID ,
p_body.DEST_MOBILENO ,
p_body.FEE_MOBILENO ,
p_body.LONG_NO ,
p_body.MT_CONTENT ,
p_body.SERVICE_ID ,
p_body.MT_FLAG ,
p_body.MSG_FMT ,
p_body.FEE_TYPE ,
p_body.FEE_VALUE ,
p_body.BEG_REPORT ,
p_body.CLIENT_ID ,
p_body.CLIENT_NAME ,
p_body.MT_TIME ,
p_body.MT_ID ,
p_body.PLAN_ID ,
p_body.PUSH_TYPE ,
p_body.SEND_DATE );
--4设置属性和参数---
--指定异常队列
v_message_properties.exception_queue:=
'SMS_MT_QUEUE_EXCEPTION';
--设置优先级别
v_message_properties.priority :=p_level;
--设置延时时间--秒
v_message_properties.delay :=p_delay;
--5 开始入队
dbms_aqadm.start_queue(p_equeue_name,enqueue=>true, dequeue=> true);
dbms_aq.enqueue(queue_name=>p_equeue_name,
enqueue_options=>v_enqueue_options,
message_properties=>v_message_properties,
payload=>v_body,
msgid=>v_message_handle);
P_MSG_ID:=v_message_handle ;
--6 commit
Commit;
p_res_str:=
'0';
Exception
When Others Then
p_res_str:=
'-100';
vProTip:=
'入队过程异常!';
vErrorCode:=Sqlcode;
vErrorMsg:=SQLERRM;
p_pub_write_error_log(vPid,vProName,
'','',
vProTip,vErrorCode,vErrorMsg,
1);
Rollback;
end P100_MT_ENQUEUE;

create or replace procedure P101_MT_ENQUEUE_TEST
(
p_equeue_name In varchar2,
--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_res_str out Varchar2,
p_msg_id OUT Varchar2
)
/*
功能:测试入队
日期:2006-09-20
write by hancy
*/

Is
Cursor cur_push Is
Select * From t_outbox_push;
v_row_push t_outbox_push%Rowtype;
v_exe_res varchar2(
200);
v_message_handle raw(
16);
begin
p_res_str:=
'-1';
Open cur_push;
Loop
Fetch cur_push Into v_row_push;
Exit When cur_push%Notfound;
P100_MT_ENQUEUE(p_equeue_name,v_row_push,
3,0,v_exe_res,v_message_handle);
End Loop;
Close cur_push;
p_res_str:=v_exe_res;
p_msg_id:=v_message_handle;
Exception
When Others Then
p_res_str:=Sqlerrm;
Rollback;
end P101_MT_ENQUEUE_TEST;


itpub120 发表于:2006.11.23 17:22 ::分类: ( ORACLE技术 ) ::阅读:(1992次) :: 评论 (1) :: 引用 (0)

利用RMAN备份异机恢复

利用RMAN备份异机恢复
--rman全备份,异机恢复

关键字:RMAN,备份,恢复,参数文件,控制文件,数据文件,oracle

 查看全文
itpub120 发表于:2006.11.23 17:22 ::分类: ( ORACLE技术 ) ::阅读:(888次) :: 评论 (0) :: 引用 (0)

oracle高级队列在通信方面的应用设计(AQ高级队列设计说明二)

5.2出队

create or replace procedure p102_mt_dequeue
(
p_equeue_name In varchar2,
--队列名单大写字母,主队列:SMS_MT_QUEUE 备份队列:SMS_MT_QUEUE_BACKUP
p_client_id Out Number,
--短信内部网关
p_res_str Out varchar2,
--返回值 0 成功 -2 队列为空其它失败
p_label out varchar2,
--标签
p_body out varchar2)
--数据包体
Is
/*
功能: 出队列,返回给java程序
日期:2006-09-20
write by hancy
*/

v_Dequeue_Options Dbms_Aq.Dequeue_Options_t;
v_Message_Properties Dbms_Aq.Message_Properties_t;
v_Message_Handle Raw(
16);
v_Body_queue Mt_Struc;
v_label Varchar2(
200);
v_body varchar2(
1000);
res_str varchar2(
20);
---写日志区域
vPid NUMBER:=
102;
vProName VARCHAR2(
50):='p102_mt_dequeue';
vProTip VARCHAR2(
255);
vErrorCode VARCHAR2(
20);
vErrorMsg VARCHAR2(
2000);
v_count Number;
Begin
--1 初始化
p_res_str:=
'-1' ;
--2 出队列设置属性
--???
--3 执行出队列操作
Select Count(
0) Into v_count From sms_mt_tab Where q_name=p_equeue_name ;
If v_count >
0 Then
dbms_aqadm.start_queue(p_equeue_name,enqueue=>true, dequeue=> true);
Dbms_Aq.Dequeue(Queue_Name => p_equeue_name,
Dequeue_Options => v_Dequeue_Options,
Message_Properties => v_Message_Properties,
Payload => v_Body_queue,
Msgid => v_Message_Handle);
-- 组和 label= 消息类型(CommandID)+运营商标识+地区标识(AreaID)+时间标识
-- 组合 body
--4 返回给java的包体
p103_change_label_body_str(v_Body_queue,res_str,v_label,v_body);
If res_str=
'0' Then
p_label :=v_label;
p_body :=v_body;
p_client_id:=v_Body_queue.CLIENT_ID;
--提交
Commit;
p_res_str:=
'0' ;
Else
p_res_str:=
'出队列后组串失败!' ;
End If;
Else
p_res_str:=
'队列里面没有数据,休息一下';
End If;
Exception
When Others Then
p_res_str:=
'-100';
vProTip:=
'出队过程异常!';
vErrorCode:=SQLCODE;
vErrorMsg:=SQLERRM;
p_pub_write_error_log(vPid,vProName,
'','',
vProTip,vErrorCode,vErrorMsg,
1);
Rollback;
end p102_mt_dequeue;

create or replace procedure p103_change_label_body_str
(
p_dequeue_body In Mt_Struc,
p_res_str Out Varchar2,
p_label Out varchar2,
p_body Out varchar2
)
/*
功能:把出队列的字符串翻译成有规则的label,和body
日期:2006-09-20
write by hancy
*/

Is
---写日志区域
vPid NUMBER:=
103;
vProName VARCHAR2(
50):='p103_change_label_body_str';
vProTip VARCHAR2(
255);
vErrorCode VARCHAR2(
20);
vErrorMsg VARCHAR2(
2000);
--label
v_label Varchar2(
50);
v_client_id Number;
v_date_str varchar2(
20);
--body
v_PRDID varchar2(
10);
v_CHANNELID varchar2(
10);
v_ActionID varchar2(
20);
v_Result varchar2(
20);
v_MSGID varchar2(
20);
v_Pk_total varchar2(
20);
v_Pk_Number varchar2(
20);
v_RegisteredDelivery varchar2(
20);
v_ServiceID varchar2(
20);
v_FeeUserType varchar2(
20);
v_FeeTerminalID varchar2(
35);
v_MsgFmt varchar2(
20);
v_FeeType varchar2(
20);
v_FeeCode varchar2(
20);
v_SrcID varchar2(
30);
v_DestID varchar2(
35);
v_LinkID varchar2(
20);
v_MTFlag varchar2(
20);
v_FixedCode varchar2(
20);
v_RepeatNum varchar2(
20);
v_InfoID varchar2(
20);
v_MsgContent varchar2(
150);
-------------------------------------
v_body varchar2(
2000);
begin
p_res_str:=
'-1';
v_Result :=
'';
v_MSGID :=
'';
v_Pk_total :=
'';
v_Pk_Number:=
'';
--label
Select to_char(Sysdate,
'YY-MM-DD HH:MM:SS') Into v_date_str From dual ;
If p_dequeue_body.CLIENT_ID>
150 Then
v_label:=
'022000000'||v_date_str;
Else
v_label:=
'021000000'||v_date_str;
End If;
--body
v_PRDID:=
'0000' ; v_CHANNELID:='0000'; v_ActionID:='0';
v_Result :=lpad(
' ',8,' ');
v_MSGID :=lpad(
' ',16,' ');
v_Pk_total :=lpad(
' ',1,' ');
v_Pk_Number:=lpad(
' ',1,' ');
--v_RegisteredDelivery
v_RegisteredDelivery:=lpad(p_dequeue_body.BEG_REPORT,
1,' ');
--v_ServiceID
v_ServiceID:=lpad(p_dequeue_body.SERVICE_ID,
10,' ');
--v_FeeUserType
v_FeeUserType:=
'0';
--v_FeeTerminalID
v_FeeTerminalID:=lpad(p_dequeue_body.FEE_MOBILENO,
32,' ');
--v_MsgFmt
v_MsgFmt:=lpad(p_dequeue_body.MSG_FMT,
2,' ');
--v_FeeType
v_FeeType:=lpad(p_dequeue_body.FEE_TYPE,
2,' ');
--v_FeeCode
v_FeeCode:=lpad(p_dequeue_body.FEE_VALUE,
6,' ');
--v_SrcID
v_SrcID:=lpad(p_dequeue_body.LONG_NO,
21,' ');
--v_DestID
v_DestID:=lpad(p_dequeue_body.DEST_MOBILENO,
32,' ');
--v_LinkID
v_LinkID:=lpad(
' ',20,' ');
--v_MTFlag varchar2(20);
v_MTFlag:=lpad(p_dequeue_body.MT_FLAG,
2,' ');
---v_FixedCode varchar2(20);
v_FixedCode:=lpad(
' ',6,' ');
--v_RepeatNum varchar2(20);
v_RepeatNum:=
'1';
--v_InfoID varchar2(20);
v_InfoID:=lpad(
' ',16,' ');
--v_MsgContent varchar2(150);
v_MsgContent:=p_dequeue_body.MT_CONTENT;

--add
v_body:=
(v_PRDID
||v_CHANNELID
||v_ActionID
||v_Result
||v_MSGID
||v_Pk_total
||v_Pk_Number
||v_RegisteredDelivery
||v_ServiceID
||v_FeeUserType
||v_FeeTerminalID
||v_MsgFmt
||v_FeeType
||v_FeeCode
||v_SrcID
||v_DestID
||v_LinkID
||v_MTFlag
||v_FixedCode
||v_RepeatNum
||v_InfoID
||v_MsgContent) ;
--to value
p_label:=v_label;
p_body:=v_body ;
--result
p_res_str:=
'0';
Exception
When Others Then
p_res_str:=Sqlerrm;
vProTip:=
'把出队列的字符串翻译异常!';
vErrorCode:=SQLCODE;
vErrorMsg:=SQLERRM;
p_pub_write_error_log(vPid,vProName,
'','',
vProTip,vErrorCode,vErrorMsg,
1);
Rollback;
end p103_change_label_body_str;

6 注意

1 权限问题

dbms_aq and dbms_aq_admin 包的execute权限授权给smpuser用户.

现象:否则编译不通过,

办法: 授权:

Grant aq_administrator_role To smpuser;

2 用户表空间限制问题

现象:入队操作一定数量的数据后报错:

ORA-00604: error occurred at recursive SQL level 1

ORA-01536: space quota exceeded for tablespace 'SMP_DB'

解决办法:

修改smpuser的限额:<> 修改为:<无限制>就搞定了!


itpub120 发表于:2006.11.23 17:22 ::分类: ( ORACLE技术 ) ::阅读:(1008次) :: 评论 (0) :: 引用 (0)

2006 年 11 月 22日, 星期三

ORACLE中杀死锁进程的方法

步骤一:查询试图,找出sid
Select Distinct a.session_id From Dba_Ddl_Locks a
Where a.name=upper('t_sqlload_tmp');

如果不知道被锁的对象,可以用如下语句查找:

SELECT b.owner,b.object_name,b.object_type,b.object_id
FROM
dba_Objects b
WHERE b.OBJECT_ID IN ( SELECT DISTINCT a.object_id FROM v$locked_object a);

从中发现有个自己在用的对象被锁了,根据object_id执行如下的sql语句:

SELECT S.SID SESSION_ID,S.SERIAL#
FROM V$LOCK L/*,SYS.DBA_OBJECTS O*/,V$SESSION S
WHERE L.SID = S.SID
AND L.ID1 =874582

然后执行如下的sql语句:

ALTER SYSTEM KILL SESSION 'SID,SERIAL#';

这样就可以在pl/sql上杀掉oracle进程,如果不能成功释放,可以用下面的杀手简:

步骤二:找出spid,在linux上杀掉该操作系统进程号:

SELECT SPID
FROM V$PROCESS
WHERE ADDR = (SELECT PADDR FROM V$SESSION WHERE SID = &ORASID);

或者这个语句
Select a.Status, a.Sid, a.Serial#, a.Saddr, a.Paddr, b.Spid, b.Addr, a.Machine
From V$session a, V$process b
Where b.Addr = a.Paddr And a.Sid In (10,14,36);

步骤三:登陆ORALCE系统执行命令;

kill -9 SPID;

如此方法即可解除死锁的进程;


itpub120 发表于:2006.11.22 17:53 ::分类: ( ORACLE技术 ) ::阅读:(1179次) :: 评论 (0) :: 引用 (0)

2006 年 11 月 16日, 星期四

oracle 绑定变量在动态条件统计中的应用

declare

vsql_p varchar2(400);

vsql varchar2(500);

vnum number;

begin

vsql_p := 'partition(prov_id_'|| vprovid|| ')'; --记录分区

vsql := 'select count(0) into :vnum from msno.t_msno_all '||vsql_p||
' t where t.msno_comment = ' ||p_descid||' and t.split_id = 0';
execute immediate vsql into vnum;

if vnum = 0 then
dbms_output.put_line('已经没有可用的一次营销号码');
p_num := vnum;
return;
end if;

end;


itpub120 发表于:2006.11.16 11:50 ::分类: ( ORACLE技术 ) ::阅读:(776次) :: 评论 (3) :: 引用 (0)

2006 年 11 月 14日, 星期二

博客主人心情随笔

<<无题一>>

月光下你的背影

窈窕的身姿依旧朦胧

看得见你的黑发吹向晚风

看不见你那令人迷醉的笑容

最是那一低头的温柔

不胜无比的娇羞!

这首小诗写于大学时代,至今无题,请看了的朋友赐一名;

<<抒怀>>

竹笛声残向晚秋,天涯游子立桥头.

一杯浊酒邀冷月,难消胸中万古愁.

<<竹笛有情>>

夜幕降临,对面窗口的灯亮了,清越的笛声传来,如山泉般悦耳,

如春水般华润,如甘露晶莹,如小溪弯弯,流向那一片未知的心田.

吹出了春花的灿烂,吹出了春风的温暖,吹皱了一泓春水,吹动了年轻的心弦.

<<无题二>>

我爱你

爱你的气质,爱你的品格,爱你的勤奋不息;

对你的思念

如春水一潭,虽清澈见底,却纯如蓝天;

对你的思念

如一缕轻烟,虽丝丝飘渺,却飞向云天;

对你的思念

如绵绵春雨,虽细密如针,却沁入心田;

真的不能忘记,你留在我心中的每一天!!


itpub120 发表于:2006.11.14 12:42 ::分类: ( 心情抒怀 ) ::阅读:(700次) :: 评论 (0) :: 引用 (0)

2006 年 11 月 01日, 星期三

ORACLE分区表的操作应用

ORACLE分区表的操作应用

摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用。   在大型的企业应用或企业级的数据库应用中,要处理的数据量通常可以达到几十到几百GB,有的甚至可以到TB级。虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。   

使用分区的优点:   

·增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;   

·维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;   

·均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;   

·改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。   

Oracle数据库提供对表或索引的分区方法有三种:   

·范围分区    ·Hash分区(散列分区)    ·复合分区   

 查看全文
itpub120 发表于:2006.11.01 11:17 ::分类: ( ORACLE技术 ) ::阅读:(978次) :: 评论 (0) :: 引用 (0)

ORACLE 普通表转换成分区表(在线重定义)

ORACLE 普通表转换成分区表(在线重定义)

大部分转自yangtingkunyangtingkunyangtingkun

在一个高可用系统中,如果需要改变一个表的定义是一件比较棘手的问题,尤其是对于7×24系统。Oracle提供的基本语法基本可以满足一般性修改,但是对于把普通堆表改为分区表,把索引组织表修改为堆表等操作就无法完成了。而且,对于被大量DML语句访问的表,幸运的是,Oracle从9i版本开始提供了在线重定义表功能,通过调用DBMS_REDEFINITION包,可以在修改表结构的同时允许DML操作。

在线重定义表具有以下功能:

修改表的存储参数;

可以将表转移到其他表空间;

增加并行查询选项;

增加或删除分区;

重建表以减少碎片;

将堆表改为索引组织表或相反的操作;

增加或删除一个列。

调用DBMS_REDEFINITION包需要EXECUTE_CATALOG_ROLE角色,除此之外,还需要CREATE ANY TABLE、ALTER ANY TABLE、DROP ANY TABLE、LOCK ANY TABLE和SELECT ANY TABLE的权限。

在线重定义表的步骤如下:

1.选择一种重定义方法:

存在两种重定义方法,一种是基于主键、另一种是基于ROWID。ROWID的方式不能用于索引组织表,而且重定义后会存在隐藏列M_ROW$$。默认采用主键的方式。

2.调用DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,如果表不满足重定义的条件,将会报错并给出原因。

3.在用一个方案中建立一个空的中间表,根据重定义后你期望得到的结构建立中间表。比如:采用分区表,增加了COLUMN等。

4.调用DBMS_REDEFINITION.START_REDEF_TABLE()过程,并提供下列参数:被重定义的表的名称、中间表的名称、列的映射规则、重定义方法。

如果映射方法没有提供,则认为所有包括在中间表中的列用于表的重定义。如果给出了映射方法,则只考虑映射方法中给出的列。如果没有给出重定义方法,则认为使用主键方式。

5.在中间表上建立触发器、索引和约束,并进行相应的授权。任何包含中间表的完整性约束应将状态置为disabled。

当重定义完成时,中间表上建立的触发器、索引、约束和授权将替换重定义表上的触发器、索引、约束和授权。中间表上disabled的约束将在重定义表上enable。

6.(可选)如果在执行DBMS_REDEFINITION.START_REDEF_TABLE()过程和执行DBMS_REDEFINITION.FINISH_REDEF_TABLE()过程直接在重定义表上执行了大量的DML操作,那么可以选择执行一次或多次的SYNC_INTERIM_TABLE()过程,以减少最后一步执行FINISH_REDEF_TABLE()过程时的锁定时间。

7.执行DBMS_REDEFINITION.FINISH_REDEF_TABLE()过程完成表的重定义。这个过程中,原始表会被独占模式锁定一小段时间,具体时间和表的数据量有关。

执行完FINISH_REDEF_TABLE()过程后,原始表重定义后具有了中间表的属性、索引、约束、授权和触发器。中间表上disabled的约束在原始表上处于enabled状态。

8.(可选)可以重命名索引、触发器和约束。对于采用了ROWID方式重定义的表,包括了一个隐含列M_ROW$$。推荐使用下列语句经隐含列置为UNUSED状态或删除。

ALTER TABLE TABLE_NAME SET UNUSED (M_ROW$$);

ALTER TABLE TABLE_NAME DROP UNUSED COLUMNS;

下面是进行重定义操作后的结果:

原始表根据中间表的属性和特性进行重定义;

START_REDEF_TABLE()和FINISH_REDEF_TABLE()操作之间在中间表上建立的触发器、索引、约束和授权,现在定义在原始表上。中间表上disabled的约束在原始表上处于enabled状态。

原始表上定义的触发器、索引、约束和授权建立在中间表上,并会在删除中间表时删除。原始表上原来enabled状态的索引,建立在中间表上,并处于disabled状态。

任何定义在原始表上的存储过程和游标都会变为INVALID,当下次调用时后自动进行编译。

如果执行过程中出现错误或者人为选择退出的话,可以执行DBMS_REDEFINITION.ABORT_REDEF_TABLE()过程。

其中UNAME 参数是指用户;

Oracle的普通表没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,下面介绍三种效率比较高的方法,并说明它们各自的特点。


方法一:利用原表重建分区表。

步骤:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE))
6 AS SELECT ID, TIME FROM T;

表已创建。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
----------
6264

SQL> SELECT COUNT(*) FROM T PARTITION (P1);

COUNT(*)
----------
0

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

COUNT(*)
----------
6246

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
18

优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。

不足:对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对T的访问会失败。

适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。

方法二:使用交换分区的方法。

步骤:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;

表已更改。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)
----------
6264

优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。

不足:仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。

适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。

方法三:Oracle9i以上版本,利用在线重定义功能

步骤:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER’, 'T', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
5 PARTITION P4 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(‘USER’, 'T', 'T_NEW', -
> 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);

可以改为:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(‘USER’, 'T', 'T_NEW')

PL/SQL 过程已成功完成。

SQL> EXEC dbms_redefinition.sync_interim_table(‘USER’, 'T', 'T_NEW')

现在,将中间表与原始表同步。(仅当要对表 T 进行更新时才需要执行该操作。)

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER’, 'T', 'T_NEW');

PL/SQL 过程已成功完成。

  如果重组织失败,那么你就必须采取特殊的步骤来让它重新开始。由于重定义过程需要创建表格的快照,因此为了重新开始这一过程,你必须调用DBMS_REDEFINITION.ABORT_REDEF_TABLE来释放快照。  
DBMS_REDEFINITION.ABORT_REDEF_TABLE
过程有三个参数,即用户(schema)、原始表格(original table name)名称以及持有表格名称(holding table name)。它出栈并允许你开始重组织表格。

SQL> SELECT COUNT(*) FROM T;

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

需要说明的是完成后,原表和中间表的结构也同时进行了交换,并且中间表里面有原表的数据备份。

优点:保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

不足:实现上比上面两种略显复杂。

适用于各种情况。

  然而,在线表格重定义也不是完美无缺的。下面列出了Oracle9i重定义过程的部分限制。    你必须有足以维护两份表格拷贝的空间。   你不能更改主键栏。   表格必须有主键。   必须在同一个大纲中进行表格重定义。   在重定义操作完成之前,你不能对新加栏加以NOT NULL约束。   表格不能包含LONGBFILE以及用户类型(UDT)。   不能重定义链表(clustered tables)。   不能在SYSSYSTEM大纲中重定义表格。   不能用具体化视图日志(materialized view logs)来重定义表格;不能重定义含有具体化视图的表格。   不能在重定义过程中进行横向分集(horizontal subsetting)。


itpub120 发表于:2006.11.01 11:10 ::分类: ( ORACLE技术 ) ::阅读:(768次) :: 评论 (0) :: 引用 (0)

ORACLE UTL_FILE文件包的应用,文件I/O操作

ORACLE UTL_FILE文件包的应用,文件I/O操作

利用ORACLE UTL_FILE包可以使文本文件转入进数据表,反之亦然:

1:建立文件目录:

首先在数据库服务器上建立相应的文件目录。

11方法:

在初始化文件配置文件init.ora的配置中将

UTL_FILE_DIR = E/temp’指定路径;

1.2 方法:

创建路径对象:

Create directory test_dir as e:temp

建议用第二种方法;

2:打开和关闭文件:

所有的文件句柄都拥有UTL_FILE.FILE_TYPEFILE_TYPEUTL_FILE规范中进行了定义。

2.1FOPENlocation in varchar2, filename in varchar2, open_mode in varchar2return FILE_TYPE;

Location 是路径参数,FILENAME 是文件名,OPEN_MODE是打开模式;

有效值:‘R’是读文本,‘W’是写文本,‘A’是附加文本,参数不分大小写,如果指定‘A’但是文件不存在,它会用‘W’先创建出来,‘W’有覆盖的功能;

2.2 : FCLOSE(file_handle in out file_type);

唯一的参数是文件句柄,就是关闭文件;

FCLOSE_ALL关闭所有文件句柄;

2.3: IS_OPEN(file_handle in file_type) return Boolean;

判断文件是否打开;

3:文件输出:

所有的函数如下:

3.1 PUT(file_handle in file_type, buffer in varchar2);

文件输出,但是不会在文件中附加新行字符(newline),必须用put_line或者new_line向文件中输入终结符;

3.2 NEW_LINEfile_handle in file_type, lines in natural := 1;

向文件中写入一个或者多个行终结符;

3.3 PUT_LINE(file_handle in file_type, buffer in varchar2);

等价PUT后接着用NEW_LINE

3.4 PUTF(file_handle in file_type, format in varchar2,

Arg1 in varchar2 default null,

Arg2 in varchar2 default null,

Arg3 in varchar2 default null,

Arg4 in varchar2 default null,

Arg5 in varchar2 default null)

PUT类似,但是它允许输出字符串是带格式的,格式字符中n是换行,%s被可选参数取代;

例如:

Declare

v_outputfile utl_file.file_type;

v_name varchar2(20) := ‘scott’;

begin

v_outputfile := utl_file.fopen(..);

utl_file.putf(v_outputfile,

‘hi there! n my name is %s,and I am a %s major.n’,

V_name,

‘Computer science’ );

Fclose(v_outputfile);

end;

输出文件格式:

hi there!

my name is scott ,and I am a Computer science major.

3.5: 输出文件应用实例:

create or replace procedure p_mmr_new
(p_start_time out date,
p_end_time out date)
is
v_file UTL_FILE.FILE_TYPE;
v_string varchar2(100);
v_error exception;
v_i number;
cursor cur_ms_no is

select distinct substr(trim(a.ms_no),1,11)
from msno.t_upload_msno a,
msno.t_msno_black b
where substr(a.ms_no,1,11) = b.ms_no(+)
and b.ms_no is null;

v_count number;
v_ms_no varchar2(20);
begin
p_start_time:=sysdate;
v_count:=0;
-- insert
v_file := UTL_FILE.FOPEN('OUTER_DIR','ivr170.txt', 'w',32767);
open cur_ms_no ;
loop
fetch cur_ms_no into v_ms_no;
exit when cur_ms_no%notfound;
UTL_FILE.PUT_line(v_file, v_ms_no);
v_count:=v_count+1;
if v_count>=5000 then
UTL_FILE.fflush(v_file);
--UTL_FILE.FCLOSE(v_file);
--v_file := UTL_FILE.FOPEN('OUTER_DIR','v_ms_no.txt', 'a',32767);
v_count:=0;
end if;
end loop;
UTL_FILE.FCLOSE(v_file);
close cur_ms_no;
--close
p_end_time:=sysdate;
EXCEPTION
WHEN v_error Then
UTL_FILE.FCLOSE(v_file);
RETURN;
end;

4:文件输入:

4.1 get_line(file_handle in file_type, buffer out varchar2);

从文件中读出数据;

示例:

Declare

V_newline varchar2(200);

begin

v_filehandle := utl_file.fopen(p_filedir, p_filename, ‘r’);

utl_file.get_line(vfilehandle, v_newline);

insert into t1 (tip) values(v_newline);

end;


itpub120 发表于:2006.11.01 11:03 ::分类: ( ORACLE技术 ) ::阅读:(1103次) :: 评论 (0) :: 引用 (0)

2006 年 10 月 25日, 星期三

爱他

如果你爱他,让他去深圳,那里是天堂;

如果你恨他,让他去深圳,那里是地狱。


itpub120 发表于:2006.10.25 21:04 ::分类: ( 心情抒怀 ) ::阅读:(58751次) :: 评论 (2) :: 引用 (0)

ORACLE外部表的应用实例

ORACLE外部表的应用实例

Oracle 9i 的一项新特性就是 External Table,它就象通常的数据库表一样,拥有字段和数据类型约束,并且可以查询,但是表中的数据却不存储在数据库中,而是在与数据库相关联的普通外部文件里。当你查询 External Table 时,Oracle 将解析该文件并返回符合条件的数据,就象该数据存储在数据库表中一样。
具体的定义可以参见《 Oracle 概念手册》,以下的几点需要注意:

<一>:外部表的描述:

> 创建的语法类似于: "CREATE TABLE ... ORGANIZATION EXTERNAL"
> 数据在数据库的外部组织,是操作系统文件。
> 操作系统文件在数据库中的标志是通过一个逻辑目录来映射的。
> 数据是只读的。(外部表相当于一个只读的虚表)
> 不可以在上面运行任何 DML 操作,不可以创建索引。
> 可以查询操作和连接。可以并行操作。

例子:
假如有如下两个数据文件:
1: 数据文件的格式
F1.TXT文件:

13234,FIRSTS
46464,TESTA

F2.TEXT文件:

13234,SECONDS
46464,TEST
2:创建目录,并进行授权;
sql> create directory test_dir as 'E:temp';
sql>grant read,write on directory test_dir to users;
注意:创建完毕逻辑目录之后要把平面文件拷贝到该目录下,另外还要注意文件名字不要写错。
3:创建外部表:
create table test_table
(ms_no varchar(20),
tip varchar(20),
descs varchar(20))
ORGANIZATION EXTERNAL
(
TYPE ORACLE_LOADER
DEFAULT DIRECTORY test_dir
ACCESS Parameters
(
RECORDS DELIMITED BY NEWLINE
badfile 'bad_dev.txt'
LOGFILE 'log_dev.txt'
FIELDS TERMINATED BY ','
MISSING FIELD VALUES ARE NULL
(ms_no,tip,descs)
)
LOCATION('F1.txt','F2.txt')
)
;
表创建完成.当然也可以导入一个文件

4:进行SELECT 操作看是否正确;
SQL>select * from test_table
结果如下:
MS_NO TIP DESCS
-------------------- -------------------- --------------------
13234 FIRSTS
46464 TESTA
13234 SECONDS
46464 TEST

<二>: 如何得到外部表的有关信息:
SQL> DESC DBA_EXTERNAL_TABLES;
Name Type Nullable
----------------------- ------------- - ----
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
TYPE_OWNER CHAR(3) Y
TYPE_NAME VARCHAR2(30)
DEFAULT_DIRECTORY_OWNER CHAR(3) Y
DEFAULT_DIRECTORY_NAME VARCHAR2(30)
REJECT_LIMIT VARCHAR2(40) Y
ACCESS_TYPE VARCHAR2(7) Y
ACCESS_PARAMETERS VARCHAR2(4000) Y

SQL>SELECT OWNER,TABLE_NAME,DEFAULT_DIRECTORY_NAME,ACCESS_PARAMETERSFRFROM
DBA_EXTERNAL_TABLES;
可以得到外部表的相关信息;


<三>:如何得到外部路径的信息:
SQL> desc DBA_EXTERNAL_LOCATIONS;
得到该表结构:
Name Type Nullable
--------------- -------------- --------
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
LOCATION VARCHAR2(4000) Y
DIRECTORY_OWNER CHAR(3) Y
DIRECTORY_NAME VARCHAR2(30) Y

SQL> select * from DBA_EXTERNAL_LOCATIONS;
得到具体信息;


相关技术贴子联结
http://www.psoug.org/reference/externaltab.html


itpub120 发表于:2006.10.25 20:33 ::分类: ( ORACLE技术 ) ::阅读:(1000次) :: 评论 (0) :: 引用 (0)