2004年06月18日
标题   Struts1.1的页面校验     leon_sandy [原作]
关键字   Struts Jakarta Commons Validate
出处  

Struts作为一个不停发展的开源项目,在页面校验这一块采用了Jakarta的Commons项目的Validate,结合Struts的MVC体系,
用起来确实不错。建议校验这部分在完成jsp后加入。
原理:Struts的页面校验分两种方法,一种是前台生成Javascript,一种是后台class。
      而出错信息对应的也有两种显示方法,一种是弹出消息框,一种是在原页面显示。
      我个人比较喜欢弹出消息框这种,因为可以将焦点置到出错的field中。
      所以我侧重介绍如何实现这种。
      请按下列步骤一步一步进行,进行的时候思考它的做法。
     
1     将Struts所需lib加入到项目lib路径或服务器的lib路径
      Struts1.1需要如下lib:struts-legacy.jar struts.jar jakarta-oro.jar commons-validator.jar
      commons-logging.jar commons-lang.jar commons-fileupload.jar commons-digester.jar commons-collections.jar
      commons-beanutils.jar(可以看到Struts1.1用了很多Commons项目的东东)
2     将下载的Struts1.1的包中的webapps\struts-validator.war 中的validation.xml和validator-rules.xml
      拷到项目的WEB-INF路径
      仔细研究一下这两个文件,可以看到validator-rules.xml是提供一些常用的validation规则。
      目前提供了required,requiredif,minlength,maxlength,mask,byte,short,integer,long,float,
      double,date,range,intRange,floatRange,creditCard,email,
      我看了一下,只有mask不知道具体是干啥的,其他望文生义。(至于如何DIY一条自己的rule,俺还不会)
      重头戏来了,修改validation.xml。可以看一下validation.xml结构
validation.xml:     

          “-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN”
          “http://jakarta.apache.org/commons/dtds/validator_1_0.dtd“>

  
     
        phone
        ^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$
     

     
        zip
        ^\d{5}\d*$
     

  

  
     
        zip
        ^\d{5}(-\d{4})?$
     

     

                      depends=”required,mask,minlength”>
              
              
                    
                       mask
                       ^\w+$
                    

                    
                       minlength
                       5
                    

        

        ……….
      
      相信大家仔细一看就明白了,首先,可以定义一些用正则表达式表示的规则,这些规则还分全局和局部。
      这样就可以DIY一些可以用正则表达式表示的规则了,例如下面就具体用到了自定义的规则:phone。
      …
  
     
        phone
        ^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$
     

  

   …  
                   depends=”mask”>
              
                    
                       mask
                       ${phone}
                    

     

   …
      这下也明白mask的作用了,原来它是专门用于自定义规则!
      然后就可以添加需要加validation的field了,格式如下:
     
     
                      depends=”required,mask,minlength”>
              
              
                    
                       mask
                       ^\w+$
                    

                    
                       minlength
                       5
                    

        

     

           
3     将需要加validation的formbean全部改成 extends ValidatorForm
4     在struts-config.xml文件中加入一段代码 ,位置如下:
……
   
     
   

 
 
     
 

5     在ApplicationResources.properties文件中加入如下内容:

# Errors
errors.header=Validation Error
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be an byte.
errors.short={0} must be an short.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.float={0} must be an float.
errors.double={0} must be an double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
      
      且注意在修改validation.xml时,如
      
      则ApplicationResources.properties中要有对应的 registrationForm.firstname.displayname 值。
      这就可以实现出错信息本地化。

6     修改要加validation的jsp文件。两处:
        1 在页面的form标签中加入onsubmit事件
       
        2 在之前加入一段代码,内容如下:
       
        这段代码会自动生成上面的validateRegistrationForm(this)函数
      
     一步一步下来,终于明白它的思路了,就是根据配置自动生成javascript代码来校验。至于它如何实现的,
     以后再研究吧,要吃饭了。

标题   直接让客户端浏览器下载已知类型的文件     net_lover [原作]
关键字   download,mimetype
出处  

直接让客户端浏览器下载已知类型的文件

 Web开发人员都有过这样的疑问,如何让一个文件,尤其是一个已知类型的文件,发送到客户端,直接提示让浏览者下载,而不是用与它相关联的程序打开。以前我们最常用的办法就是把这样的文件加到链接上,这样可以让浏览者通过点击鼠标右键的目标另存为来下载所链接的文件。但是,这样有两个不足的地方:
 一是:如果浏览器能够识别已下载文件的扩展名,则浏览器就会激活该扩展名所关联的程序来打开所下载的文件。比如:在Windows平台上,如果用户点击的链接链接的是一个“.doc”文件的话,那么,浏览器就会启动Microsoft Word应用程序来打开它。
 二是:如果采用链接的办法的话,任何能看到该链接的人都可以下载该文件,你虽然也可以对所下载的文件进行权限设置,但那样做也不是很方便的。有时候我们需要更为灵活和富有弹性的方式,下面的程序能够很方便地克服以上两方面的不足。
 这种办法是可靠的,但你必须记住:没有授权的用户不能够通过在浏览器地址栏里输入文件的URL来取得该文件的下载权。所以,要下载的文件应该放到虚拟目录之外的一个目录里,比如:如果你的虚拟目录是C:\Mengxianhui\Tomcat4\Website\MyApp的话,那么,存放在该目录和该目录下的任何子目录下所有文件对因特网上的任何用户都是可见的。要直接下载一个文件,我们需要做两件事,第一件事是:设定响应的内容类为“application/octet-stream”,大小写无关。第二件事是:设置HTTP的响应头名字为:Content-Disposition,设定值为:attachment; filename = theFileName。这里的theFileName就是出现在文件下载对话框里的默认文件名,通常和所下载的文件名字相同,但也可以不同。下面,我们就平常最常用的JSP和ASP页面来举一个实际应用的例子。
 
  TestFileDownload.JSP页面的例子:
 
  <%
  // 得到文件名字和路径
  String filename = “MengxianhuiDocTest.doc”;
  String filepath = “D:\\”;
  
  // 设置响应头和下载保存的文件名
  response.setContentType(“APPLICATION/OCTET-STREAM”);
  response.setHeader(“Content-Disposition”,
  ”attachment; filename=\”" + filename + “\”");
 
  // 打开指定文件的流信息
  java.io.FileInputStream fileInputStream =
   new java.io.FileInputStream(filepath + filename);
   
  // 写出流信息
  int i;
  while ((i=fileInputStream.read()) != -1) {
   out.write(i);
  }
  fileInputStream.close();
  out.close();
 %>
 
 值得注意的是:在你要下载的文件内容里,除了文件的内容之外,不应该再附加有其它任何的字符,包括空格和回车换行符。我们有时在编写代码的时候,为了使代码清晰可读,往往会添加一些空格、制表符或者回车换行符,这样虽然看起来比较清晰,但有时可能会得不到正确的结果。比如:
 <%@ page import=”java.io.*”
 %>  <jsp:useBean id=”MyBeanFromMengxianhui” scope=”page”
 class=”com.Mengxianhui.DownloadBean” />
 应该写成这样:
 <%@ page import=”java.io.*”
 %><jsp:useBean id=”MyBeanFromMengxianhui” scope=”page”
 class=”com.Mengxianhui.DownloadBean” />
 
 TestFileDownload.ASP页面的例子:
 
 在ASP里,没有提供从文件读取文件流信息的方法,因此,为了得到文件的流信息,我们必须借助其他的工具,最简单的就是编写一个VB或C的DLL组件,让组件返回文件的流信息。下面是一个用VB编写的DLL的例子,工程名字为MengXHFileDownLoad,类模块的名字为BinReadFromFile,类方法readBinFromFile如下:
  
 Function readBinFromFile(ByVal bfilename As String) As Variant
     Dim fl As Long
     Dim FileNum As Long
     Dim binbyte() As Byte
     Dim binfilestr As String
    
     On Error GoTo errHandler    
     FileNum = FreeFile    
     Open bfilename For Binary As #FileNum    
     fl = FileLen(bfilename)
     ReDim binbyte(fl)    
     Get #FileNum, , binbyte    
     Close #FileNum    
     readBinFromFile = binbyte
     Exit Function
         
 errHandler:
     Exit Function
 End Function
 
 把上面的代码编译成MengXHFileDownLoad.DLL,然后注册即可使用。下面以直接下载一个When A Man Loves A Woman.mp3的MP3文件为例子,我们要编写的ASP脚本代码如下:
 
  <%@ Language=VBScript %>
  <%
   Response.buffer = TRUE
   Response.ContentType = “APPLICATION/OCTET-STREAM”
   Response.AddHeader “Content-Disposition”,”attachment;filename=When A Man Loves A Woman.mp3″
   
   Dim varStream, oMyObject
    
   Set oMyObject = Server.CreateObject(“MengXHFileDownLoad.BinReadFromFile”)
   varStream = oMyObject.readBinFromFile(“E:\MengXianhui\Mp3\When A Man Loves A Woman.mp3″)
   Response.BinaryWrite(varStream) 
   Set oMyObject = Nothing 
   
   Response.End
  %>
 
 当我们运行上面的TestFileDownload.ASP文件时,浏览器会弹出一个文件下载的对话框,提示我们下载,而不是用默认的MP3播放器打开。
 这种方法也可以把我们的ASP页面生成的HTML源代码保存成一个文件,下面的代码会提示你把ASP执行的结果保存成Test.htm文件。具体的方法是:
  <%
   Response.ContentType = “APPLICATION/OCTET-STREAM”
   Response.AddHeader “Content-Disposition”,”attachment;filename=Test.htm”
   Response.write “<div style=’background-color:navy;color:#FFFFFF’>测试</div>”
   Response.write “<a href=’http://lucky.myrice.com’>”
   Response.write “<img src=’http://lucky.myrice.com/back.jpg’>【孟宪会之精彩世界】</a>”
   Response.End
  %>
 
 当我们的文件数目很少时,也可以直接在服务器端进行设置,让这些文件直接下载。具体做法是:在Internet服务管理器里,选“属性”项,然后选“HTTP Headers”标签页进行设置即可!!

