alexprefect

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿(2)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • linux (rss)
  • log日志 (rss)

随笔档案

  • 2011年10月 (1)
  • 2011年8月 (2)
  • 2011年7月 (3)
  • 2009年11月 (1)

文章分类

  • ecllipse使用(7) (rss)
  • linux(1) (rss)
  • log日志(1) (rss)
  • mybatis(4) (rss)
  • oracle(1) (rss)
  • tomcat(2) (rss)

文章档案

  • 2014年11月 (1)
  • 2013年2月 (1)
  • 2012年8月 (2)
  • 2012年7月 (1)
  • 2012年3月 (4)
  • 2011年7月 (2)
  • 2010年2月 (3)
  • 2010年1月 (3)
  • 2009年12月 (12)
  • 2009年11月 (2)
  • 2009年9月 (5)
  • 2009年8月 (8)
  • 2009年6月 (5)
  • 2009年5月 (11)
  • 2009年4月 (10)
  • 2009年3月 (2)

搜索

  •  

最新评论

  • 1. re: mybatis环境搭建(转载)
  • 12
  • --12
  • 2. re: Mybatis SQL映射文件(转载)
  • 看看
  • --郑辣南
  • 3. re: JS跳转页面参考代码大全(转载)
  • TY
  • --aSD
  • 4. re: log4j.properties配置详解(转载)[未登录]
  • 赞
  • --a
  • 5. re: struts2为每个线程提供一个action实例
  • 123123
  • --12

阅读排行榜

  • 1. oracle客户端绿色版,不再为WINDOWS系统版本发愁了!(5714)
  • 2. 华为短信机接口开发注意事项(1483)
  • 3. StringUtil(862)
  • 4. 时间 字符转换(543)
  • 5. 使用Oracle 的 imp ,exp 命令实现数据的导入导出 (503)

评论排行榜

  • 1. 使用Oracle 的 imp ,exp 命令实现数据的导入导出 (0)
  • 2. 华为短信机接口开发注意事项(0)
  • 3. 怎么查看端口占用情况(转载)(0)
  • 4. oracle客户端绿色版,不再为WINDOWS系统版本发愁了!(0)
  • 5. 时间 字符转换(0)

Powered by: 博客园
模板提供:沪江博客
BlogJava | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

2011年7月13日

使用Oracle 的 imp ,exp 命令实现数据的导入导出

本文对Oracle数据的导入导出 imp ,exp 两个命令进行了介绍, 并对其相应的参数进行了说明,然后通过一些示例进行演练,加深理解.
文章最后对运用这两个命令可能出现的问题(如权限不够,不同oracle版本)进行了探讨,并提出了相应的解决方案;
本文部分内容摘录自网络,感谢网友的经验总结;


一.说明

   oracle 的exp/imp命令用于实现对数据库的导出/导入操作;
   exp命令用于把数据从远程数据库服务器导出至本地,生成dmp文件;
   imp命令用于把本地的数据库dmp文件从本地导入到远程的Oracle数据库中。

二.语法

可以通过在命令行输入 imp help=y 获取imp的语法信息:
=============================================================================
  C:\Documents and Settings\auduser>imp help=y

  Import: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:21:57 2008

  (c) Copyright 2001 Oracle Corporation.  All rights reserved.

  可以通过输入 IMP 命令和您的用户名/口令
  后接用户名/口令的命令:

  例程: IMP SCOTT/TIGER

  或者, 可以通过输入 IMP 命令和各种参数来控制“导入”
  按照不同参数。要指定参数,您可以使用关键字:

  格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)
  例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
  或 TABLES=(T1: P1,T1: P2),如果 T1 是分区表

  USERID 必须是命令行中的第一个参数。

  关键字  说明(默认)        关键字      说明(默认)
  --------------------------------------------------------------------------
  USERID   用户名/口令           FULL         导入整个文件 (N)
  BUFFER   数据缓冲区大小         FROMUSER     所有人用户名列表
  FILE     输入文件 (EXPDAT.DMP)    TOUSER       用户名列表
  SHOW     只列出文件内容 (N) TABLES      表名列表
  IGNORE   忽略创建错误 (N)    RECORDLENGTH  IO 记录的长度
  GRANTS  导入权限 (Y)           INCTYPE      增量导入类型
  INDEXES 导入索引 (Y)          COMMIT       提交数组插入 (N)
  ROWS    导入数据行 (Y)        PARFILE      参数文件名
  LOG      屏幕输出的日志文件   CONSTRAINTS  导入限制 (Y)
  DESTROY                覆盖表空间数据文件 (N)
  INDEXFILE              将表/索引信息写入指定的文件
  SKIP_UNUSABLE_INDEXES  跳过不可用索引的维护 (N)
  FEEDBACK               每 x 行显示进度 (0)
  TOID_NOVALIDATE        跳过指定类型 ID 的验证
  FILESIZE               每个转储文件的最大大小
  STATISTICS             始终导入预计算的统计信息
  RESUMABLE              遇到与空格有关的错误时挂起 (N)
  RESUMABLE_NAME         用来标识可恢复语句的文本字符串
  RESUMABLE_TIMEOUT      RESUMABLE 的等待时间
  COMPILE                编译过程, 程序包和函数 (Y)

  下列关键字仅用于可传输的表空间
  TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
  TABLESPACES 将要传输到数据库的表空间
  DATAFILES 将要传输到数据库的数据文件
  TTS_OWNERS 拥有可传输表空间集中数据的用户

