oracle 修改设置密码复杂度渐增方法:
1、修改为常见密码(无特殊字符)
SQL> alter user chf identified by xifenfei;
User altered.
2、修改含一般特殊字符(如:$, %等)
SQL>
SQL> alter user chf identified by “xi%,fenfei”;
User altered.
SQL> conn chf/xi%,fenfei
Connected.
3、修改含”的特殊字符
3.1)修改制定用户密码(sys用户操作)
SQL> password chf
Changing password for chf
New password:
Retype new password:
Password changed
SQL> conn chf/aa””bb
Connected.
3.2)修改当前用户密码(需要有修改密码权限)
SQL> password
Changing password for CHF
Old password:
New password:
Retype new password:
Password changed
SQL>
注:因为一般特殊字符可以使用双引号处理,但是如果密码中含有双引号,就不能用双引号处理,可以直接使用password修改密码
sys用户密码含$ sqlplus登录数据库诡异事件分析
[oracle@ECP-UC-DB1 ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Mon Oct 17 23:37:51 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> alter user sys identified by "ab$"; User altered. SQL> exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@ECP-UC-DB1 ~]$ sqlplus sys/ab$ as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Mon Oct 17 23:38:53 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show parameter name; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_file_name_convert string db_name string test db_unique_name string test global_names boolean FALSE instance_name string test lock_name_space string log_file_name_convert string service_names string test SQL> exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@ECP-UC-DB1 ~]$ sqlplus sys/ab$abc as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Mon Oct 17 23:39:05 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@ECP-UC-DB1 ~]$ sqlplus sys/ab$@abc as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Mon Oct 17 23:40:06 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show parameter name; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_file_name_convert string db_name string test db_unique_name string test global_names boolean FALSE instance_name string test lock_name_space string log_file_name_convert string service_names string test SQL> exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options [oracle@ECP-UC-DB1 ~]$ sqlplus sys/ab$@abc11 as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Mon Oct 17 23:44:11 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show parameter name; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_file_name_convert string db_name string test db_unique_name string test global_names boolean FALSE instance_name string test lock_name_space string log_file_name_convert string service_names string test SQL>
通过以上sql发现,把sys的密码改为ab$后,无论是什么tns都可以登录数据库,而且都是本地数据库,是不是感觉很诡异,其实你仔细观察发现,密码中有了$,使得$@的操作都变成了无效的,其实就是sqlplus sys/123(随意) as sysdba方式登录本地数据库
[oracle@ECP-UC-DB1 ~]$ sqlplus sys/123 as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Mon Oct 17 23:48:23 2011 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL>
Oracle 小升级 opatch apply使用
这里记录的是Oracle 升级到10.2.0.4后,出现EM不能正常启动情况下,Oracle提示需要打上Patch 8350262,下面是记录打补丁过程
[oracle@ocp ~]$ unzip ~/p8350262_10204_Generic.zip Archive: /home/oracle/p8350262_10204_Generic.zip creating: 8350262/ inflating: 8350262/killDBConsole creating: 8350262/files/ creating: 8350262/files/sysman/ creating: 8350262/files/sysman/jlib/ creating: 8350262/files/sysman/jlib/emCORE.jar/ creating: 8350262/files/sysman/jlib/emCORE.jar/oracle/ creating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/ creating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/ creating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/ creating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/fsc/ inflating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/fsc/FSWalletUtil.class creating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/util/ inflating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/util/RootCert.class inflating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/util/SecConstants.class creating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/rep/ inflating: 8350262/files/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/rep/RepWalletUtil.class creating: 8350262/files/sysman/jlib/emd_java.jar/ creating: 8350262/files/sysman/jlib/emd_java.jar/oracle/ creating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/ creating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/ creating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/ creating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/fsc/ inflating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/fsc/FSWalletUtil.class creating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/util/ inflating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/util/RootCert.class inflating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/util/SecConstants.class creating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/rep/ inflating: 8350262/files/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/rep/RepWalletUtil.class inflating: 8350262/killDBConsole.pl inflating: 8350262/README.txt creating: 8350262/etc/ creating: 8350262/etc/xml/ inflating: 8350262/etc/xml/ShiphomeDirectoryStructure.xml inflating: 8350262/etc/xml/GenericActions.xml creating: 8350262/etc/config/ inflating: 8350262/etc/config/inventory inflating: 8350262/etc/config/actions [oracle@ocp ~]cd 8350262 [oracle@ocp 8350262]$ $ORACLE_HOME/OPatch/opatch apply --Note:$ORACLE_HOME/OPatch/opatch路径 Invoking OPatch 10.2.0.4.2 Oracle Interim Patch Installer version 10.2.0.4.2 Copyright (c) 2007, Oracle Corporation. All rights reserved. Oracle Home : /opt/oracle/app/10.2.0/db_1 Central Inventory : /opt/oracle/oraInventory from : /etc/oraInst.loc OPatch version : 10.2.0.4.2 OUI version : 10.2.0.4.0 OUI location : /opt/oracle/app/10.2.0/db_1/oui Log file location : /opt/oracle/app/10.2.0/db_1/cfgtoollogs/opatch/opatch2011-10-17_18-11-40PM.log ApplySession applying interim patch '8350262' to OH '/opt/oracle/app/10.2.0/db_1' Running prerequisite checks... OPatch detected non-cluster Oracle Home from the inventory and will patch the local system only. Backing up files and inventory (not for auto-rollback) for the Oracle Home Backing up files affected by the patch '8350262' for restore. This might take a while... Backing up files affected by the patch '8350262' for rollback. This might take a while... Patching component oracle.sysman.agent.core, 10.2.0.4.0a... Updating jar file "/opt/oracle/app/10.2.0/db_1/sysman/jlib/emCORE.jar" with "/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/fsc/FSWalletUtil.class" Updating jar file "/opt/oracle/app/10.2.0/db_1/sysman/jlib/emCORE.jar" with "/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/rep/RepWalletUtil.class" Updating jar file "/opt/oracle/app/10.2.0/db_1/sysman/jlib/emCORE.jar" with "/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/util/RootCert.class" Updating jar file "/opt/oracle/app/10.2.0/db_1/sysman/jlib/emCORE.jar" with "/sysman/jlib/emCORE.jar/oracle/sysman/eml/sec/util/SecConstants.class" Updating jar file "/opt/oracle/app/10.2.0/db_1/sysman/jlib/emd_java.jar" with "/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/fsc/FSWalletUtil.class" Updating jar file "/opt/oracle/app/10.2.0/db_1/sysman/jlib/emd_java.jar" with "/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/rep/RepWalletUtil.class" Updating jar file "/opt/oracle/app/10.2.0/db_1/sysman/jlib/emd_java.jar" with "/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/util/RootCert.class" Updating jar file "/opt/oracle/app/10.2.0/db_1/sysman/jlib/emd_java.jar" with "/sysman/jlib/emd_java.jar/oracle/sysman/eml/sec/util/SecConstants.class" ApplySession adding interim patch '8350262' to inventory Verifying the update... Inventory check OK: Patch ID 8350262 is registered in Oracle Home inventory with proper meta-data. Files check OK: Files from Patch ID 8350262 are present in Oracle Home. OPatch succeeded. [oracle@ocp 8350262]$ ../opatch lsinventory --Note检测是否安装成功 Invoking OPatch 10.2.0.4.2 Oracle Interim Patch Installer version 10.2.0.4.2 Copyright (c) 2007, Oracle Corporation. All rights reserved. Oracle Home : /opt/oracle/app/10.2.0/db_1 Central Inventory : /opt/oracle/oraInventory from : /etc/oraInst.loc OPatch version : 10.2.0.4.2 OUI version : 10.2.0.4.0 OUI location : /opt/oracle/app/10.2.0/db_1/oui Log file location : /opt/oracle/app/10.2.0/db_1/cfgtoollogs/opatch/opatch2011-10-17_18-18-34PM.log Lsinventory Output file location : /opt/oracle/app/10.2.0/db_1/cfgtoollogs/opatch/lsinv/lsinventory2011-10-17_18-18-34PM.txt -------------------------------------------------------------------------------- Installed Top-level Products (2): Oracle Database 10g 10.2.0.1.0 Oracle Database 10g Release 2 Patch Set 3 10.2.0.4.0 There are 2 products installed in this Oracle Home. Interim patches (1) : Patch 8350262 : applied on Mon Oct 17 18:17:28 CST 2011 Created on 14 Sep 2010, 04:59:44 hrs PST8PDT Bugs fixed: 8350262 -------------------------------------------------------------------------------- OPatch succeeded.
Oracle常见后台进程及其功能汇总
今天参照oracle官方文档和metalink文档,对Oracle常见后台进程及其功能汇总进行了一次汇总
Oracle常见后台进程及其功能汇总
http://www.xifenfei.com/wp-content/uploads/2011/10/Oracle_Process.pdf
checking network configuration requirements
最近准备考ocp,所以决定按照教程,从头到尾系统的学习一次oracle,也算是为了对得起考证的几千大洋。
在安装oracle 10g的过程中,遇到了checking network configuration requirements is: Not executed的错误提示。
没有执行网络检测,google下,发现是/etc/hosts中没有指定静态ip地址导致,检测/etc/hosts发现果真如此(好久没有装oracle 了,竟然忘记这个基础的东西)修改如下配置
127.0.0.1 ocp localhost.localdomain localhost
192.168.1.55 ocp.xifenfei.com
重新检测,显示正常
rac中的spfile探讨
今天朋友的的rac,因为被同事做数据库升级,分别在两个节点的本地创建了spfile,然后使用这个spfile启动了数据库,因为他不是非常懂oracle,所以向我求救,我改他的建议是:
1、利用备份的原来的pfile文件创建在asm中的spfile,规则是:+ASM/SID/spfileSID
2、dbs目录下创建一个本地的initsid.ora,然后在里面加一个spfile=’+ASM pfile path’(两个节点同样操作,注意sid不同)
3、分别重启数据库
出现该问题的原因分析:
做数据库升级的朋友的同事也不懂rac的spfile的相关规则,应该是在重启数据库的时候,提示spfile不存在,然后自己手工创建利用pfile创建的spfile到dbs下面,然后朋友十一后检测数据库,发现spfile都放置在本地了。
1、通常读取参数文件顺序
我们知道,如果不指定参数文件,oracle是按照这个顺序查找文件来启动数据库的:
spfileSID.ora
spfile.ora
initSID.ora
init.ora
如果这些文件都没有找到,启动会失败。
2、RAC中关于spfile的启动探讨
[rac@cent1 dbs]$ echo $ORACLE_SID RACDB1 [rac@cent1 dbs]$ touch spfileRACDB1.ora <==手工创建一个空白的spfile [rac@cent1 dbs]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Thu Apr 29 13:45:50 2010 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORA-27091: unable to queue I/O <== 用sqlplus启动数据库时会报错 ORA-27069: attempt to do I/O beyond the range of the file Additional information: 1 Additional information: 1 SQL> SQL> exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options [rac@cent1 dbs]$ crs_stat -t Name Type Target State Host ------------------------------------------------------------ ora....B1.inst application OFFLINE OFFLINE ora....B2.inst application ONLINE ONLINE cent2 ora.RACDB.db application ONLINE ONLINE cent1 ora....SM1.asm application ONLINE ONLINE cent1 ora....T1.lsnr application ONLINE ONLINE cent1 ora.cent1.gsd application ONLINE ONLINE cent1 ora.cent1.ons application ONLINE ONLINE cent1 ora.cent1.vip application ONLINE ONLINE cent1 ora....SM2.asm application ONLINE ONLINE cent2 ora....T2.lsnr application ONLINE ONLINE cent2 ora.cent2.gsd application ONLINE ONLINE cent2 ora.cent2.ons application ONLINE ONLINE cent2 ora.cent2.vip application ONLINE ONLINE cent2 [rac@cent1 dbs]$ srvctl start instance -i racdb1 -d racdb <== 用srvctl启动成功 [rac@cent1 dbs]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.4.0 - Production on Thu Apr 29 13:47:25 2010 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options SQL> select instance_name, status from v$instance; INSTANCE_NAME STATUS ---------------- ------------ RACDB1 OPEN --说明srvctl不是用那个顺序去查找参数文件
3、查看srvctl读取spfile位置
[rac@cent1 dbs]$ srvctl config database -d racdb -a cent1 RACDB1 /rac/product/10.2.0/db cent2 RACDB2 /rac/product/10.2.0/db DB_NAME: RACDB ORACLE_HOME: /rac/product/10.2.0/db SPFILE: +DATA/RACDB/spfileRACDB.ora DOMAIN: WORLD DB_ROLE: null START_OPTIONS: null POLICY: AUTOMATIC ENABLE FLAG: DB ENABLED
4、修改CRS中关于spfile位置
[rac@cent1 dbs]$ srvctl modify database -d racdb -p ' +DATA/RACDB/spfileRACDB1.ora'
利用rowid排序更新大表数据
现在有个案例,有一张很大的表t1,需要更新其中的一个列,然后这个列是参考另外一个表t2中的列
直接sql操作如:
update t1 ta set prov_code=(select area_code from t2 tb where ta.id=tb.id);
利用rowid,分批提交的思路写出如下sql,执行大表更新效率比较高
DECLARE CURSOR cur IS SELECT a.area_code, b.ROWID ROW_ID FROM t2 a, t1 b WHERE a.id = b.id ORDER BY b.ROWID; V_COUNTER NUMBER; BEGIN V_COUNTER := 0; FOR row IN cur LOOP UPDATE t1 SET prov_code = row.area_code WHERE ROWID = row.ROW_ID; V_COUNTER := V_COUNTER + 1; IF (V_COUNTER >= 1000) THEN COMMIT; V_COUNTER := 0; END IF; END LOOP; COMMIT; END;
这里利用了rowid排序,使得update操作是一个一个数据块的进行,减少逻辑读,分批提交减小undo压力
Startup Migrate
1、为什么要使用Startup Migrate
STARTUP MIGRATE was introduced in 9.2 as a mechanism to be sure that most everything that needs to be done to run an upgrade script or a patch script is done automatically. In the past, customers were expected to adjust certain initialization parameters prior to beginning an upgrade or applying a a patch, but most of this is now done automatically by STARTUP MIGRATE. When a customer starts a database in MIGRATE mode, the following ALTER SYSTEM commands will be set automatically:
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET “_SYSTEM_TRIG_ENABLED”=FALSE SCOPE=MEMORY;
ALTER SYSTEM SET _undo_autotune=FALSE SCOPE=MEMORY;
ALTER SYSTEM SET undo_retention=900 SCOPE=MEMORY;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0 SCOPE=MEMORY;
ALTER SYSTEM SET AQ_TM_PROCESSES=0 SCOPE=MEMORY;
这些我们可以从数据库的Startup Migrate命令启动数据库的日志中可以看出来
Sun Oct 9 21:53:04 2011 ALTER SYSTEM enable restricted session; Sun Oct 9 21:53:04 2011 ALTER SYSTEM SET _system_trig_enabled=FALSE SCOPE=MEMORY; Autotune of undo retention is turned off. Sun Oct 9 21:53:04 2011 ALTER SYSTEM SET _undo_autotune=FALSE SCOPE=MEMORY; Sun Oct 9 21:53:04 2011 ALTER SYSTEM SET undo_retention=900 SCOPE=MEMORY; MMNL started with pid=12, OS id=8452 Sun Oct 9 21:53:04 2011 ALTER SYSTEM SET aq_tm_processes=0 SCOPE=MEMORY; Sun Oct 9 21:53:04 2011 Resource Manager disabled during database migration: plan '' not set Sun Oct 9 21:53:04 2011 ALTER SYSTEM SET resource_manager_plan='' SCOPE=MEMORY; replication_dependency_tracking turned off (no async multimaster replication found) Completed: ALTER DATABASE OPEN MIGRATE
2、Startup Migrate主用作用
在9i,无论升级/降级 数据库都是startup migrate
10g后增加了upgrade参数,升级可直接用startup upgrade,降级仍是startup migrate
3、Startup Migrate辅助作用(解决部分ORA-00701)
SQL> alter index I_H_OBJ#_COL# rebuild; alter index I_H_OBJ#_COL# rebuild * ERROR at line 1: ORA-00701: object necessary for warmstarting database cannot be altered SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup migrate; ORACLE instance started. Total System Global Area 139531744 bytes Fixed Size 452064 bytes Variable Size 121634816 bytes Database Buffers 16777216 bytes Redo Buffers 667648 bytes Database mounted. Database opened. SQL> alter index I_H_OBJ#_COL# rebuild; Index altered. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 139531744 bytes Fixed Size 452064 bytes Variable Size 121634816 bytes Database Buffers 16777216 bytes Redo Buffers 667648 bytes Database mounted. Database opened.
sqlplus 使用小技巧
1、sqlplus显示语言设置
export NLS_LANG=”AMERICAN_AMERICA.ZHS16GBK”
export NLS_LANG=”SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
注意数据库编码:ZHS16GBK/UTF8
2、dbms_output.put_line显示最前面空格
SQL> set serveroutput on
SQL> exec dbms_output.put_line(‘ abc’);
abc
PL/SQL procedure successfully completed.
SQL> set serveroutput on format wrapped
SQL> exec dbms_output.put_line(‘ abc’);
abc
PL/SQL procedure successfully completed.
3、sqlplus 语句中间查询对象结构
SQL> select owner
2 # desc input
Name Null? Type
—————————————– ——– —————————-
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)
2 ,status from input where rownum<10;
no rows selected
下一行以#开头, 就可以执行一条sql*plus命令, 执行完后, 刚才的语句可以继续输入
4、Sql*plus中sql语句中间有空行
SQL> select owner
2
SQL> ,status from input where rownum<10; SP2-0734: unknown command beginning “,status fr…” – rest of line ignored. 原因是sqlplus遇到空行就认为是语句结束了. 其实要改变这种现象, 只要使用SQLBLANKLINES参数就可以了 SQL> SET SQLBLANKLINES ON
SQL> select owner
2
3 ,status from input where rownum<10;
no rows selected
ORA-01465: invalid hex number
网友反馈blob插入一些字段报错,查询metalink,发现使用rawtohex处理即可,测试如下:
SQL> create table t_lob (t blob); Table created. SQL> insert into t_lob values('-------'); insert into t_lob values('-------') * ERROR at line 1: ORA-01465: invalid hex number SQL> insert into t_lob values(rawtohex('---------')); 1 row created. SQL> insert into t_lob values('----------&'); insert into t_lob values('----------&') * ERROR at line 1: ORA-01465: invalid hex number SQL> insert into t_lob values(rawtohex('----------&')); 1 row created. SQL> commit; Commit complete.
网友提供java处理代码如下:
///插入 public void test() { conn=DBUtil.getActiveConnection(); String sqlStr="Set define off"; String ss="————"; String sql="insert into test1(names,btestname) values('12',rawtohex('"+ss+"'))"; System.out.println(sqlStr); System.out.println(sql); try { pstmt=conn.prepareStatement(sqlStr); pstmt.addBatch(); pstmt=conn.prepareStatement(sql); pstmt.addBatch(); pstmt.executeBatch(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { DBUtil.closeStatement(pstmt); DBUtil.closeConnection(conn); } } ////查询语句 public void getTest() { conn=DBUtil.getActiveConnection(); String sql="select * from test1 where names='12'"; //oracle.sql.BLOB blob = null; InputStream inStream=null; try { pstmt=conn.prepareStatement(sql); set=pstmt.executeQuery(); if(set!=null && set.next()) { //接收blob类型 java.sql.Blob blob = (oracle.sql.BLOB)set.getBlob("btestname"); //注意 inStream = blob.getBinaryStream(); if(blob!=null) System.out.println("有值============"); try { byte[] data = new byte[200]; int length=0;//每次读取的实际字节长度 //is.read()方法:从buff缓中区的第0个位开始读取字节,每次最多读取200, //方法会返回一个实际读取的长度,用length接收,当值为-1时,表示所有的字节全部读取完毕 while((length=inStream.read(data,0,200))!=-1) { //把字节以平台的默认编码方式转为字符,从buff的第0个位开始转换,实际要转换的长度是length String str=new String(data,0,length); System.out.println("最终结果==== "+str+" ===="); } //关闭流 inStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { DBUtil.closeResultSet(set); DBUtil.closeStatement(pstmt); DBUtil.closeConnection(conn); } }