如何用 servlet 打开非 HTML 格式的文档(转)  >> 我要招聘人才,请点击此处

zergman 于 2001-6-15 13:26:01 加贴在 Java程序设计 ←返回版面按此给该网友发送邮件 按此察看该网友的资料 按此把文章加入书签 按此给作者留言 按此给作者发送即时消息 按此查看作者个人专辑 按此打印本帖 按此打包转发本帖

如何用 servlet 打开非 HTML 格式的文档
一种向 Web 客户端发送非 HTML 格式文档的简单方法

By Marla Bonar(marla.bonar@javaworld.com)

摘要
Java Servlet 编程可以很方便地将 HTML 文件发送到客户端 Web 浏览器。然而许多站点还允许访问非 HTML 格式的文档,包括 Adobe PDF、Microsoft Word 和 Micorsoft Excel 等。事实上这些非 HTML 格式只要能用 MIME 类型表示,就可以利用 servlet 来发送。本文将以 PDF 和 Microsoft Word 文件为例,向你介绍如何使用 servlet 传送非 HTML 格式文件,以及与防火墙交互的方法。[/i][/I]

你只要将文件写到 servlet 的输出流中,就可以利用 servlet 在浏览器中打开一个文件。尽管这看起来非常简单,在打开非 HTML 格式文档(比如二进制数据或多媒体文件)的时候,仍要注意一些要点。
首先从获得 servlet 的输出流开始:
    ServletOutputStream out = res.getOutputStream();

互联网上使用 MIME (multipurpos Internet mail extension 多目的互联网邮件扩展协议)来传送混合格式、多媒体和二进制数据文件。如果要在 servlet 的 response 对象中打开某个文档,就必须设置该文档的 MIME 类型。下面这个例子中我们将打开 PDF 文档。
MIME 类型
Web 浏览器使用 MIME 类型来识别非 HTML 文档,并决定如何显示该文档内的数据。将插件 (plug-in) 与 MIME 类型结合使用,则当 Web 浏览器下载 MIME 类型指示的文档时,就能够启动相应插件处理此文档。某些 MIME 类型还可以与外部程序结合使用,浏览器下载文档后会启动相应的外部程序。
MIME 类型非常有用。它们允许 Web 浏览器处理不同格式的文档,却不需要事先嵌入相关知识。Java Servlets 可以使用 MIME 类型来向浏览器传送非 HTML 文件,比如 Adobe PDF 和 Micorsoft Word。使用正确的 MIME 类型能够保证这些非 HTML 文件被正确的插件或外部程序显示。本文末的资料部分提供了一些网址,指向一些已定义 MIME 类型列表和关于 MIME 类型的文章。
PDF 文件的 MIME 类型是 “application/pdf”。要用 servlet 来打开一个 PDF 文档,需要将 response 对象中 header 的 content 类型设置成 “application/pdf”:
    // MIME type for pdf doc
    res.setContentType( “application/pdf” );

若要打开一个 Microsoft Word 文档,你就要将 response 对象的 content 类型设置成 “application/msword”:
    // MIME type for MSWord doc
    res.setContentType( “application/msword” );

如果是一个 Excel 文档,则使用 MIME 类型 “application/vnd.ms-excel”。其中 vnd 表示该应用程序的制造者,必须将它包含在 MIME 类型里才能够打开该类型文档。
有时候浏览器不能识别文档的 MIME 类型。通常这是由于没有安装这些文档需要的插件而导致的。这种情况下,浏览器会弹出一个对话框,询问用户是否需要打开该文件或是将它保存到本地磁盘上。
Content disposition
一种叫做 content-disposition 的 HTTP response header 允许 servlet 指定文档表示的信息。使用这种 header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。如果没有指定,则对话框中就会出现 servlet 的名字。更多关于 content-disposition header 的信息,可以参阅资料
在 servlet 中,你需要将 header 设置成下面这样:
    res.setHeader(“Content-disposition”,
                  ”attachment; filename=” +
                  ”Example.pdf” );
    // attachment – since we don’t want to open
    // it in the browser, but
    // with Adobe Acrobat, and set the
    // default file name to use.

如果你要打开的是 Microsoft Word 文件,你可以设成:
    res.setHeader(“Content-disposition”,
                  ”attachment; filename” +
                  ”Example.doc” );

封装非 HTML 文档
完成上述工作后,剩下的就非常简单了。你需要根据待传送文件的名字,创建一个 java.net.URL 对象。交给 URL 构造器的字符串必须是指向该文件的一个有效 URL 地址。在这个例子中,我要打开 Adobe employment 格式的文档:
    String fileURL =