==============================================
同样可以通过输入 exp help=y 获取exp的语法信息

  Microsoft Windows XP [版本 5.1.2600]
  (C) 版权所有 1985-2001 Microsoft Corp.

  C:\Documents and Settings\auduser>exp help=y

  Export: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:26:34 2008

  (c) Copyright 2001 Oracle Corporation.  All rights reserved.

 

  通过输入 EXP 命令和用户名/口令,您可以
  后接用户名/口令的命令:

  例程: EXP SCOTT/TIGER

  或者,您也可以通过输入跟有各种参数的 EXP 命令来控制“导出”
  按照不同参数。要指定参数,您可以使用关键字:

  格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
  例程: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)
  或 TABLES=(T1: P1,T1: P2),如果 T1 是分区表

  USERID 必须是命令行中的第一个参数。

  关键字  说明(默认)        关键字      说明(默认)
  --------------------------------------------------------------------------
  USERID   用户名/口令           FULL         导出整个文件 (N)
  BUFFER   数据缓冲区大小         OWNER     所有者用户名列表
  FILE       输出文件 (EXPDAT.DMP)  TABLES       表名称列表
  COMPRESS   导入到一个区 (Y) RECORDLENGTH IO 记录的长度
  GRANTS  导出权限 (Y)           INCTYPE      增量导出类型
  INDEXES    导出索引 (Y)         RECORD       跟踪增量导出 (Y)
  DIRECT     直接路径 (N)            TRIGGERS     导出触发器 (Y)
  LOG        屏幕输出的日志文件  STATISTICS   分析对象 (ESTIMATE)
  ROWS    导出数据行 (Y)        PARFILE      参数文件名
  CONSISTENT 交叉表一致性    CONSTRAINTS  导出约束条件 (Y)

  FEEDBACK             每 x 行显示进度 (0)
  FILESIZE             每个转储文件的最大大小
  FLASHBACK_SCN        用于回调会话快照的 SCN
  FLASHBACK_TIME       用来获得最接近于指定时间的 SCN 的时间
  QUERY                用来导出表的子集的选择子句
  RESUMABLE            遇到与空格有关的错误时挂起 (N)
  RESUMABLE_NAME       用来标识可恢复语句的文本字符串
  RESUMABLE_TIMEOUT    RESUMABLE 的等待时间
  TTS_FULL_CHECK       对 TTS 执行完全或部分相关性检查
  TABLESPACES          要导出的表空间列表
  TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
  TEMPLATE 调用 iAS 模式导出的模板名称

三.使用示例

3.1 数据导出:

 1 将数据库SampleDB完全导出,用户名system 密码manager 导出到E:\SampleDB.dmp中

   exp system/manager@TestDB file=E:\sampleDB.dmp full=y

 2 将数据库中system用户与sys用户的表导出

   exp system/manager@TestDB file=E:\sampleDB.dmp  owner=(system,sys)

 3 将数据库中的表 TableA,TableB 导出

    exp system/manager@TestDB  file=E:\sampleDB.dmp  tables=(TableA,TableB)

 4 将数据库中的表tableA中的字段filed1 值为 "王五" 的数据导出

   exp system/manager@TestDB  file=E:\sampleDB.dmp  tables=(tableA)  query=' where filed1='王五'
 
   如果想对dmp文件进行压缩,可以在上面命令后面 加上 compress=y 来实现。

3.2 数据的导入

 1 将备份数据库文件中的数据导入指定的数据库SampleDB 中,如果 SampleDB 已存在该表,则不再导入;

   imp system/manager@TEST  file=E:\sampleDB.dmp  full=y  ignore=y
 

 2 将d:\daochu.dmp中的表table1 导入

 imp system/manager@TEST  file=E:\sampleDB.dmp  tables=(table1)

3. 导入一个完整数据库

 imp system/manager file=bible_db log=dible_db full=y ignore=y

4. 导入一个或一组指定用户所属的全部表、索引和其他对象

 imp system/manager file=seapark log=seapark fromuser=seapark imp
 system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)

5. 将一个用户所属的数据导入另一个用户

 imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy
 imp system/manager file=tank log=tank fromuser=(seapark,amy)
 touser=(seapark1, amy1)

6. 导入一个表

 imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)

7. 从多个文件导入

 imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4)
log=paycheck, filesize=1G full=y

8. 使用参数文件

 imp system/manager parfile=bible_tables.par
bible_tables.par参数文件:
 #Import the sample tables used for the Oracle8i Database Administrator's
Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import
参数文件示例见附录


9. 增量导入

 imp system./manager inctype= RECTORE FULL=Y  FILE=A

 
不少情况下要先将表彻底删除,然后导入。
 

 

四.参数说明

4.1、8i EXP常用选项
 1、FULL,这个用于导出整个数据库,在ROWS=N一起使用时,可以导出整个数据库的结构。例如:
 exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y
 2、BUFFER和FEEDBACK,在导出比较多的数据时,我会考虑设置这两个参数。例如:
 exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
 3、FILL和LOG,这两个参数分别指定备份的DMP名称和LOG名称,包括文件名和目录,例子见上面。
 需要说明的是,EXP可以直接备份到磁带中,即使用FILE=/dev/rmt0(磁带设备名),但是一般我们都不这么做,原因有二:一、这样做的速度会慢很多,二、现在一般都是使用磁带库的,不建议直接对磁带进行操作。至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使用。
 如果你真想使用EXP直接到磁带,你可以参考Metalink文章“EXPORTING TO TAPE ON UNIX SYSTEMS”(文档号:30428.1),该文中有详细解释。
 4、COMPRESS参数将在导出的同时合并碎块,尽量把数据压缩到initial的EXTENT里,默认是N,一般建议使用。DIRECT参数将告诉EXP直接读取数据,而不像传统的EXP那样,使用SELECT来读取表中的数据,这样就减少了SQL语句处理过程。一般也建议使用。不过有些情况下DIRECT参数是无法使用的。
 5、如何使用SYSDBA执行EXP/IMP?
 这是一个很现实的问题,有时候我们需要使用SYSDBA来执行EXP/IMP,如进行传输表空间的EXP/IMP,以及在9i下用SYS用户来执行EXP/IMP时,都需要使用SYSDBA才可。我们可以使用下面方式连入EXP/IMP:
 exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n
 6、QUERY参数后面跟的是where条件,值得注意的是,整个where子句需要使用""括起来,where子句的写法和SELECT中相同,如果是UNIX平台所有"和'都需要使用\u26469屏蔽它们的特殊含义:
 exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop"
 如果是windows平台,则使用下面的格式:
      exp c/c@ncn file=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'"""
