在不同版本中, 在PLSQL中MAX/MIN函数对CHAR型数据处理的返回类型不同
在不同版本中, 在PLSQL中MAX/MIN函数对CHAR型数据处理的返回类型不同以下版本返回VARCHAR2类型:9.2.0.4 9.2.0.5 9.2.0.6 9.2.0.7 10.1.0.110.1.0.210.1.0.3以下版本返回CHAR类型:8.1.7.410.1.0.4 10.1.0.510.2.0.1 注意:无论在哪个版本下在sqlplus下返回都是char类型测试例子:[@more@]create table tbl_a ( r1 char(1) );create table tbl_b ( r1 char(6), r2 char(6) );insert into tbl_a values ( '1' );insert into tbl_b values ( '1', 'BB' );commit;DECLARECURSOR C1 ISSELECT MAX(R1) A_R1 FROM TBL_A;ORA_RTN NUMBER;WK_R2 CH
关于Oracle字符类型的比较
今天纠正了一个概念: 以前一直以为char类型的比较就是直接比较,和varchar2比较一样,汗...........主要是平时设计表时基本都用varchar2,很少用char关于字符值的比较, Oracle使用以下两种比较规则:1、空格补齐比较语法对于类型CHAR、NCHAR、text literals、USER函数值, 在进行比较时, 先在较短的那个字符串后补上空格以使长度相等, 然后再进行比较.所以, 'ab'='ab '2、非补齐比较语法对于类型VARCHAR2、NVARCHAR2, 则不用补齐, 直接进行比较.[@more@]C:>sqlplus scott/tiger@vm_dbSQL*Plus: Release 9.2.0.1.0 -
Oracle Bug: 在PL/SQL中使用开窗函数后报ORA-00905
今天在一个存储过程中使用到了分析函数中的开窗函数的功能,开窗函数是用来指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。结果编译时老是报错:PL/SQL: ORA-00905: missing keyword, 把该SQL语句从程序中抽出来在sqlplus下单独执行没有问题, 想到好像以前的版本(似乎是8i)中都不支持在PLSQL中写分析函数,怀疑在新版本中支持得有问题,在metalink中搜了下,果然是Bug 3083373 :https://metalink.oracle.com/metalink/plsql/f?p=130:14:11074853651227166603::::p14_database_id,p14_docid,p14_show_header,p14
把表函数授权给其它用户时的bug
最近在安装一个软件产品时,发现在混合使用pipelined函数和表函数时,在赋权限给其它用户时,Oracle 9.2.0.1版本有bug. tom kyte在asktom的文章:http://asktom.oracle.com/pls/ask/f?p=4950:8:::::F4950_P8_DISPLAYID:4447489221109中建议从9201升级到9205、9206以上metalink上的BUG号为:2204827https://metalink.oracle.com/metalink/plsql/ml2_documents.showDocument?p_id=2204827&p_database_id=BUG上面说这个bug在版本9202就fixed了[@more@]下面语句测试环境Oracle 9.2.0.1 for WindowsSQL> create table tx_vw ( x int );Tabl
关于导出时出现EXP-00091错误
今天有人问导出数据库时老是发现有EXP-00091错误,但又发现数据导入后也没有什么问题。其实这个错误产生原因是表数据的统计信息和当前表实际信息不一致,比如表实际有10000行,统计信息却只有500行,后果是导致CBO生成的执行计划可能不是最优路径,不过可以把这个报错看作是一个警告。如果不想看到这个警告,可以通过添加参数STATISTICS=NONE 来进行屏蔽[@more@]
Oracle10g中MERGE功能的增强
Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作.MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中MERGE有如下一些改进:1、UPDATE或INSERT子句是可选的2、UPDATE和INSERT子句可以加WHERE子句3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行[@more@]首先创建示例表:create table PRODUCTS( PRODUCT_ID INTEGER, PRODUCT_NAME VARCHAR2(60), CATEGORY VARC
Undocument Function 【转载】
这篇文章介绍了一些Oracle未写入帮助文档的函数,其中有些函数在跟踪文件(trace文件)Oracle后台系统给出的[@more@]10.1.0 9.2.0 SYS_OP_VECOR 位运算 or 对16进制的进行的运算 两个参数应为 BINARY 10.1.0$lg@tone.lg.ok >select SYS_OP_VECOR('ff','10') from dual; SY -- FF SYS_OP_VECXOR 位运算 xor 对16进制的进行的运算 两个参数应为 BINARY 10.1.0$lg@tone.lg.ok >select SYS_OP_VECXOR('ff','10')
Oracle10g的新数据类型:本地浮点数据类型
Oracle在10gR1推出本地浮点数据类型(Native Floating-Point Data Types): BINARY_FLOAT(单精度32位)和BINARY_DOUBLE(双精度64位). 这些新数据类型都是基于IEEE二进制浮点运算标准,ANSI/IEEE Std 754-1985 [IEEE 754]. [@more@]使用这些类型时要加上文字f(BINARY_FLOAT)或者d(BINARY_DOUBLE).比如,2.07f 、3.000094dSQL和PL/SQL都支持这些新的数据类型: SQL例子: CREATE TABLE t (f BINARY_FLOAT, d BINARY_DOUBLE); Table created. INSERT INTO t VALUES (2.0f, 2.0d); 1 row created. INSERT INTO t VALUES (1.5f/0.5f, 1.5d/0.5d); 1
常见等待事件的分析解决方法
我们可以通过视图v$session_wait来查看系统当前的等待事件,以及与等待事件相对应的资源的相关信息,从而可确定出产生瓶颈的类型及其对象。v$session_wait的p1、p2、p3告诉我们等待事件的具体含义,根据事件不同其内容也不相同,下面就一些常见的等待事件如何处理以及如何定位热点对象和阻塞会话作一些介绍。 [@more@]<1> db file scattered read DB 文件分散读取这种情况通常显示与全表扫描相关的等待。当全表扫描被限制在内存时,它们很少会进入连续的缓冲区内,而是分散于整个缓冲存储器中。如果这个数目很大,就表明该表找不到索
Oracle10gR2在RH9下启动监听器错误解决方法
在RedHatLinux9下安装完Oracle10.2.0.1后,发现启动监听器老是报错如下:TNS-12537: TNS:connection closedTNS-12560: TNS:protocol adapter errorTNS-00507: Connection closedLinux Error: 29: Illegal seek[@more@]重建监听器也不能解决,最后在metalink上找到答案,原来不知道谁将/etc/hosts下的127.0.0.1 localhost.localdomain localhost给删除了,Oracle从10.1.0.3开始在启动监听器时需要使用到localhost这个本地名字来支持ONS (Oracle Notification Services).解决方法就是将127.0.0.1 localhost.localdomain localhost添加到/etc/host
sqlldr并行加载问题
最近有人问我说,使用sqlldr进行直接路径加载时添加并行参数parallel=true后,并没有发现数据加载效率提高多少.[@more@]我先是怀疑机器不是多cpu的,但对方机器有8个cpu;后来仔细查看文档才知道参数parallel并不是让一个sqlldr语句起多个进程来加载数据,而是不锁住加载表,允许别的直接路径加载. 所以要使parallel起作用,应该先将要加载的数据文件分成多个,用多个sqlldr语句同时加载,如下例:sqlldr userid=scott/tiger control=load1.ctl data=data1.txt direct=y parallel=true &sqlldr userid=scott/tiger control=load2.ctl data=data2
sqlldr加载clob类型遇到的问题
当使用sqlldr加载很长的字符串(超过4000)到表中的clob类型中时,老是报错: 数据文件的字段超出最大长度.查找相关资料后得知,sqlldr每次读入文件中数据流的数据类型默认为CHAR ,长度为 255 .所以只要超过255字符的段都会报这个错.解决方法很简单,在控制文件中字段后添加上char(1000000),例如:LOAD DATA INFILE * INTO TABLE DEMO TRUNCATE
使用rowid来在线重定义表
网上已经有很多在线重定义表的例子,但是大多基于主键进行的,其实oracle也支持rowid的方式进行重定义,下面就简单举个例子. [@more@]SQL> create table demo_1 (id number);表已创建。SQL> insert into demo_1 values (1);已创建 1 行。SQL> insert into demo_1 values (2);已创建 1 行。SQL> insert into demo_1 values (2);已创建 1 行。SQL> insert into demo_1 values (3);已创建 1 行。SQL> insert into demo_1 values (3);已创建 1 行。SQL> commit;提交完成。SQL> execute dbms_redefinition.can_redef_tabl
sqlserver的update操作比oracle快得多
最近听朋友说sqlserver平台上update操作比oracle要快得多,于是做了下测试.测试机就是pc机,同时安装oracle9204和sqlserver2000,分别单独启动进行测试.对于100万行具有4个int类型的表,同时更新4个字段,sqlserver要37秒,oracle要164秒,差距很明显.经过查阅相关资料,知道sqlserver在update的时候居然是表级锁,就是说其它会话不能对该表进行update,会被阻塞,即使update的行和第一个会话update的行不一样也不行.即sqlserver是通过锁住整个表资源来达到update的高性能,牺牲了并行性,当有大量用户同时进行update时就会导致整个系统全部慢下来.而or
10g文档中的bug
今天看10g的文档Database Reference,在附录A Database Limits的Physical Database Limits中,发现有个地方写得不是很准确:Smallfile (traditional) Tablespaces Number of blocks (4 MB) blocks 意思是对于传统表空间,其最大尺寸是4M个数据块(block)这个说法是不准确的,应该说是传统表空间的中每个数据文件的最大尺寸是4M个数据块(block)举例如下(block=8k):[@more@]SQL> create tablespace demo datafile '/u01/oradata/oradb/demo01.dbf' size 25600M; Tablespace created.SQL> alter tablespace demo add datafile
64位系统下shmmax设置问题
系统配置:64位redhat linuxe as3 ,oracle9204,机器有8G内存以前在32位系统下,shmmax的含义是单个共享内存段的最大尺寸,比如你设置shmmax=1G,sga分配了1.2G,当启动db时就分配2块共享内存给oracle。可是最近在64位上测试,发现当设置shmmax <= 956301311时,sga的分配规律和32位上一样。但是如果设置shmmax > 956301311,则如果sga设置的值大于shmmax的值且大于2.3G时,启动数据报错:SQL> startupORA-27123: unable to attach to shared memory segment下面是个在64位上的测试结果:[@more@]shmmax值 SGA值 分配共享内存是
KEEP POOL和CACHE属性的区别
我们知道可以设置表的属性CACHE将表数据放入数据缓存中,也可以设置表将其放入KEEP缓冲池,这两者的区别如下:[@more@]BUFFER POOL包括DEFAULT、KEEP、RECYCLE三个POOL,其大小分别对应三个参数:DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SZIE,这三个POOL相互独立,没有包含的关系。语法如下:create/alter table ...... storage(buffer_pool keep); 当表被读入的时候,放入keep pool,keep pool 中的数据会尽量长时间的保留,保留的时间长短依据keep pool的负载而定。create/alter table ...... cache; 当全表扫描时,放入
导入导出中支持表名模式匹配
这个特性是从9i开始支持的,格式如下:TABLES=(MYSCHEMA.ORDER%, MYSCHEMA.EMP%)可以将以模式MYSCHEMA下以ORDER、EMP开头的表导出或者导入,下面是个简单的验证过程[@more@][oracle@localhost oracle]$ sqlplus test/testSQL*Plus: Release 9.2.0.4.0 - Production on 星期三 4月 26 09:38:26 2006Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.4.0 -
在64位的RHAS3上安装ORACLE9204
操作系统版本如下:[root@test gpodb]# cat /etc/redhat-release Red Hat Enterprise Linux AS release 3 (Taroon Update 5)[root@test gpodb]# uname -aLinux test 2.4.21-32.EL #1 SMP Fri Apr 15 21:02:58 EDT 2005 x86_64 x86_64 x86_64 GNU/Linux安装结论:安装前不用打任何补丁包,直接安装9204的安装文件即可[@more@]
在高级复制环境中执行DDL处理步骤
在高级复制环境中的对于需要复制的对象作任何DDL操作,都应该使用高级复制程序包来实现,下面是在一个复制表上添加两个列的DDL操作的处理流程。[@more@]首先说明一下测试环境:oracle9204,单主体站点,只读物化视图在非复制环境中简单的添加列的语句:ALTER TABLE DEMO ADD (D2 NUMBER,D3 NUMBER);一、在主体站点上执行的步骤1、挂起复制组DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY(GNAME =>'REP_GROUP');2、通过高级复制包中的过程来执行DDLDBMS_REPCAT.ALTER_MASTER_REPOBJECT (SNAME =>'SCOTT',ONAME =>'DEMO',TYPE =>'TABLE'