“http://www.adobe.com/aboutadobe/careeropp/pdfs/adobeapp.pdf;”

你的 URL 字符串也可以类似于 http://www.gr.com/pub/somefile.doc 或 http://www.gr.com/pub/somefile.xls。但必须确保待传送文件类型与先前在 HTTP response 对象中设置的 MIME 类型一致。
    URL url = new URL ( fileURL );

防火墙
如果需要通过防火墙,最后一件要考虑的事情就是你的 URL 链接。首先应当搜集所用代理服务器的相关信息,例如主机名称和端口号等。更多关于如何通过防火墙建立链接的信息,可以参看下面的资料部分。
如果使用的是 Java 2,你应该从 URL 对象类中创建一个 URLConnection 对象,并设置下列系统属性:
    URLConnection conn = url.openConnection();

    // Use the username and password you use to
    // connect to the outside world
    // if your proxy server requires authentication.
    String authentication = “Basic ” + new
sun.misc.BASE64Encoder().encode(“username:password”.getBytes());

    System.getProperties().put(“proxySet”, “true”);

    System.getProperties().put(“proxyHost”, PROXY_HOST); // your proxy host
    System.getProperties().put(“proxyPort”, PROXY_PORT); // your proxy port
    conn.setRequestProperty(“Proxy-Authorization”, authentication);

如果你使用的是 JDK 1.1,则不能设置这些系统属性。这种情况下,你可以根据所用代理服务器的信息创建 java.net.URL 对象:
    url = new URL(“http”, PROXY_HOST,
                  Integer.parseInt(PROXY_PORT),
                  fileURL );
    // assumes authentication is not required

深入工作
开始阅读你传送的文档之前,首先要从 URLConnection (或 URL) 对象中获得输入流 InputStream。在这个例子中,用 BufferedInputStream 将 InputStream 封装起来。
如果你采用 URLConnection,可以尝试如下代码:
    BufferedInputStream bis = new
        BufferedInputStream(conn.getInputStream());

如果你使用 URL,则可用下列代码:
    BufferedInputStream bis = new
        BufferedInputStream(url.openStream());

一旦你完成上述操作,就只要简单地将 InputStream 中的字节,写入到 servlet 的输出流 OutputStream 中:
    BufferedOutputStream bos = new
        BufferedOutputStream(out);

    byte[] buff = new byte[2048];
    int bytesRead;

    // Simple read/write loop.
    while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
        bos.write(buff, 0, bytesRead);
    }

在最后的代码块中,关闭这些流。
这个例子是利用 doPost 来实现的(doPost 是 HttpServlet 子类的一个方法):
public void doPost(HttpServletRequest req,
                   HttpServletResponse res)
   throws ServletException, IOException
{
    ServletOutputStream out =
        res.getOutputStream ();

//—————————————————————
// Set the output data’s mime type
//—————————————————————

    res.setContentType( “application/pdf” ); // MIME type for pdf doc

//—————————————————————
// create an input stream from fileURL
//—————————————————————

    String fileURL =
        ”http://www.adobe.com/aboutadobe/careeropp/pdfs/adobeapp.pdf”;

//————————————————————
// Content-disposition header – don’t open in browser and
// set the “Save As…” filename.
// *There is reportedly a bug in IE4.0 which ignores this…
//————————————————————
    res.setHeader(“Content-disposition”,
                  ”attachment; filename=” +=
                  ”Example.pdf” );

//—————————————————————–
// PROXY_HOST and PROXY_PORT should be your proxy host and port
// that will let you go through the firewall without authentication.
// Otherwise set the system properties and use URLConnection.getInputStream().
//—————————————————————–
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;

    try {
        URL url = new URL( “http”, PROXY_HOST,
                           Integer.parseInt(PROXY_PORT), fileURL );

        // Use Buffered Stream for reading/writing.
        bis = new BufferedInputStream(url.openStream());
        bos = new BufferedOutputStream(out);

        byte[] buff = new byte[2048];
        int bytesRead;

        // Simple read/write loop.
        while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
            bos.write(buff, 0, bytesRead);
        }

    } catch(final MalformedURLException e) {
        System.out.println ( “MalformedURLException.” );
        throw e;
    } catch(final IOException e) {
        System.out.println ( “IOException.” );
        throw e;
    } finally {
        if (bis != null)
            bis.close();
        if (bos != null)
            bos.close();
    }
}

结论
正如你所读到的,用 servlet 来打开非 html 文档相当简单。即使是要通过防火墙也是如此。只要设置了正确的 MIME 类型,就可以使用同样的代码来打开图片或其他多媒体文件。当今的互联网上包含了大量信息,其中许多数据被存储为非 HTML 格式。使用 servlet 能够克服 HTML 的限制,简单方便地向用户传送这些非 HTML 格式的信息。

关于作者
Marla Bonar(marla.bonar@javaworld.com),亚利桑那州 Greenbrier & Russel in Phoenix 的一位顾问,自 JDK 1.0.2 出现以来就一直从事 Java 编程工作。她是面向对象体系结构和设计以及软件模式的忠实拥护者。在她父亲的鼓励下,成为一名软件工程师。

资料

若是通过防火墙来建立链接,更详尽的信息可以参看下面几个 Java 要点:

计算机世界开发者俱乐部 http://www.dev-club.com

2004年06月04日
通过JDBC操纵Oracle数据库LOB字段的几种情况分析

2003-6-13

在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。而LONG、LONG RAW等类型的字段,虽然存储容量也不小(可达2GB),但由于一个表中只能有一个这样类型的字段的限制,现在已很少使用了。

LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。

下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。

先建立如下两个测试用的数据库表,Power Designer PD模型如下:

建表SQL语句为:

CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)

CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)

一、 CLOB对象的存取

1、往数据库中插入一个新的CLOB对象

public static void clobInsert(String infile) throws Exception
{
/* 设定不自动提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 插入一个空的CLOB对象 */
stmt.executeUpdate(“INSERT INTO TEST_CLOB VALUES (‘111′, EMPTY_CLOB())”);
/* 查询此CLOB对象并锁定 */
ResultSet rs = stmt.executeQuery(“SELECT CLOBCOL FROM TEST_CLOB WHERE ID=’111′ FOR UPDATE”);
while (rs.next()) {
/* 取出此CLOB对象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(“CLOBCOL”);
/* 向CLOB对象中写入数据 */
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(infile));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
/* 正式提交 */
conn.commit();
} catch (Exception ex) {
/* 出错回滚 */
conn.rollback();
throw ex;
}

/* 恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
}

2、修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改)

public static void clobModify(String infile) throws Exception

{

/* 设定不自动提交 */

boolean defaultCommit = conn.getAutoCommit();

conn.setAutoCommit(false);

try {

/* 查询CLOB对象并锁定 */

ResultSet rs = stmt.executeQuery(“SELECT CLOBCOL FROM TEST_CLOB WHERE ID=’111′ FOR UPDATE”);

while (rs.next()) {

/* 获取此CLOB对象 */

oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(“CLOBCOL”);

/* 进行覆盖式修改 */

BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());

BufferedReader in = new BufferedReader(new FileReader(infile));

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

in.close();

out.close();

}

/* 正式提交 */

conn.commit();

} catch (Exception ex) {

/* 出错回滚 */

conn.rollback();

throw ex;

}