4.2、8i IMP常用选项
 1、FROMUSER和TOUSER,使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。
 2、IGNORE、GRANTS和INDEXES,其中IGNORE参数将忽略表的存在,继续导入,这个对于需要调整表的存储参数时很有用,我们可以先根据实际情况用合理的存储参数建好表,然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引,如果想使用新的存储参数重建索引,或者为了加快到入速度,我们可以考虑将INDEXES设为N,而GRANTS一般都是Y。
 另外一个EXP/IMP都有的参数是PARFILE,它是用来定义EXP/IMP的参数文件,也就是说,上面的参数都可以写在一个参数文件中,但我们一般很少使用。
4.4、Oracle9i EXP功能描述
 Oracle9i EXP在原有的基础上新增了部分新的参数,按功能主要分为以下几个部分:
 1、OBJECT_CONSISTENT - 用于设置EXP对象为只读以保持对象的一致性。默认是N。
 2、FLASHBACK_SCN和FLASHBACK_TIME - 用于支持FLASHBACK功能而新增。
 3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用于支持RESUMABLE空间分配而新增。
 4、TTS_FULL_CHECK - 用于在传输表空间时使用依赖性检查。
 5、TEMPLATE - 用于支持iAS。
 6、TABLESPACES - 设置表空间导出模式。个人觉得对于一般用户而言,这个才是新增参数中最实用的一个,可以让用户在原来的FULL、OWNER、TABLES的基础上多了一种选择,使得EXP更加灵活。

五、不同版本的EXP/IMP问题?
 一般来说,从低版本导入到高版本问题不大,麻烦的是将高版本的数据导入到低版本中,在Oracle9i之前,不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决:
 1、在高版本数据库上运行底版本的catexp.sql;
 2、使用低版本的EXP来导出高版本的数据;
 3、使用低版本的IMP将数据库导入到底版本数据库中;
 4、在高版本数据库上重新运行高版本的catexp.sql脚本。
 但在9i中,上面的方法并不能解决问题。如果直接使用底版本EXP/IMP会出现如下错误:
 EXP-00008: ORACLE error %lu encountered
 ORA-00904: invalid column name
 这已经是一个公布的BUG,需要等到Oracle10.0才能解决,BUG号为2261,你可以到METALINK上去查看有关此BUG的详细信息。
 BUG归BUG,我们的工作还是要做,在没有Oracle的支持之前,我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。
 CREATE OR REPLACE view exu81rls 
 (objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy) 
 AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname, 
 decode(bitand(r.stmt_type,1), 0,'', 'SELECT,') 
 || decode(bitand(r.stmt_type,2), 0,'', 'INSERT,') 
 || decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,') 
 || decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'), 
 r.check_opt, r.enable_flag, 
 DECODE(BITAND(r.stmt_type, 16), 0, 0, 1) 
 from user$ u, obj$ o, rls$ r 
 where u.user# = o.owner# 
 and r.obj# = o.obj# 
 and (uid = 0 or 
 uid = o.owner# or 
 exists ( select * from session_roles where role='SELECT_CATALOG_ROLE') 
 ) 
 / 
 grant select on sys.exu81rls to public; 
 / 

