正则表达式——Oracle篇
Oracle 8 和Oracle 9i中缺乏灵活性的SQL 正则表达式最终在Oracle 10g中得到了解决。Oracle 数据库目前内建了符合POSIX 标准的正则表达式。[@more@]四个新的函数分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和EGEXP_REPLACE。它们在用法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE 用法,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。 POSIX 正则表达式由标准的元字符(metacharacters)所构成:'^' 表示字符串的开始 '$' 表示字符串的结束 '.' 表示任何字符 字符的范围,比如说'[a-z]',表示任何
正则表达式的基本语法
今天看到正则表达式的方便,于是便想研究一番[@more@]首先让我们看两个特殊的符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束。例子如下:"^The":表示所有以"The"开始的字符串("There","The cat"等);"of despair$":表示所以以"of despair"结尾的字符串;"^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;"notice":表示任何包含"notice"的字符串。象最后那个例子,如果你不使用两个
关于Oracle中树结构的查询
ORACLE是一个关系数据库管理系统,它用表的形式组织数据,在某些表中的数据还呈现出树型结构的联系。例如,我们现在讨论雇员信息表EMP,其中含有雇员编号(EMPNO)和经理(MGR)两例,通过这两列反映出来的就是雇员之间领导和被领导的关系。有些雇员领导另一些雇员,有些雇员被领导,还有些雇员领导一些人又被别人领导,他们之间的这种关系就是一种树结构,图1.1表示了EMP表雇员间的这种树结构。[@more@] MGR=7839 MGR=7839 MGR=7839 EMPNO=7566
ORA-14402
ORA-14402: Updating partition key column would cause a partition change[@more@]今天遇到这个分区表的问题。解决方法为:select TABLE_NAME, ROW_MOVEMENT from dba_tables where partitioned = 'YES' ORDER BY ROW_MOVEMENTalter table salary.ps_overtime enable row movement;
Move表、索引、LOB/Long
move一个表到另外一个表空间时,索引不会跟着一起move,而且会失效。(LOB类型例外)[@more@]表move,我们分为:*普通表move*分区表move*LONG,LOB大字段类型move来进行测试和说明。索引的move,我们通过rebuild来实现SQL> select * from v$version;Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit ProductionPL/SQL Release 9.2.0.6.0 - ProductionCORE 9.2.0.6.0 ProductionTNS for Solaris: Version 9.2.0.6.0 - ProductionNLSRTL Version 9.2.0.6.0 - Production一:move普通表、索引基本语法:alter table tab_name move ta
关于oracle中Move机制的一点探讨 (转)
从8i开始,oracle开始提供Move的命令。我们通常使用这个命令,将一个table segment从一个tablespace移动到另一个tablespace。[@more@]Move实际上是在block之间物理的copy数据,那么,我们可以通过这种方式来降低table的HWM。我们先通过一个实验来看看move是如何移动数据的。创建table TEST_HWM,insert一些数据:SQL> create table TEST_HWM (id int ,name char(2000)) tablespace hwm;Table created我们往table TEST_HWM 中insert如下数据:insert into TEST_HWM values (1,'aa');insert into TEST_HWM values (2,'bb');insert into T
Oracle的硬解析和软解析(转)
说到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程。当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程: 1、语法检查(syntax check) 检查此sql的拼写是否语法。 2、语义检查(semantic check) 诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。 3、对sql语句进行解析(prase) 利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。 4、执行sql,返回结果(execute and return) 其中,软、硬
改变桌面和开始菜单的默认路径
把桌面和开始菜单的默认路径指定到其他分区,当系统出现紧急故障需要重装或Ghost时,就不用担心这些资源丢失了[@more@]运行 regedit 进入注册表,在 HKEY CURRENT USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders 下双击字符串值“Desktop”,默认值为:%USERPROFILE%桌面,将其设为你想要的路径,如 D:桌面记得在新路径建一个相应的文件夹,如上,请在 D 盘建一个“桌面”的文件夹。按上面的方法更改字符串“Programs”、“Start Menu”、“Startup”。注销后生效。
java连接oracle数据库的各种方法及java在数据库中的含义
java与oracle的接口: 在数据库中运行JAVA可以说是ORACLE8i的最令人激动的新特性。在你创建的使用ORACLE8i 数据库的应用程序中,你可以使用与JAVA有关的新特征,轻松的将程序发布到INTERNET或INTRANET上。[@more@]Methods for Using Java in ORACLE==================================大家都知道JAVA在跨平台开发与INTERNET开发中已经比较流行,ORACLE8i及以后的版本中都包含了对在数据库中运行JAVA的扩展支持,这里有两种方法可以使用:JDBC:与ODBC类似, JDBC 提供了一个驱动接口使你可以在JAVA程序中访问数据库。注:JDBC驱动内嵌在
Oracle提示的优先级最高?——一次坏块处理的详细记录
所有的ORACLE文档在提到HINT时,都会指出,HINT的优先级最高。但是今天却发现了意外情况[@more@]今天测试人员报告测试库出现一个错误:ORA-01578: ORACLE data block corrupted (file # 39, block # 24961) ORA-01110: data file 39: '/oracle/oradata/test/ndmain09.dbf'由于是测试库,因此没有做热备。测试库中的数据本身并不很重要,丢失一个BLOCK的数据是可以接受的。所以打算直接丢弃坏块中的数据。由于没有必要尝试修复数据,没有必要使用DBMS_REPAIR包,利用设置EVENT导出的方式又相对比较麻烦,打算采用最简单的利用ROWID绕过坏块
利用DBMS_METADATA包获取权限信息
Oracle的9i增加了DBMS_METADATA包,从此在需要得到对象的创建脚本时,不再需要通过查询多张系统视图去自己拼凑结果了。只需要调用这个包中的GET_DDL过程就可以轻松的获取对象的创建脚步。不过很多人对DBMS_METADATA包的了解仅限与此。当需要获取用户的权限时,往往还是采用通过到数据字典中读取的方式,其实DBMS_METADATA包本身就支持获取权限信息。[@more@]DBMS_METADATA的GET_GRANTED_DDL过程可以用于获取用户的授权信息。Oracle支持的授权相关信息类型包括:OBJECT_GRANT、SYSTEM_GRANT、ROLE_GRANT、DEFAULT_ROLE、TABLESPACE_QUOTA和
ora_rowscn
10g里面有了一项新功能,我们可以查看某个表的某一行最后一次改动的scn,这个就是由ora_rowscn来提供。[@more@]SQL 10G>create table test (a number);Table created.SQL 10G>select ora_rowscn from test;no rows selectedSQL 10G>insert into test values(1);1 row created.SQL 10G>column ora_rowscn format 999999999999999999999insert 完成后我们可以查询到ora_rowscnSQL 10G>select ora_rowscn from test;ORA_ROWSCN----------------------21749185488SQL 10G>commit;Commit complete.当事务递交,ora_rowscn发生
LOCK_SGA
各个版本操作系统设置LOCK_SGA参数:AIX 5L(AIX 4.3.3 以上)logon aix as rootcd /usr/samples/kernel./vmtune (信息如下) v_pingshm已经是1./vmtune -S 1然后oracle用户修改initSID.ora 中 lock_sga = true重新启动数据库[@more@]HP UNIXRoot身份登陆Create the file "/etc/privgroup": vi /etc/privgroupAdd line "dba MLOCK" to fileAs root, run the command "/etc/setprivgrp -f /etc/privgroup":$/etc/setprivgrp -f /etc/privgrouporacle用户修改initSID.ora中lock_sga=true重新启动数据库SOLARIS
dbms_stats使用
dbms_stats包问世以后,Oracle专家可通过一种简单的方式来为CBO收集统计数据。目前,已经不再推荐你使用老式的分析表和dbms_utility方法来生成CBO统计数据。那些古老的方式甚至有可能危及SQL的性能,因为它们并非总是能够捕捉到有关表和索引的高质量信息。CBO使用对象统计,为所有SQL语句选择最佳的执行计划。dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。[@more@]下边给出了dbms_stats的一次示范执行情况,其中使用了options子句。 execdbms_stats.gather_sche
ORA-01451
当更改表与列中的字段内容的时候,常常会收到这样的错误:ORA-01451: column to be modified to NULL cannot be modified to NULL[@more@]ORA-01451: column to be modified to NULL cannot be modified to NULLCause: The column may already allow NULL values, the NOT NULL constraint is part of a primary key or check constraint, or an ALTER TABLE MODIFY statement attempted to change a column specification unnecessarily, from NULL to NULL.原因是在表与列中某个字段已经成为允许为 null,现在又再一次使它为允许 null,所以
制作汇总报表
Oracle 的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。 grouping_id()可以美化效果:[@more@] Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。除本文内容外,你还可参考:分析函数参考手册: http://xs
cast 的问题
今天,实施人员给我反应了一个情况,SELECT DISTINCT CAST(WF_ID AS VARCHAR(20)) WF_ID, 这样的语句会提示ORA-00910: specified length too long for its datatype 通过查找资料发现,可能是CAST在EJB中,在使用上可能有一些bug,具体说明如下:[@more@]The EJB application using container-managed persistence beans might fail to run with the sql syntaxSymptom:The EJB application using container-managed persistence beans might fail to run with the sql syntax. This is an Oracle syntax error dealing with an SQL
关于cursor_sharing参数的说明
cursor_sharing是从8I开始提出的在服务器端处理SQL绑定的参数,他由个值force,similar,exact[@more@]force表示强行对SQL语句进行变量绑定,如select * from mytest where name = 'jack';SQL语句传到server端后,会生成select * from mytest where name =:"SYS_B_0" 的SQL版本,后面在运行相同的查询,但name字段的传值不同,也会利用前面生成的查询计划,这个参数在一些没有绑定变量的应用程序里面会带来很好的性能收益,避免了过度的硬解析,但也有弊病,因为随着传入数据的不同,需要执行不同的查询方案,比如走full scan还是走index rang
db_file_multiblock_read_count参数设置取值测试
db_file_multiblock_read_count 是 Full table scan or index fast full scan 时候oracle一次 read 请求的最大block数量 一般oltp:db_file_multiblock_read_count × db_block_size = 256Kdata ware:db_file_multiblock_read_count × db_block_size = 1M与操作系统,应用类型都有关系的,oltp型的可以小点8 ,数据仓库型的可以大点16--32 最好还是做一下测试,Oracle支持最大的 db_file_multiblock_read_count 是128K一般不建议设置这么大 , Oracle建议通常不要超过32K, 而且,如果db_file_multiblock_read_count 设置过大会使全表扫描的成
分析用户表,索引的脚本
用于动态调用,定时分析脚本[@more@]要先用sys用户登录,授权GRANT ALL ON dba_segments TO USER;CREATE OR REPLACE PROCEDURE DBA_ANAYZE_SCHEMA(V_USERNAME VARCHAR2) AS V_PER NUMBER(3) DEFAULT 100; V_START NUMBER := DBMS_UTILITY.GET_TIME; --v_end number;BEGIN /********************* 该存储过程主要是对表及索引进行分析, 对于包含有子分区sub-partition的表需要注意一下granularity参数。具体参考: -- granularity - the granularity of statistics to collect (only pertinent --