/* 恢复原提交状态 */

conn.setAutoCommit(defaultCommit);

}

3、替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象)

public static void clobReplace(String infile) throws Exception

{

/* 设定不自动提交 */

boolean defaultCommit = conn.getAutoCommit();

conn.setAutoCommit(false);

try {

/* 清空原CLOB对象 */

stmt.executeUpdate(“UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID=’111′”);

/* 查询CLOB对象并锁定 */

ResultSet rs = stmt.executeQuery(“SELECT CLOBCOL FROM TEST_CLOB WHERE ID=’111′ FOR UPDATE”);

while (rs.next()) {

/* 获取此CLOB对象 */

oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(“CLOBCOL”);

/* 更新数据 */

BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());

BufferedReader in = new BufferedReader(new FileReader(infile));

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

in.close();

out.close();

}

/* 正式提交 */

conn.commit();

} catch (Exception ex) {

/* 出错回滚 */

conn.rollback();

throw ex;

}

/* 恢复原提交状态 */

conn.setAutoCommit(defaultCommit);

}

4、CLOB对象读取

public static void clobRead(String outfile) throws Exception

{

/* 设定不自动提交 */

boolean defaultCommit = conn.getAutoCommit();

conn.setAutoCommit(false);

try {

/* 查询CLOB对象 */

ResultSet rs = stmt.executeQuery(“SELECT * FROM TEST_CLOB WHERE ID=’111′”);

while (rs.next()) {

/* 获取CLOB对象 */

oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob(“CLOBCOL”);

/* 以字符形式输出 */

BufferedReader in = new BufferedReader(clob.getCharacterStream());

BufferedWriter out = new BufferedWriter(new FileWriter(outfile));

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

out.close();

in.close();

}

} catch (Exception ex) {

conn.rollback();

throw ex;

}

/* 恢复原提交状态 */

conn.setAutoCommit(defaultCommit);

}

二、 BLOB对象的存取

1、 向数据库中插入一个新的BLOB对象

public static void blobInsert(String infile) throws Exception

{

/* 设定不自动提交 */

boolean defaultCommit = conn.getAutoCommit();

conn.setAutoCommit(false);

try {

/* 插入一个空的BLOB对象 */

stmt.executeUpdate(“INSERT INTO TEST_BLOB VALUES (‘222′, EMPTY_BLOB())”);

/* 查询此BLOB对象并锁定 */

ResultSet rs = stmt.executeQuery(“SELECT BLOBCOL FROM TEST_BLOB WHERE ID=’222′ FOR UPDATE”);

while (rs.next()) {

/* 取出此BLOB对象 */

oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob(“BLOBCOL”);

/* 向BLOB对象中写入数据 */

BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());

BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

in.close();

out.close();

}

/* 正式提交 */

conn.commit();

} catch (Exception ex) {

/* 出错回滚 */

conn.rollback();

throw ex;

}

/* 恢复原提交状态 */

conn.setAutoCommit(defaultCommit);

}

2、修改BLOB对象(是在原BLOB对象基础上进行覆盖式的修改)

public static void blobModify(String infile) throws Exception

{

/* 设定不自动提交 */

boolean defaultCommit = conn.getAutoCommit();

conn.setAutoCommit(false);

try {

/* 查询BLOB对象并锁定 */

ResultSet rs = stmt.executeQuery(“SELECT BLOBCOL FROM TEST_BLOB WHERE ID=’222′ FOR UPDATE”);

while (rs.next()) {

/* 取出此BLOB对象 */

oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob(“BLOBCOL”);

/* 向BLOB对象中写入数据 */

BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());

BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

in.close();

out.close();

}

/* 正式提交 */

conn.commit();

} catch (Exception ex) {

/* 出错回滚 */

conn.rollback();

throw ex;

}

/* 恢复原提交状态 */

conn.setAutoCommit(defaultCommit);

}

3、替换BLOB对象(将原BLOB对象清除,换成一个全新的BLOB对象)

public static void blobReplace(String infile) throws Exception

{

/* 设定不自动提交 */

boolean defaultCommit = conn.getAutoCommit();

conn.setAutoCommit(false);

try {

/* 清空原BLOB对象 */

stmt.executeUpdate(“UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID=’222′”);

/* 查询此BLOB对象并锁定 */

ResultSet rs = stmt.executeQuery(“SELECT BLOBCOL FROM TEST_BLOB WHERE ID=’222′ FOR UPDATE”);

while (rs.next()) {

/* 取出此BLOB对象 */

oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob(“BLOBCOL”);

/* 向BLOB对象中写入数据 */

BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());

BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

in.close();

out.close();

}

/* 正式提交 */

conn.commit();

} catch (Exception ex) {

/* 出错回滚 */

conn.rollback();

throw ex;

}

/* 恢复原提交状态 */

conn.setAutoCommit(defaultCommit);

}

4、BLOB对象读取

public static void blobRead(String outfile) throws Exception

{

/* 设定不自动提交 */

boolean defaultCommit = conn.getAutoCommit();

conn.setAutoCommit(false);

try {

/* 查询BLOB对象 */

ResultSet rs = stmt.executeQuery(“SELECT BLOBCOL FROM TEST_BLOB WHERE ID=’222′”);

while (rs.next()) {

/* 取出此BLOB对象 */

oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob(“BLOBCOL”);

/* 以二进制形式输出 */

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile));

BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());

int c;

while ((c=in.read())!=-1) {

out.write(c);

}

in.close();

out.close();

}

/* 正式提交 */

conn.commit();

} catch (Exception ex) {

/* 出错回滚 */

conn.rollback();

throw ex;

}

/* 恢复原提交状态 */

conn.setAutoCommit(defaultCommit);

}

观察上述程序对LOB类型字段的存取,我们可以看出,较之其它类型字段,有下面几个显著不同的特点:

一是必须取消自动提交。

存取操作开始前,必须用setAutoCommit(false)取消自动提交。其它类型字段则无此特殊要求。这是因为存取LOB类型字段时,通常要进行多次操作可以完成。不这样的话,Oracle将抛出“读取违反顺序”的错误。

二是插入方式不同。

LOB数据不能象其它类型数据一样直接插入(INSERT)。插入前必须先插入一个空的LOB对象,CLOB类型的空对象为EMPTY_CLOB(),BLOB类型的空对象为EMPTY_BLOB()。之后通过SELECT命令查询得到先前插入的记录并锁定,继而将空对象修改为所要插入的LOB对象。

三是修改方式不同。

其它类型的字段修改时,用UPDATE … SET…命令即可。而LOB类型字段,则只能用SELECT … FOR UPDATE命令将记录查询出来并锁定,然后才能修改。且修改也有两种改法:一是在原数据基础上的修改(即覆盖式修改),执行SELECT … FOR UPDATE后再改数据;二是替换(先将原数据清掉,再修改),先执行UPDATE命令将LOB字段之值设为空的LOB对象,然后进行第一种改法。建议使用替换的方法,以实现与其它字段UPDATE操作后一样的效果。

四是存取时应使用由数据库JDBC驱动程序提供的LOB操作类。

对于Oracle数据库,应使用oracle.sql.CLOB和oracle.sql.BLOB。不使用由数据库JDBC驱动程序提供的LOB类时,程序运行时易于出现“抽象方法调用”的错误,这是因为JDBC所定义的java.sql.Clob与java.sql.Blob接口,其中的一些方法并未在数据库厂家提供的驱动程序中真正实现。