六、其他问题

 本文只讨论了Oracle8i和9i中的EXP/IMP的一些情况,对于之前的版本,在8.0.X中,除了QUERY参数不能用外,其它差别不大。针对没有QUERY的情况,我们可以先在数据库中使用查询条件建立临时中间表,然后使用EXP导出这个中间表即可。至于Oracle7因为目前使用的人较少,gototop不打算在此做详细解释了,如果读者朋友有需求,你可以参考Metalink文档:“Overview of Export and Import in Oracle7”(文档号:61949.1)。关于EXP/IMP的详细参数信息你可以通过EXP/IMP HELP=Y来获得。
 另外关于传输表空间的更多信息可以参考下面的Metelink文档,本文不再详述。
 [NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use. 
 [NOTE:100698.1] Perform tablespace point-in-time recovery using Transportable Tablespace. 
 在进行并行EXP/IMP的时候,如果IMP过程建索引的话不建议同时运行5个以上的IMP,如果你想加快速度,可以在IMP的时候不建索引,这样只要内存允许,可以多跑几个,然后是SQL脚本创建需要的索引。 


注意:
 操作者要有足够的权限,权限不够它会提示。
 数据库是否可以连上, 可以用tnsping TestDB  来获得数据库 TestDB 能否连上。

附录一:
 给用户增加导入数据权限的操作
 第一, 启动sql*puls
 第二,以system/manager登陆
 第三,create user 用户名 IDENTIFIED BY 密码 (如果已经创建过用户,这步可以省略)
 第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
   DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
      DBA,CONNECT,RESOURCE,CREATE SESSION  TO 用户名字
 第五, 运行-cmd-进入dmp文件所在的目录,
      imp userid=system/manager full=y file=*.dmp
      或者 imp userid=system/manager full=y file=filename.dmp

  附录二:
 Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.
  先建立import9.par,
  然后,使用时命令如下:imp parfile=/filepath/import9.par
  例 import9.par 内容如下:
        FROMUSER=TGPMS       
        TOUSER=TGPMS2     (注:把表的拥有者由FROMUSER改为TOUSER,FROMUSER和TOUSER的用户可以不同)          
        ROWS=Y
        INDEXES=Y
        GRANTS=Y
        CONSTRAINTS=Y
        BUFFER=409600
        file==/backup/ctgpc_20030623.dmp
        log==/backup/import_20030623.log
转载自:http://www.cnblogs.com/furenjun/archive/2008/05/20/oracleImpExp.html

posted @ 2011-10-10 13:13 alexprefect 阅读(503) | 评论 (0) | 编辑 收藏
 
华为短信机接口开发注意事项
1、关于jar包:
    jar包拿来后,想直接使用,如果是单独新建一个工程,用来测试收发短信,没有问题,但实际应用中,往往会有很多jar包需一起使用,这时,把jar包里面除com外的所有文件及文件夹都删掉,就不会有错误了。
2、关于smsendsql.xml文件的放置位置:
    在网上查的,说是放到工程根目录下,没有人说在写程序时,用debug调试时放在什么地方,最终还好被找到了——“关于配置文件(smsendsql.xml、log4j.properties)的默认存放路径,可以在现场的开发环境中打印以下代码获得:System.out.println(System.getProperty("user.dir")); ”,写下这句,会在控制台显示要放置的路径的。
3、关于数据库连接字符串:
    最终的servierip字符串应为:"jdbc:microsoft:sqlserver://"+"ip:端口号"+";DatabaseName="+sql数据库实例名,通过java反编译器,可以找到jar包里的定义。

    上述三点解决了的话,那编写收发短信的程序就容易了。祝你们开发愉快!
posted @ 2011-08-09 17:07 alexprefect 阅读(1483) | 评论 (0) | 编辑 收藏
 
怎么查看端口占用情况(转载)

怎么查看端口占用情况?

       开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选"查看"-"选择列"

        经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口,很多人都比较头疼,下面就介绍一种非常简单的方法,希望对大家有用

假如我们需要确定谁占用了我们的9050端口

1、Windows平台
在windows命令行窗口下执行:

C:\>netstat -aon|findstr "9050"

TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING 2016


看到了吗,端口被进程号为2016的进程占用,继续执行下面命令:

C:\>tasklist|findstr "2016"

tor.exe 2016 Console 0 16,064 K

很清楚吧,tor占用了你的端口。
http://www.blogjava.net/rabbit/archive/2008/03/12/185559.html(转载)

posted @ 2011-08-02 14:03 alexprefect 阅读(427) | 评论 (0) | 编辑 收藏
 
oracle客户端绿色版,不再为WINDOWS系统版本发愁了!

  一般我们开发的话,都是用的oracle作为数据库的,开发工具我习惯用plsql,toad功能虽好,但我用不习惯。
  plsql需要读取oracle客户端中的配置文件来连接数据库,所以我们不得i不装个oracle客户端,但是客户端不但庞大,而且如果你是用win7或别的系统的话,会遇到各种头疼的问题,好在oracle推出了绿色版来解决这个问题。
   下面我就来讲讲这绿色版怎么用的吧
   第一步:
        首先需要下载一个oracle绿色版,官网就有,我下的是11G版本的。下载需要注册,自己注册个就好了,下载地址是:
            http://www.oracle.com/technetwork/topics/winsoft-085727.html
       下完了之后解压,解压完我的路径是  D:\Program Files\instantclient_11_2


   第二步:我们来配置下环境变量先:
        1) 变量名:ORACLE_HOME
      变量值:D:\Program Files\instantclient_11_2
      2) 变量名:TNS_ADMIN
      变量值:D:\Program Files\instantclient_11_2
      3) 变量名:NLS_LANG
      变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
      4) 修改Path变量,在后面添加 D:\Program Files\instantclient_11_2
      如果不愿意手工增加,可以下载 SetOraEnv.rar 附件, 解压后执行其中的 setOraEnv.bat.
   


     然后进入instantclient_11_2文件夹,新建一个network文件夹,并在network文件夹下新建admin文件夹,在admin文件夹中新建名为tnsnames.ora文件,这个文件是用来配置连接远程数据库的登录信息的(客户端软件都会从这个相对路径下的文件中获取连接数据库的信息),内容如下:
databasename =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = ip address)(PORT = 1521))
      )
      (CONNECT_DATA =
        (SERVICE_NAME = database name)
      )
    )
例如我链接实验室数据库的对应文件内容是:
TCM =
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      )
      (CONNECT_DATA =
        (SERVICE_NAME = test)
      )
    )
然后安装PL/SQL Developer,过程是傻瓜式的。进入PL/SQL后(开始进入时会要求登录数据库,但是现在PL/SQL现在还找不到你的Oracle客户端,所以登录是不会成功的,但是可以进入软件),选择Tools->Preferences,在Oracle Home OCI Library两栏中分别填入Oracle客户端的路径和OCI文件的路径(oci.dll文件直接在instantclient_10_2文件夹下),所以我在这两个选项中填写的内容是“E:\OracleClient\instantclient_11_2”和“E:\OracleClient\instantclient_11_2\oci.dll”。这时再登录就可以登录成功了。如若还不行就重启一下PL/SQL。

绿色版的客户端可能会出现对于中文支持的问题,这主要是因为服务器端指定的字符集和客户端所默认的字符集是不相同的导致的,只要找到服务器端的字符集设置,然后将客户端的字符集设置与服务器端保持一致就好了。修改客户端字符集设置的方法有好几种,可以修改注册表,也可以用环境变量的方法解决。不过我这里介绍的客户端是绿色版的,只是解压到某一个路径而已,所以注册表的方法在这里不是很适用,所以我写了一个启动脚本,在启动PL/SQL之前,先建一个临时环境变量nls_lang,并给变量赋值,再启动软件。(我曾经做过实验,通过建立系统环境变量的方法在这里是行不通的,具体的原因我说不清楚><)

我的脚本plsql.bat的内容如下:

set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
cd "c:\Program Files\PLSQL Developer"
PLSQLDev.exe
其中第二行进入的路径是PL/SQL Developer安装到的路径。

我这里的实际情况是服务器端的字符集设置为SIMPLIFIED CHINESE_CHINA.ZHS16GBK,所以我将这个值赋给nls_lang。通过运行plsql.bat脚本就可以正常的访问服务器数据库了。



//创建用户test,密码test
create user test identified by "test";
//为test用户创建系统特权并且可以用test为别的用户授予权限
Grant execute any procedure to test with admin option 

posted @ 2011-07-20 17:01 alexprefect 阅读(5714) | 评论 (0) | 编辑 收藏
 