五是存取手段与文件操作相仿。

对于BLOB类型,应用InputStream/OutputStream类,此类不进行编码转换,逐个字节存取。oracle.sql.BLOB类相应提供了getBinaryStream()和getBinaryOutputStream()两个方法,前一个方法用于读取Oracle的BLOB字段,后一个方法用于将数据写入Oracle的BLOB字段。

对于CLOB类型,应用Reader/Writer类,此类进行编码转换。oracle.sql.CLOB类相应提供了getCharacterStream()和getCharacterOutputStream()两个方法,前一个方法用于读取Oracle的CLOB字段,后一个方法用于将数据写入Oracle的CLOB字段。

需要说明的是,为了大幅提高程序执行效率,对BLOB/CLOB字段的读写操作,应该使用缓冲操作类(带Buffered前缀),即:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。例程中全部使用了缓冲操作类。

小结:通过JDBC操纵Oracle数据库的LOB字段,不外乎插入、修改、替换、读取四种方式,掌握起来并不难。在实际操作中要注意上面所说的几点,结合阅读例程源程序,用户会很快明白LOB类型字段的使用的,也必将领悟到这种类型字段的妙处!源文件下载>>

存储过程样例
2004-05-28          点击: 11
存储过程样例

CREATE OR REPLACE PROCEDURE P_grxx_tj IS
tmpVar NUMBER;
/******************************************************************************
   过程名:       P_grxx_tj
   功能:         个人信息状况汇总统计

   版本信息:
   版本        日期        作者           描述
   ———  ———-  —————  ————————————
   1.0        2003-11-18   王鹏    

   参数:
   输入参数:
   输出参数:
   返回值:
   被调用:
   调用:
   使用:     P_grxx_tj;
  
   备注:
  
    
   ******************************************************************************/
        –社区编号
  
        CURSOR c_sqbh(as_bj varchar2) IS
           SELECT *  FROM mz_sqbh  WHERE zjb = as_bj;
    
  CURSOR c_code(as_xm varchar2) IS
           SELECT *  FROM db_code  WHERE id = as_xm;
  
 
     TYPE db_code_id_table_type IS TABLE OF db_code.id%TYPE
        INDEX BY BINARY_INTEGER;
        
  db_code_table  db_code_id_table_type ;
  
  
  TYPE znl_table_type IS TABLE OF mz_grxx.znl%TYPE
        INDEX BY BINARY_INTEGER;
        znl_table  znl_table_type ;
  
   
  c_coderec db_code%ROWTYPE;
        c_sqbhrec c_sqbh%ROWTYPE;
  c_tjbrec mz_grxx_tjb%ROWTYPE;
  num_count number;
  
    BEGIN
 
–    db_code_table := db_code_id_table_type(‘zmz’,'zrylb’,'zwhcd’,'zzzmm’);
       
  – ‘民族(zmz)    文化程度(zwhcd)   政治面貌(zzzmm)   人员类别(zrylb)
      
  db_code_table(1) := ‘zmz’;
  db_code_table(2) := ‘zrylb’;
  db_code_table(3) := ‘zwhcd’;
  db_code_table(4) := ‘zzzmm’;
  db_code_table(5) := ‘zxb’;
  
        znl_table(1) := 0;
        znl_table(2) := 6;
  znl_table(3) := 18;
  znl_table(4) := 45;
  znl_table(5) := 60;
  znl_table(6) := 100;
  znl_table(7) := 200;
  
  delete from mz_grxx_tjb;
  commit;
    
  OPEN c_sqbh(‘1′);
        LOOP
           FETCH c_sqbh INTO c_sqbhrec;
     EXIT WHEN c_sqbh%NOTFOUND;    
    
           — ‘民族    文化程度   政治面貌   人员类别
    
     –分项
      
   select count(*) into num_count from mz_grxx where zsqbh = c_sqbhrec.zbh; 
   
   IF num_count = 0  THEN
       num_count := 1;
            END IF;
     
       
   for i in 1..5 loop
   
        OPEN c_code(db_code_table(i));
                 LOOP       
                FETCH c_code INTO c_coderec;
             EXIT WHEN c_code%NOTFOUND;

           c_tjbrec.zbh := c_sqbhrec.zbh;
                c_tjbrec.zmc := c_sqbhrec.zmc;
                c_tjbrec.zbj := c_sqbhrec.zjb;
                  c_tjbrec.zxm := c_coderec.id_comment;
             c_tjbrec.zzxm := c_coderec.data_comment;
          select count(*) into c_tjbrec.zsl from mz_grxx
          where zsqbh = c_sqbhrec.zbh and zmz = c_coderec.data_comment;
              c_tjbrec.zzsl := num_count;
          c_tjbrec.zbfb := round(c_tjbrec.zsl/num_count,2);
      
                insert into mz_grxx_tjb( ZBH,ZMC,ZBJ,ZXM,ZZXM,ZSL,ZBFB)
                select c_tjbrec.zbh,c_tjbrec.ZMC,c_tjbrec.ZBJ,c_tjbrec.ZXM,
          c_tjbrec.ZZXM,c_tjbrec.ZSL,c_tjbrec.ZBFB from dual;
       commit;
        END LOOP;
           CLOSE c_code;
    
            end loop;

  
     
   –年龄比例
  
   — 0~6    6~18   18~45  45~60  60~100  >100 
            for i in 1..6 loop
            
        c_tjbrec.zbh := c_sqbhrec.zbh;
           c_tjbrec.zmc := c_sqbhrec.zmc;
           c_tjbrec.zbj := c_sqbhrec.zjb;
             c_tjbrec.zxm := ‘年龄’;
           c_tjbrec.zzxm := to_char(znl_table(i + 1));
        select count(*) into c_tjbrec.zsl from mz_grxx
        where zsqbh = c_sqbhrec.zbh and znl > znl_table(i) and znl < znl_table(i + 1);
     c_tjbrec.zzsl := num_count;    
     c_tjbrec.zbfb := round(c_tjbrec.zsl/num_count,2);
      
     insert into mz_grxx_tjb( ZBH,ZMC,ZBJ,ZXM,ZZXM,ZSL,ZBFB)
           select c_tjbrec.zbh,c_tjbrec.ZMC,c_tjbrec.ZBJ,c_tjbrec.ZXM,
     c_tjbrec.ZZXM,c_tjbrec.ZSL,c_tjbrec.ZBFB from dual;
     commit;   
  
    end loop;
  
     
     END LOOP;
     CLOSE c_sqbh;
      
 

  –汇总街道,区,市
 
  for i in 2..4 loop
  
       OPEN c_sqbh(to_char(i));
          LOOP
          FETCH c_sqbh INTO c_sqbhrec;
    EXIT WHEN c_sqbh%NOTFOUND;
      
    insert into mz_grxx_tjb(zbh,zmc,zbj,zxm,zzxm,zsl,zzsl,zbfb)
       select c_sqbhrec.zbh,c_sqbhrec.zmc,to_char(i),zxm,zzxm,sum(zsl),sum(zzsl),sum(zsl)/sum(zzsl)
       from mz_grxx_tjb where substr(zbh,1,15 – 3*i) = c_sqbhrec.zbh  and zbj = to_char(i -1)
    group by zxm,zzxm;
 
       END LOOP;
          CLOSE c_sqbh;
  end loop;

     commit;  
     
 
     EXCEPTION
     WHEN NO_DATA_FOUND THEN
       Null;
     WHEN OTHERS THEN
       — Consider logging the error and then re-raise
       RAISE ;
END P_grxx_tj;
/

clob1
2004-05-28          点击: 10
clob1

先说说思路吧,开始就要Connection xxx.setAutoCommit(false)(至于为什么,我也不知道。)

Insert:
1、要插入CLOB信息的话,先insert一个empty_clob()进去。
2、再把中文用byte[]方式向里面写

Update:
1、把要update的Clob替换成empty_clob()
2、用byte[]的方法写进去。

下面的部分代码:里面有很多都是没有用的,你自己del 吧。
public boolean updateClobok(String id,String clobContent){
boolean isupdateok=false;
rs=null;
String sqltmp=null;
Statement stmt1=null;
long lengthofCLOB;
long lengthofCLOBtmp=(long)clobContent.length();
int lengthofchar=0;

Reader chr_instream;
char chr_buffer[];

String temp111=”";
String temp222=”";

String s1 = “”;
try{
sqltmp=”select i_content from information where i_id=”+id+” for update”;
System.out.println(“clobContent=”+clobContent);

conn.setAutoCommit(false);
stmt1=conn.createStatement();
stmt1.executeUpdate(“update information set i_content =empty_clob()”);
rs=stmt1.executeQuery(sqltmp);
while(rs.next()){
java.sql.Clob clob_column=rs.getClob(1);
lengthofCLOB=clob_column.length();
System.out.println(“java.sql.Clob Clob–>clob_column.length=”+lengthofCLOB);

if (lengthofCLOB>lengthofCLOBtmp){
lengthofchar=(int)lengthofCLOBtmp;
}
else{
lengthofchar=(int)clob_column.length();
}
chr_buffer=new char[lengthofchar];
System.out.println(“java.sql.Clob Clob–>clob_column.length=”+lengthofCLOB);
byte[] chrtmp=clobContent.getBytes();
System.out.println(“byte[] chrtmp.length=”+chrtmp.length);
java.io.OutputStream out=((CLOB)clob_column).getAsciiOutputStream();
try{
out.write(chrtmp);
out.flush();
out.close();
}
catch (Exception e1){
System.out.println(“System update Clob err: “+ e1);
}

BufferedReader r=new BufferedReader(((oracle.sql.CLOB)clob_column).getCharacterStream());
while ((temp111=r.readLine())!=null)
{
temp222+=temp111;
}
try{
System.out.println(“—->Reading Begin…”);
chr_instream=clob_column.getCharacterStream();
chr_instream.read(chr_buffer);
System.out.println(ppStr(temp222));
chr_instream.close();
System.out.println(“—->Reading End.”);
}
catch (Exception e9) {
System.out.println(“System Read CLOB err” + e9);
}
}
conn.commit();
conn.setAutoCommit(true);
stmt1.close();
isupdateok=true;
}
catch (Exception e2){
System.out.println(“System. updateCLOB ERR:” +e2);
}
finally{
return isupdateok;
}
}

 

clob2
2004-05-28          点击: 7
clob2

处理CLOB字段的动态PL/SQL
动态PL/SQL,对CLOB字段操作可传递表名table_name,表的唯一标志字段名field_id,clob字段名field_name,记录号v_id,开始处理字符的位置v_pos,传入的字符串变量v_clob

修改CLOB的PL/SQL过程:updateclob

create or replace procedure updateclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number,
v_clob in varchar2)
is
lobloc clob;
c_clob varchar2(32767);
amt binary_integer;
pos binary_integer;
query_str varchar2(1000);
begin
pos:=v_pos*32766+1;
amt := length(v_clob);
c_clob:=v_clob;
query_str :=’select ‘||field_name||’ from ‘||table_name||’ where ‘||field_id||’= :id for update ‘;
–initialize buffer with data to be inserted or updated
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
–from pos position, write 32766 varchar2 into lobloc
dbms_lob.write(lobloc, amt, pos, c_clob);
commit;
exception
when others then
rollback;
end;
/

用法说明:
在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),
然后调用以上的过程插入大于2048到32766个字符。
如果需要插入大于32767个字符,编一个循环即可解决问题。

查询CLOB的PL/SQL函数:getclob

create or replace function getclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number) return varchar2
is
lobloc clob;
buffer varchar2(32767);
amount number := 2000;
offset number := 1;
query_str varchar2(1000);
begin
query_str :=’select ‘||field_name||’ from ‘||table_name||’ where ‘||field_id||’= :id ‘;
–initialize buffer with data to be found
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
offset:=offset+(v_pos-1)*2000;
–read 2000 varchar2 from the buffer
dbms_lob.read(lobloc,amount,offset,buffer);
return buffer;
exception
when no_data_found then
return buffer;
end;
/

用法说明:

用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual;
可以从CLOB字段中取2000个字符到partstr中,
编一个循环可以把partstr组合成dbms_lob.getlength(field_name)长度的目标字符串。

 

oracle里的常用命令3
2004-05-28          点击: 44
oracle里的常用命令3
第十章:managing privileges 

1.system privileges: view => system_privilege_map ,dba_sys_privs,session_privs 

2.grant system privilege 
sql> grant create session,create table to managers; 
sql> grant create session to scott with admin option; 
with admin option can grant or revoke privilege from any user or role; 

3.sysdba and sysoper privileges: 
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile, 
alter tablespace begin/end backup,recover database 
alter database archivelog,restricted session 
sysdba: sysoper privileges with admin option,create database,recover database until 

4.password file members: view:=> v$pwfile_users 

5.O7_dictionary_accessibility =true restriction access to view or tables in other schema 

6.revoke system privilege 
sql> revoke create table from karen; 
sql> revoke create session from scott; 

7.grant object privilege 
sql> grant execute on dbms_pipe to public; 
sql> grant update(first_name,salary) on employee to karen with grant option; 

8.display object privilege : view => dba_tab_privs, dba_col_privs 

9.revoke object privilege 
sql> revoke execute on dbms_pipe from scott [cascade constraints]; 

10.audit record view :=> sys.aud$ 

11. protecting the audit trail 
sql> audit delete on sys.aud$ by access; 

12.statement auditing 
sql> audit user; 

13.privilege auditing 
sql> audit select any table by summit by access; 

14.schema object auditing 
sql> audit lock on summit.employee by access whenever successful; 

15.view audit option : view=> all_def_audit_opts,dba_stmt_audit_opts,dba_priv_audit_opts,dba_obj_audit_opts 

16.view audit result: view=> dba_audit_trail,dba_audit_exists,dba_audit_object,dba_audit_session,dba_audit_statement 

第十一章: manager role 

1.create roles 
sql> create role sales_clerk; 
sql> create role hr_clerk identified by bonus; 
sql> create role hr_manager identified externally; 

2.modify role 
sql> alter role sales_clerk identified by commission; 
sql> alter role hr_clerk identified externally; 
sql> alter role hr_manager not identified; 

3.assigning roles 
sql> grant sales_clerk to scott; 
sql> grant hr_clerk to hr_manager; 
sql> grant hr_manager to scott with admin option; 