时间 字符转换
public Date parseDate(String str){
      DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      Date date = null;
      try {
   date = format1.parse(str);
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return date;
     
     }



     public Map<String,Integer> returnDate(String str){
      Date d_date = null;
   Map<String,Integer> map = new HashMap<String,Integer>();
    d_date = parseDate(str);
    Integer year = new Integer(String.format("%tY", d_date));  
    Integer month = new Integer(String.format("%tm", d_date));  
    Integer day = new Integer(String.format("%td", d_date));  
    Integer hourse = new Integer(String.format("%tH", d_date));
    Integer minute = new Integer(String.format("%tM", d_date));
    Integer second = new Integer(String.format("%tS", d_date));
        map.put("year",year);
        map.put("month",month);
        map.put("day",day);
        map.put("hourse",hourse);
        map.put("minute",minute);
        map.put("second",second);
     
       return map;
     }
posted @ 2011-07-14 14:51 alexprefect 阅读(543) | 评论 (0) | 编辑 收藏
 
StringUtil

StringUtil

2008-07-23 08:46:22|  分类: My Utils |  标签: |字号大中小 订阅

package com.sun.util;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.sql.Timestamp;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串操作通用类
 *
 * @author sunjun
 * @version v5.0
 */
public class StringUtil {

 // 字符串常量枚举
 public static enum REGEX_ENUM {
  EMAIL("^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"), CHINESE_CHARACTER(
    "[\\u4E00-\\u9FA5]+");
  private String value;

  private REGEX_ENUM(String value) {
   this.value = value;
  }

  public String toString() {
   return this.value;
  }
 };

 /**
  * 检查字符串str是否匹配正则表达式regex
  *
  * @param regex
  * @param str
  * @return
  */
 public static boolean matcherRegex(String regex, String str) {
  Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(str);
  return matcher.matches();
 }

 /**
  * 是否为汉字
  *
  * @param ch
  * @return
  */
 public static boolean isChineseCharacter(char ch) {
  return matcherRegex(REGEX_ENUM.CHINESE_CHARACTER.toString(), String
    .valueOf(ch));
 }

 /**
  * 按字节截取字符串
  *
  * @param str
  *            要截取的字符串
  * @param byteLength
  *            长度
  * @return 结果字符串
  */
 public static String subString(String str, int byteLength) {
  if (isBlank(str))
   return "";
  if (str.getBytes().length <= byteLength)
   return str;
  if (str.length() >= byteLength)
   str = str.substring(0, byteLength);
  int readLen = 0;
  String c = null;
  StringBuffer sb = new StringBuffer("");
  for (int i = 0; i < str.length(); i++) {
   c = String.valueOf(str.charAt(i));
   readLen += c.getBytes().length;
   if (readLen > byteLength)
    return sb.toString();
   sb.append(c);
  }
  return sb.toString();
 }

 /**
  * 检查字符串长度是否在指定长度范围内(minLength<=str.length<=maxLength)
  *
  * @param str
  *            要检查的字符串
  * @param minLength
  *            最小长度
  * @param maxLength
  *            最大长度
  * @return boolean 字符串长度在指定长度范围内返回true,否则返回false
  */
 public static boolean checkLength(String str, int minLength, int maxLength) {
  if (isBlank(str))
   return false;
  int len = str.length();
  if (minLength == 0)
   return len <= maxLength;
  else if (maxLength == 0)
   return len >= minLength;
  else
   return (len >= minLength && len <= maxLength);
 }

 /**
  * 按UTF-8编码来解码字符串
  *
  * @param str
  *            要解码的字符串
  * @return String 解码str后字符串
  */
 public static String decodeString(String str) {
  return decodeString(str, "UTF-8");
 }

 /**
  * 按指定编码来解码字符串
  *
  * @param str
  * @param encoding
  * @return
  */
 public static String decodeString(String str, String encoding) {
  if (isBlank(str))
   return "";
  try {
   return URLDecoder.decode(str.trim(), encoding);
  } catch (UnsupportedEncodingException e) {
  }
  return "";
 }

 /**
  * 按指定编码来解码字符串
  *
  * @param str
  * @param encoding
  * @return
  */
 public static String decodeURI(String str) {
  if (isBlank(str))
   return "";
  try {
   return new String(str.getBytes("ISO8859-1"), "UTF-8");
  } catch (UnsupportedEncodingException e) {
  }
  return "";
 }

 /**
  * 按UTF-8编码来编码字符串
  *
  * @param str
  *            要编码的字符串
  * @return String 编码str后字符串
  */
 public static String encodeString(String str) {
  return encodeString(str, "UTF-8");
 }

 /**
  * 按UTF-8编码来编码字符串
  *
  * @param str
  *            要编码的字符串
  * @return String 编码str后字符串
  */
 public static String encodeString(String str, String encoding) {
  if (isBlank(str))
   return "";
  try {
   return URLEncoder.encode(str.trim(), encoding);
  } catch (UnsupportedEncodingException e) {
  }
  return "";
 }

 /**
  * 根据时间得到唯一字符串
  *
  * @return
  */
 public static String getOnlyString() {
  return String.valueOf(System.currentTimeMillis());
 }

 /**
  * 检查对象obj是否为空
  *
  * @param str
  *            要检查的字符串
  * @return boolean str为空返回true,否则返回false
  */
 public static boolean isBlank(Object obj) {
  if (obj == null)
   return true;
  if (obj instanceof String && obj.toString().trim().length() == 0)
   return true;
  return false;
 }

 /**
  * 检查字符串str是否为整型
  *
  * @param str
  *            要检查的字符串
  * @return boolean str为整型返回true,否则返回false
  */
 public static boolean isInteger(String str) {
  if (isBlank(str))
   return false;
  try {
   Integer.parseInt(str.trim());
   return true;
  } catch (Exception e) {
  }
  return false;
 }

 /**
  * 检查字符串str是否为长整型
  *
  * @param str
  *            要检查的字符串
  * @return boolean str为长整型返回true,否则返回false
  */
 public static boolean isLong(String str) {
  if (isBlank(str))
   return false;
  try {
   Long.parseLong(str.trim());
   return true;
  } catch (Exception e) {
  }
  return false;
 }

 /**
  * 检查字符串str是否为布尔型
  *
  * @param str
  *            要检查的字符串
  * @return boolean str为布尔型返回true,否则返回false
  */
 public static boolean isBoolean(String str) {
  if (isBlank(str))
   return false;
  try {
   Boolean.parseBoolean(str.trim());
   return true;
  } catch (Exception e) {
  }
  return false;
 }

 /**
  * 检查字符串str是否为double类型
  *
  * @param str
  * @return
  */
 public static boolean isDouble(String str) {
  if (isBlank(str))
   return false;
  try {
   Double.parseDouble(str.trim());
   return true;
  } catch (Exception e) {
  }
  return false;
 }

 /**
  * 检查字符串str是否为时间型
  *
  * @param str
  *            要检查的字符串
  * @return boolean str为时间型返回true,否则返回false
  */
 public static boolean isDate(String str) {
  if (isBlank(str))
   return false;
  try {
   java.sql.Date sqlDate = java.sql.Date.valueOf(str.trim());
   return true;
  } catch (Exception e) {
  }
  return false;
 }

 /**
  * 检查对象数组strings的每个元素是否为空
  *
  * @param objs
  *            要检查的对象数组
  * @return boolean objs数组元素为空返回true,否则返回false
  */
 public static boolean isBlanks(Object... objs) {
  for (Object obj : objs) {
   if (StringUtil.isBlank(obj))
    return true;
  }
  return false;
 }

 /**
  * 检查字符串数组str是否为长整型数组
  *
  * @param str
  *            要检查的字符串
  * @return boolean str为长整型数组返回true,否则返回false
  */
 public static boolean isLongs(String str[]) {
  for (int i = 0; i < str.length; i++) {
   if (!isLong(str[i]))
    return false;
  }
  return true;
 }

 /**
  * 检查字符串数组str是否为整型数组
  *
  * @param str
  *            要检查的字符串
  * @return boolean str为整型数组返回true,否则返回false
  */
 public static boolean isIntegers(String str[]) {
  for (int i = 0; i < str.length; i++)
   if (!isInteger(str[i]))
    return false;
  return true;
 }

 /**
  * 检查字符串数组str是否为布尔型数组
  *
  * @param str
  *            要检查的字符串
  * @return boolean str为布尔型数组返回true,否则返回false
  */
 public static boolean isBooleans(String str[]) {
  for (int i = 0; i < str.length; i++)
   if (!isBoolean(str[i]))
    return false;
  return true;
 }

 /**
  * 检查字符串str是否为时间
  *
  * @param str
  *            要检查的字符串
  * @return str为时间型返回true,否则返回false
  */
 public static boolean isTimestamp(String str) {
  if (isBlank(str))
   return false;
  try {
   java.sql.Date d = java.sql.Date.valueOf(str.trim());
   return true;
  } catch (Exception ex) {
  }
  return false;
 }

 /**
  * 检查字符串str是否为(yyyy-MM-dd HH:mm:ss)模式的时间
  *
  * @param str
  *            要检查的字符串
  * @return str为时间型返回true,否则返回false
  */
 public static boolean isFullTimestamp(String str) {
  if (isBlank(str))
   return false;
  try {
   SimpleDateFormat format = new SimpleDateFormat(
     "yyyy-MM-dd HH:mm:ss");
   Date date = format.parse(str.trim());
   return date != null;
  } catch (Exception e) {
  }
  return false;
 }

 /**
  * 将字符数组转换为长整型数组
  *
  * @param str
  *            字符数组
  * @return Long[] 长整型数组
  */
 public static Long[] stringsToLongs(String str[]) {
  Long lon[] = new Long[str.length];
  for (int i = 0; i < lon.length; i++)
   lon[i] = new Long(str[i]);
  return lon;
 }

 /**
  * 将字符数组转换为整型数组
  *
  * @param str
  *            字符数组
  * @return Integer[] 整型数组
  */
 public static Integer[] stringsToIntegers(String str[]) {
  Integer array[] = new Integer[str.length];
  for (int i = 0; i < array.length; i++)
   array[i] = new Integer(str[i]);
  return array;
 }

 /**
  * 将字符数组转换为布尔型数组
  *
  * @param str
  *            字符数组
  * @return Boolean[] 布尔型数组
  */
 public static Boolean[] stringsToBooleans(String str[]) {
  Boolean array[] = new Boolean[str.length];
  for (int i = 0; i < array.length; i++)
   array[i] = new Boolean(str[i]);
  return array;
 }

 /**
  * 将字符数组转换为浮点型数组
  *
  * @param str
  *            字符数组
  * @return double[] 浮点型数组
  */
 public static double[] stringsToDoubles(String str[]) {
  double array[] = new double[str.length];
  for (int i = 0; i < array.length; i++)
   array[i] = Double.parseDouble(str[i]);
  return array;
 }

 /**
  * 根据指定时间和格式字符串得到时间格式字符串
  *
  * @param d
  *            时间
  * @param pattern
  *            格式字符串
  * @return String 时间格式字符串
  */
 public static String formatDate(Date d, String pattern) {
  if (isBlank(d))
   return "";
  SimpleDateFormat format = new SimpleDateFormat(
    isBlank(pattern) ? "yyyy-MM-dd HH-mm-ss" : pattern);
  return format.format(d);
 }

 /**
  * 根据时间字符串得到时间(yyyy-MM-dd)
  *
  * @param str
  *            时间字符串
  * @return Timestamp 时间
  */
 public static Timestamp getTimestamp(String str) {
  try {
   Date d = java.sql.Date.valueOf(str.trim());
   return new Timestamp(d.getTime());
  } catch (Exception ex) {
  }
  return null;
 }

 /**
  * 根据时间字符串得到(yyyy-MM-dd HH-mm-ss)格式时间
  *
  * @param str
  *            时间字符串
  * @return Timestamp 时间
  */
 public static Timestamp getFullTimestamp(String str) {
  try {
   SimpleDateFormat format = new SimpleDateFormat(
     "yyyy-MM-dd HH:mm:ss");
   Date date = format.parse(str.trim());
   return new Timestamp(date.getTime());
  } catch (Exception ex) {
  }
  return null;
 }

 /**
  * 得到数字格式化后的字符串
  *
  * @param number
  *            Number类型
  * @param minFractionDigits
  *            小数最小位数
  * @param maxFractionDigits
  *            小数最大位数
  * @return String 格式化后的字符串
  */
 public static String formatNumber(Number number, int minFractionDigits,
   int maxFractionDigits) {
  NumberFormat format = NumberFormat.getInstance();
  format.setMinimumFractionDigits(minFractionDigits);
  format.setMaximumFractionDigits(maxFractionDigits);
  return format.format(number);
 }

 /**
  * 字符串高亮<br>
  * 解决了高亮前缀或高亮后缀在要高亮显示的字符串数组在存在时的问题,根据本算法可解决JS高亮显示时相同的问题
  *
  * @param text
  *            内容
  * @param replaceStrs
  *            要高亮显示的字符串数组
  * @param beginStr
  *            高亮前缀,如<font color=red>
  * @param endStr
  *            高亮后缀,如</font>
  * @return
  */
 public static String heightLight(String text, String[] replaceStrs,
   String beginStr, String endStr) {
  if (text.length() == 0)
   return text;
  StringBuilder str = new StringBuilder();
  for (int i = 0; i < replaceStrs.length; i++) {
   String replaceStr = replaceStrs[i];
   int index = text.indexOf(replaceStr);
   if (index >= 0) {
    String afterStr = null;
    if (index > 0) {
     String beforeStr = text.substring(0, index);
     afterStr = text.substring(index + replaceStr.length());
     str.append(heightLight(beforeStr, replaceStrs, beginStr,
       endStr));
    } else
     afterStr = text.substring(replaceStr.length());
    str.append(beginStr).append(replaceStr).append(endStr);
    str
      .append(heightLight(afterStr, replaceStrs, beginStr,
        endStr));
    break;
   }
  }
  if (str.length() == 0)
   return text;
  return str.toString();
 }

 /**
  * 替换指定的字符串数组为一个字符串<br>
  * 速度比String.replaceAll快3倍左右,比apache-common StringUtils.replace快2倍左右
  *
  * @param text
  * @param replaceStrs
  * @param newStr
  * @return
  */
 public static String replaceAll(String text, String[] replaceStrs,
   String newStr) {
  if (text.length() == 0)
   return text;
  StringBuilder str = new StringBuilder();
  for (int i = 0; i < replaceStrs.length; i++) {
   String replaceStr = replaceStrs[i];
   int index = text.indexOf(replaceStr);
   if (index >= 0) {
    String afterStr = null;
    if (index > 0) {
     String beforeStr = text.substring(0, index);
     afterStr = text.substring(index + replaceStr.length());
     str.append(replaceAll(beforeStr, replaceStrs, newStr));
    } else
     afterStr = text.substring(replaceStr.length());
    str.append(newStr);
    str.append(replaceAll(afterStr, replaceStrs, newStr));
    break;
   }
  }
  if (str.length() == 0)
   return text;
  return str.toString();
 }

 /**
  * 替换指定的字符串为一个字符串<br>
  * 速度比String.replaceAll快3倍左右,比apache-common StringUtils.replace快2倍左右
  *
  * @param text
  * @param replaceStr
  * @param newStr
  * @return
  */
 public static String replaceAll(String text, String replaceStr,
   String newStr) {
  if (text.length() == 0)
   return text;
  StringBuilder str = new StringBuilder();
  int index = text.indexOf(replaceStr);
  if (index >= 0) {
   String afterStr = null;
   if (index > 0) {
    String beforeStr = text.substring(0, index);
    afterStr = text.substring(index + replaceStr.length());
    str.append(replaceAll(beforeStr, replaceStr, newStr));
   } else
    afterStr = text.substring(replaceStr.length());
   str.append(newStr);
   str.append(replaceAll(afterStr, replaceStr, newStr));
  }
  if (str.length() == 0)
   return text;
  return str.toString();
 }

 /**
  * 替换指定的字符串数组为一个字符串数组<br>
  * 速度比String.replaceAll快3倍左右,比apache-common StringUtils.replace快2倍左右
  *
  * @param text
  * @param replaceStrs
  * @param newStrs
  * @return
  */
 public static String replaceAllArray(String text, String[] replaceStrs,
   String[] newStrs) {
  if (text.length() == 0)
   return text;
  StringBuilder str = new StringBuilder();
  for (int i = 0; i < replaceStrs.length; i++) {
   String replaceStr = replaceStrs[i];
   int index = text.indexOf(replaceStr);
   if (index >= 0) {
    String afterStr = null;
    if (index > 0) {
     String beforeStr = text.substring(0, index);
     afterStr = text.substring(index + replaceStr.length());
     str
       .append(replaceAllArray(beforeStr, replaceStrs,
         newStrs));
    } else
     afterStr = text.substring(replaceStr.length());
    str.append(newStrs[i]);
    str.append(replaceAllArray(afterStr, replaceStrs, newStrs));
    break;
   }
  }
  if (str.length() == 0)
   return text;
  return str.toString();
 }

 /**
  * 解码HTML(将&gt;,&lt;,&quot;,&amp;转换成>,<,",& )
  *
  * @param html
  * @return
  */
 public static String decodeHTML(String html) {
  if (isBlank(html))
   return "";
  String[] replaceStr = { "&amp;", "&lt;", "&gt;", "&quot;" };
  String[] newStr = { "&", "<", ">", "\"" };
  return replaceAllArray(html, replaceStr, newStr);
 }

 /**
  * 编码HTML(将>,<,",&
  * 转换成&gt;,&lt;,&quot;,&amp;)(高效率,来自FreeMarker模板源码,比replaceAll速度快很多)
  *
  * @param html
  * @return
  */
 public static String encodeHTML(String html) {
  if (isBlank(html))
   return "";
  int ln = html.length();
  char c;
  StringBuffer b;
  for (int i = 0; i < ln; i++) {
   c = html.charAt(i);
   if (c == '<' || c == '>' || c == '&' || c == '"') {
    b = new StringBuffer(html.substring(0, i));
    switch (c) {
    case '<':
     b.append("&lt;");
     break;
    case '>':
     b.append("&gt;");
     break;
    case '&':
     b.append("&amp;");
     break;
    case '"':
     b.append("&quot;");
     break;
    }
    i++;
    int next = i;
    while (i < ln) {
     c = html.charAt(i);
     if (c == '<' || c == '>' || c == '&' || c == '"') {
      b.append(html.substring(next, i));
      switch (c) {
      case '<':
       b.append("&lt;");
       break;
      case '>':
       b.append("&gt;");
       break;
      case '&':
       b.append("&amp;");
       break;
      case '"':
       b.append("&quot;");
       break;
      }
      next = i + 1;
     }
     i++;
    }
    if (next < ln)
     b.append(html.substring(next));
    html = b.toString();
    break;
   }
  }
  return html;
 }

 /**
  * MD5加密
  *
  * @param plainText
  *            要加密的字符串
  * @return 加密后的字符串
  */
 public static String Md5(String plainText) {
  StringBuffer buf = new StringBuffer("");
  try {
   MessageDigest md = MessageDigest.getInstance("MD5");
   md.update(plainText.getBytes());
   byte b[] = md.digest();
   int i = 0;
   for (int offset = 0; offset < b.length; offset++) {
    i = b[offset];
    if (i < 0)
     i += 256;
    if (i < 16)
     buf.append("0");
    buf.append(Integer.toHexString(i));
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return buf.toString();
 }

 /**
  * MD5加密(32)
  *
  * @param plainText
  *            要加密的字符串
  * @return
  */
 public final static String MD5(String plainText) {
  char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    'a', 'b', 'c', 'd', 'e', 'f' };
  try {
   byte[] strTemp = plainText.getBytes();
   MessageDigest mdTemp = MessageDigest.getInstance("MD5");
   mdTemp.update(strTemp);
   byte[] md = mdTemp.digest();
   int j = md.length;
   char str[] = new char[j * 2];
   int k = 0;
   for (int i = 0; i < j; i++) {
    byte byte0 = md[i];
    str[k++] = hexDigits[byte0 >>> 4 & 0xf];
    str[k++] = hexDigits[byte0 & 0xf];
   }
   return new String(str);
  } catch (Exception e) {
  }
  return "";
 }

}

posted @ 2011-07-13 13:33 alexprefect 阅读(862) | 评论 (0) | 编辑 收藏