4.establish default role 
sql> alter user scott default role hr_clerk,sales_clerk; 
sql> alter user scott default role all; 
sql> alter user scott default role all except hr_clerk; 
sql> alter user scott default role none; 

5.enable and disable roles 
sql> set role hr_clerk; 
sql> set role sales_clerk identified by commission; 
sql> set role all except sales_clerk; 
sql> set role none; 

6.remove role from user 
sql> revoke sales_clerk from scott; 
sql> revoke hr_manager from public; 

7.remove role 
sql> drop role hr_manager; 

8.display role information 
view: =>dba_roles,dba_role_privs,role_role_privs,dba_sys_privs,role_sys_privs,role_tab_privs,session_roles 

第十二章: BACKUP and RECOVERY 

1. v$sga,v$instance,v$process,v$bgprocess,v$database,v$datafile,v$sgastat 

2. Rman need set dbwr_IO_slaves or backup_tape_IO_slaves and large_pool_size 

3. Monitoring Parallel Rollback 
> v$fast_start_servers , v$fast_start_transactions 

4.perform a closed database backup (noarchivelog) 
> shutdown immediate 
> cp files /backup/ 
> startup 

5.restore to a different location 
> connect system/manager as sysdba 
> startup mount 
> alter database rename file /disk1/../user.dbf to /disk2/../user.dbf
> alter database open; 

6.recover syntax 
–recover a mounted database 
>recover database; 
>recover datafile /disk1/data/df2.dbf
>alter database recover database; 
–recover an opened database 
>recover tablespace user_data; 
>recover datafile 2; 
>alter database recover datafile 2; 

7.how to apply redo log files automatically 
>set autorecovery on 
>recover automatic datafile 4; 

8.complete recovery: 
–method 1(mounted databae) 
>copy c:\backup\user.dbf c:\oradata\user.dbf 
>startup mount 
>recover datafile c:\oradata\user.dbf; 
>alter database open; 
–method 2(opened database,initially opened,not system or rollback datafile) 
>copy c:\backup\user.dbf c:\oradata\user.dbf (alter tablespace offline) 
>recover datafile c:\oradata\user.dbf or 
>recover tablespace user_data; 
>alter database datafile c:\oradata\user.dbf online or 
>alter tablespace user_data online; 
–method 3(opened database,initially closed not system or rollback datafile) 
>startup mount 
>alter database datafile c:\oradata\user.dbf offline; 
>alter database open 
>copy c:\backup\user.dbf d:\oradata\user.dbf 
>alter database rename file c:\oradata\user.dbf to d:\oradata\user.dbf 
>recover datafile e:\oradata\user.dbf or recover tablespace user_data; 
>alter tablespace user_data online; 
–method 4(loss of data file with no backup and have all archive log) 
>alter tablespace user_data offline immediate; 
>alter database create datafile d:\oradata\user.dbf as c:\oradata\user.dbf 
>recover tablespace user_data; 
>alter tablespace user_data online 
5.perform an open database backup 
> alter tablespace user_data begin backup; 
> copy files /backup/ 
> alter database datafile /c:/../data.dbf end backup; 
> alter system switch logfile; 
6.backup a control file 
> alter database backup controlfile to control1.bkp
> alter database backup controlfile to trace; 
7.recovery (noarchivelog mode) 
> shutdown abort 
> cp files 
> startup 
8.recovery of file in backup mode 
>alter database datafile 2 end backup; 

9.clearing redo log file 
>alter database clear unarchived logfile group 1; 
>alter database clear unarchived logfile group 1 unrecoverable datafile; 

10.redo log recovery 
>alter database add logfile group 3 c:\oradata\redo03.log size 1000k; 
>alter database drop logfile group 1; 
>alter database open; 
or >cp c:\oradata\redo02.log c:\oradata\redo01.log 
>alter database clear logfile c:\oradata\log01.log;

oracle里的常用命令2
2004-05-28 ?? ?? ?? 点击: 64
oracle里的常用命令2
第四章:索引?

1.creating?function-based?indexes?
sql>?create?index?summit.item_quantity?on?summit.item(quantity-quantity_shipped);?

2.create?a?B-tree?index?
sql>?create?[unique]?index?index_name?on?table_name(column,..?asc/desc)?tablespace?
sql>?tablespace_name?[pctfree?integer]?[initrans?integer]?[maxtrans?integer]?
sql>?[logging?|?nologging]?[nosort]?storage(initial?200k?next?200k?pctincrease?0?
sql>?maxextents?50);?

3.pctfree(index)=(maximum?number?of?rows-initial?number?of?rows)*100/maximum?number?of?rows?

4.creating?reverse?key?indexes?
sql>?create?unique?index?xay_id?on?xay(a)?reverse?pctfree?30?storage(initial?200k?
sql>?next?200k?pctincrease?0?maxextents?50)?tablespace?indx;?

5.create?bitmap?index?
sql>?create?bitmap?index?xay_id?on?xay(a)?pctfree?30?storage(?initial?200k?next?200k?
sql>?pctincrease?0?maxextents?50)?tablespace?indx;?

6.change?storage?parameter?of?index?
sql>?alter?index?xay_id?storage?(next?400k?maxextents?100);?

7.allocating?index?space?
sql>?alter?index?xay_id?allocate?extent(size?200k?datafile?c:/oracle/index.dbf);?

8.alter?index?xay_id?deallocate?unused;?

第五章:约束?

1.define?constraints?as?immediate?or?deferred?
sql>?alter?session?set?constraint[s]?=?immediate/deferred/default;?
set?constraint[s]?constraint_name/all?immediate/deferred;?

2.?sql>?drop?table?table_name?cascade?constraints?
sql>?drop?tablespace?tablespace_name?including?contents?cascade?constraints?

3.?define?constraints?while?create?a?table?
sql>?create?table?xay(id?number(7)?constraint?xay_id?primary?key?deferrable?
sql>?using?index?storage(initial?100k?next?100k)?tablespace?indx);?
primary?key/unique/references?table(column)/check?

4.enable?constraints?
sql>?alter?table?xay?enable?novalidate?constraint?xay_id;?

5.enable?constraints?
sql>?alter?table?xay?enable?validate?constraint?xay_id;?

第六章:LOAD数据?

1.loading?data?using?direct_load?insert?
sql>?insert?/*+append?*/?into?emp?nologging?
sql>?select?*?from?emp_old;?

2.parallel?direct-load?insert?
sql>?alter?session?enable?parallel?dml;?
sql>?insert?/*+parallel(emp,2)?*/?into?emp?nologging?
sql>?select?*?from?emp_old;?

3.using?sql*loader?
sql>?sqlldr?scott/tiger?\?
sql>?control?=?ulcase6.ctl?\?
sql>?log?=?ulcase6.log?direct=true?

第七章:reorganizing?data?

1.using?expoty?
$exp?scott/tiger?tables(dept,emp)?file=c:\emp.dmp?log=exp.log?compress=n?direct=y?

2.using?import?
$imp?scott/tiger?tables(dept,emp)?file=emp.dmp?log=imp.log?ignore=y?

3.transporting?a?tablespace?
sql>alter?tablespace?sales_ts?read?only;?
$exp?sys/..?file=xay.dmp?transport_tablespace=y?tablespace=sales_ts?
triggers=n?constraints=n?
$copy?datafile?
$imp?sys/..?file=xay.dmp?transport_tablespace=y?datafiles=(/disk1/sles01.dbf,/disk2?
/sles02.dbf)?
sql>?alter?tablespace?sales_ts?read?write;?

4.checking?transport?set?
sql>?DBMS_tts.transport_set_check(ts_list?=>sales_ts?..,incl_constraints=>true);?
在表transport_set_violations?中查看?
sql>?dbms_tts.isselfcontained?为true?是,?表示自包含?

第八章:?managing?password?security?and?resources?

1.controlling?account?lock?and?password?
sql>?alter?user?juncky?identified?by?oracle?account?unlock;?

2.user_provided?password?function?
sql>?function_name(userid?in?varchar2(30),password?in?varchar2(30),?
old_password?in?varchar2(30))?return?boolean?

3.create?a?profile?:?password?setting?
sql>?create?profile?grace_5?limit?failed_login_attempts?3?
sql>?password_lock_time?unlimited?password_life_time?30?
sql>password_reuse_time?30?password_verify_function?verify_function?
sql>?password_grace_time?5;?

4.altering?a?profile?
sql>?alter?profile?default?failed_login_attempts?3?
sql>?password_life_time?60?password_grace_time?10;?

5.drop?a?profile?
sql>?drop?profile?grace_5?[cascade];?

6.create?a?profile?:?resource?limit?
sql>?create?profile?developer_prof?limit?sessions_per_user?2?
sql>?cpu_per_session?10000?idle_time?60?connect_time?480;?

7.?view?=>?resource_cost?:?alter?resource?cost?
dba_Users,dba_profiles?

8.?enable?resource?limits?
sql>?alter?system?set?resource_limit=true;?

第九章:Managing?users?

1.create?a?user:?database?authentication?
sql>?create?user?juncky?identified?by?oracle?default?tablespace?users?
sql>?temporary?tablespace?temp?quota?10m?on?data?password?expire?
sql>?[account?lock|unlock]?[profile?profilename|default];?

2.change?user?quota?on?tablespace?
sql>?alter?user?juncky?quota?0?on?users;?

3.drop?a?user?
sql>?drop?user?juncky?[cascade];?

4.?monitor?user?
view:?dba_users?,?dba_ts_quotas

oracle里的常用命令1
2004-05-28          点击: 90
oracle里的常用命令1
第一章:日志管理 

1.forcing log switches 
sql> alter system switch logfile;

2.forcing checkpoints 
sql> alter system checkpoint; 

3.adding online redo log groups 
sql> alter database add logfile [group 4] 
sql> (/disk3/log4a.rdo,/disk4/log4b.rdo) size 1m; 

4.adding online redo log members 
sql> alter database add logfile member 
sql> /disk3/log1b.rdo to group 1, 
sql> /disk4/log2b.rdo to group 2; 

5.changes the name of the online redo logfile 
sql> alter database rename file c:/oracle/oradata/oradb/redo01.log 
sql> to c:/oracle/oradata/redo01.log

6.drop online redo log groups 
sql> alter database drop logfile group 3; 

7.drop online redo log members 
sql> alter database drop logfile member c:/oracle/oradata/redo01.log

8.clearing online redo log files 
sql> alter database clear [unarchived] logfile c:/oracle/log2a.rdo

9.using logminer analyzing redo logfiles 

a. in the init.ora specify utl_file_dir =   
b. sql> execute dbms_logmnr_d.build(oradb.ora,c:\oracle\oradb\log); 
c. sql> execute dbms_logmnr_add_logfile(c:\oracle\oradata\oradb\redo01.log
sql> dbms_logmnr.new); 
d. sql> execute dbms_logmnr.add_logfile(c:\oracle\oradata\oradb\redo02.log
sql> dbms_logmnr.addfile); 
e. sql> execute dbms_logmnr.start_logmnr(dictfilename=>c:\oracle\oradb\log\oradb.ora); 
f. sql> select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters 
sql> v$logmnr_logs); 
g. sql> execute dbms_logmnr.end_logmnr; 

第二章:表空间管理 
1.create tablespaces 
sql> create tablespace tablespace_name datafile c:\oracle\oradata\file1.dbf size 100m, 
sql> c:\oracle\oradata\file2.dbf size 100m minimum extent 550k [logging/nologging] 
sql> default storage (initial 500k next 500k maxextents 500 pctinccease 0) 
sql> [online/offline] [permanent/temporary] [extent_management_clause] 

2.locally managed tablespace 
sql> create tablespace user_data datafile c:\oracle\oradata\user_data01.dbf 
sql> size 500m extent management local uniform size 10m; 

3.temporary tablespace 
sql> create temporary tablespace temp tempfile c:\oracle\oradata\temp01.dbf 
sql> size 500m extent management local uniform size 10m; 

4.change the storage setting 
sql> alter tablespace app_data minimum extent 2m; 
sql> alter tablespace app_data default storage(initial 2m next 2m maxextents 999); 

5.taking tablespace offline or online 
sql> alter tablespace app_data offline; 
sql> alter tablespace app_data online; 

6.read_only tablespace 
sql> alter tablespace app_data read only|write; 

7.droping tablespace 
sql> drop tablespace app_data including contents; 

8.enableing automatic extension of data files 
sql> alter tablespace app_data add datafile c:\oracle\oradata\app_data01.dbf size 200m 
sql> autoextend on next 10m maxsize 500m; 

9.change the size fo data files manually 
sql> alter database datafile c:\oracle\oradata\app_data.dbf resize 200m; 

10.Moving data files: alter tablespace 
sql> alter tablespace app_data rename datafile c:\oracle\oradata\app_data.dbf 
sql> to c:\oracle\app_data.dbf

11.moving data files:alter database 
sql> alter database rename file c:\oracle\oradata\app_data.dbf 
sql> to c:\oracle\app_data.dbf

第三章:表 

1.create a table 
sql> create table table_name (column datatype,column datatype]….) 
sql> tablespace tablespace_name [pctfree integer] [pctused integer] 
sql> [initrans integer] [maxtrans integer] 
sql> storage(initial 200k next 200k pctincrease 0 maxextents 50) 
sql> [logging|nologging] [cache|nocache] 

2.copy an existing table 
sql> create table table_name [logging|nologging] as subquery 

3.create temporary table 
sql> create global temporary table xay_temp as select * from xay; 
on commit preserve rows/on commit delete rows 

4.pctfree = (average row size - initial row size) *100 /average row size 
pctused = 100-pctfree- (average row size*100/available data space) 

5.change storage and block utilization parameter 
sql> alter table table_name pctfree=30 pctused=50 storage(next 500k 
sql> minextents 2 maxextents 100); 

6.manually allocating extents 
sql> alter table table_name allocate extent(size 500k datafile c:/oracle/data.dbf); 

7.move tablespace 
sql> alter table employee move tablespace users; 

8.deallocate of unused space 
sql> alter table table_name deallocate unused [keep integer] 

9.truncate a table 
sql> truncate table table_name; 

10.drop a table 
sql> drop table table_name [cascade constraints]; 

11.drop a column 
sql> alter table table_name drop column comments cascade constraints checkpoint 1000; 
alter table table_name drop columns continue; 

12.mark a column as unused 
sql> alter table table_name set unused column comments cascade constraints; 
alter table table_name drop unused columns checkpoint 1000; 
alter table orders drop columns continue checkpoint 1000 
data_dictionary : dba_unused_col_tabs