精华内容
下载资源
问答
  • oracle存储超长文本

    千次阅读 2020-03-24 10:54:23
    一、Oracle中的varchar2类型 我们在Oracle数据库存储的字符数据一般是用VARCHAR2。VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同。 在Oracle ...

    一、Oracle中的varchar2类型

    1. 我们在Oracle数据库存储的字符数据一般是用VARCHAR2。VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同。

    2. 在Oracle Database中,VARCHAR2 字段类型,最大值为4000(汉字2000);PL/SQL中 VARCHAR2 变量类型,最大字节长度为32767。

    3. 当 VARCHAR2 容纳不下我们需要存储的信息时,就需要用Oracle的大数据类型LOB( Large Object,大型对象)

    二、Oarcle中的LOB类型

    1. 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。

    2. LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。

    3. CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。

    三、DB中使用CLOB类型字段

    (一)、创建表(使用sql或者直接在PL/SQL客户端创建),字段类型CLOB

     

    -- Create table
    create table TEMP
    (
      name      VARCHAR2(200),
      age       NUMBER,
      temp_clob CLOB
    )
    tablespace INSIGHTDATA3_TS
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 160K
        next 1M
        minextents 1
        maxextents unlimited
      );

     

    (二)、增删改查

    先看一下使用普通方式操作CLOB类型:

    SELECT t.name, t.temp_clob FROM temp t; --普通查询 INSERT INTO temp t VALUES ('Grand.Jon', 22, '加入博客园的第一天');

    查询因为不是varchar2类型,所以普通查询看不到CLOB类型的字段内容,结果如下

    而普通插入操作也会因为Oracle的隐式转换,默认把字符串转换成varchar2类型,一旦字符串内容超过varchar2的最大限度就会报会报ora-01704(字符串太长)错误。

    正确操作

    复制代码

    --使用PL/SQL语法,采取绑定变量的方式解决,而不是直接拼接SQL
    
    DECLARE 
           V_LANG CLOB := '待插入的海量字符串';
           
           V_UPDATE CLOB := '更新的海量字符串';
    BEGIN
    
      INSERT INTO temp t VALUES ('Grand.Jon', 22, V_LANG);        --增加
    
      UPDATE temp t SET t.temp_clob = V_UPDATE WHERE rownum = 1;  --修改
    
      SELECT t.NAME, dbms_lob.substr(t.temp_clob) FROM TEMP t;    --查询  将CLOB转成字符类型
    
      DELETE temp t WHERE rownum = 1;                             --按列删除  
    
      COMMIT;
    
    END;
    /

     

    对CLOB的操作我们在存储过程中基本上使用 dbms_lob 中 substr , append , write 等方法。

    dbms_lob 方法总结

    1 dbms_lob.createtemporary(V_SQL,true);     --创建一个临时clob,用来存储拼接的sql
    2 dbms_lob.write(v_SQL,'写入信息');          --写入操作
    3 dbms_lob.append(v_SQL,',');               --拼接clob
    4 dbms_lob.substr(v_SQL);                   --截取clob,不传参数就是全部读取
    5 dbms_lob.freetemporary(v_SQL);            --释放clob

    查询结果如下:

    四、在存储过程中使用CLOB类型实例

    需求:以开发的存储过程为例,需要循环遍历时间范围拼接sql,将时间日期按列反转(pivot),如果时间太长(1年以上)sql语句(varchar2)就会超出范围报错,这时候就需要使用CLOB来存储拼接的sql。

     

    PROCEDURE P_AND_CPT_RATIOOTH_APP_BAK2_N(
                V_APPIDS IN VARCHAR2,
                V_TYPE IN VARCHAR2,
                V_CHANNEL IN VARCHAR2,
                V_TABLE IN VARCHAR2,
                V_START IN VARCHAR2,
                V_END IN VARCHAR2,
                RESULT OUT mycursor
    ) IS
    
    
    V_SQL CLOB;
    V_SQLWHERE VARCHAR2(32767) default  '';
    V_SQLWHERE_CHANNEL VARCHAR2(32767) default '';
    V_SQL_DATES  CLOB;
    V_Sdate  DATE;
    V_Edate  DATE;
    V_TABLE_DATE VARCHAR2(50);
    V_TABLE_TYPE VARCHAR2(50);
    V_START_DATE VARCHAR2(50);
    V_END_DATE   VARCHAR2(50);
    
    V_DAY VARCHAR2(50);
    
    BEGIN
        select column_name into V_TABLE_DATE from user_tab_columns where table_name=''||V_TABLE||'' and column_id=1;
        select column_name into V_TABLE_TYPE from user_tab_columns where table_name=''||V_TABLE||'' and column_id=5;
      
        dbms_lob.createtemporary(V_SQL,true);--创建一个临时lob
        dbms_lob.createtemporary(V_SQL_DATES,true);--创建一个临时lob
        
        IF V_APPIDS is NOT NULL THEN
           V_SQLWHERE := 'AND t.appid in ('||V_APPIDS||')';
        END IF;
    
        IF V_CHANNEL IS NOT NULL THEN
           V_SQLWHERE_CHANNEL := 'AND t.channel = '''||V_CHANNEL||'''';
        END IF;
        
        IF V_TABLE_DATE = 'MON' THEN
           V_START_DATE := SUBSTR(V_START,0,6);
           V_END_DATE :=  SUBSTR(V_END,0,6);
           v_sdate := to_date(V_START_DATE, 'yyyymm');
           v_edate := to_date(V_END_DATE, 'yyyymm');
           
            WHILE (v_sdate <= v_edate) LOOP
                  dbms_lob.append(v_SQL_DATES,to_char(v_sdate, 'yyyymm'));--把临时字符串付给v_str
            IF v_sdate != v_edate THEN
                  dbms_lob.append(v_SQL_DATES,',');--把临时字符串付给v_str
            END IF;
            v_sdate := add_months(v_sdate,1);
        
            END LOOP;
        ELSE  --周和日 类型 都是 DAY
          
           v_sdate := to_date(V_START, 'yyyymmdd');
           v_edate := to_date(V_END, 'yyyymmdd');
           V_END_DATE :=  V_END;
           
           IF SUBSTR(V_TYPE,0,1)='d' THEN
                V_START_DATE := to_char(v_sdate, 'yyyymmdd');
    
                WHILE (v_sdate <= v_edate) LOOP
                      dbms_lob.append(v_SQL_DATES,to_char(v_sdate, 'yyyymmdd'));--把临时字符串付给v_str
                IF v_sdate != v_edate THEN
                      dbms_lob.append(v_SQL_DATES,',');--把临时字符串付给v_str
                END IF;
                v_sdate := v_sdate+1;
            
                END LOOP;
           
           ELSIF SUBSTR(V_TYPE,0,1)='w' THEN
    
               select to_char(V_Sdate,'d') INTO V_DAY from dual;
                IF V_DAY!=2 THEN
                 V_Sdate:=V_Sdate-7;
                END IF;
              V_START_DATE := to_char(v_sdate, 'yyyymmdd');
    
              WHILE (v_sdate <= v_edate) LOOP
                   select to_char(V_Sdate,'d') INTO V_DAY from dual;
                  IF V_DAY=2 THEN
                     dbms_lob.append(v_SQL_DATES,to_char(v_sdate, 'yyyymmdd'));--把临时字符串付给v_str
                     IF V_Edate-v_sdate >7 THEN
                       dbms_lob.append(v_SQL_DATES,',');--把临时字符串付给v_str
                     END IF;
    
                  END IF;
                v_sdate := v_sdate+1;
               END LOOP;
    
           END IF;
    
        END IF;
        
        dbms_lob.append(v_sql,'SELECT * FROM( SELECT *
                FROM '||V_TABLE||' t
               WHERE 
                     t.'||V_TABLE_TYPE||' = '''||V_TYPE||'''
                 AND t.'||V_TABLE_DATE||' >= '''||V_START_DATE||'''
                 AND t.'||V_TABLE_DATE||' <= '''||V_END_DATE||'''
                 '||V_SQLWHERE||'         
                 '||V_SQLWHERE_CHANNEL||' ) t1
     
               pivot(sum(MARKETSHARE)
                 for '||V_TABLE_DATE||' in(');
                 
        dbms_lob.append(v_sql,v_SQL_DATES);
        dbms_lob.append(v_sql,'))');
        dbms_output.put_line(v_sql);      
        OPEN result FOR v_sql;   
     
           dbms_lob.freetemporary(v_sql);--释放lob
           dbms_lob.freetemporary(v_SQL_DATES);--释放lob
           --dbms_output.put_line(V_SQLDATE);
    
          -- dbms_output.put_line(v_SQL_DATES);
    
    
    --记录操作日志及错误日志
    END;

     

    五、使用Java开发操作CLOB字段

    (一)、原生JDBC处理CLOB类型

    • 增加,一般会插入一个空的clob到数据库对应的字段,然后锁定该列,用Write将待插入字符串写入进去。

          重点:这两步操作要放在同一个事务里面。具体增加的方法如下:

     

    public boolean save(Article article){
            boolean result = true;
            Connection conn = ConnectionUntils.getInstance();
            String sql = "insert into temp values(?,?,empty_clob())";
            //锁住该列,防止并发写入时候该字段同时被多次写入造成错误
            String sqlClob = "select temp_clob from temp t where t.name=? for update";
            PreparedStatement pst =null;
            ResultSet rs = null;
            Writer writer = null;
            try {
                conn.setAutoCommit(false);//设置不自动提交,开启事务
                pst = conn.prepareStatement(sql);
                pst.setString(1,article.getName());
                pst.setString(2,article.getAge());
                pst.executeUpdate();
    
                pst= conn.prepareStatement(sqlClob);
                pst.setInt(1, article.getId());
    
                rs = pst.executeQuery();
                CLOB clob = null;
                if(rs.next()){
                    try {
                        clob = (CLOB) rs.getClob(1);
                        writer = clob.getCharacterOutputStream(); //拿到clob的字符输入流
                        writer.write(article.getContent());
                        writer.flush();
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                conn.commit();
            } catch (SQLException e) {
                result = false;
                try {
                    conn.rollback();//当commit或者rollback后会自动释放该列的锁定
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            } finally {
                conn.setAutoCommit(true);//还原
                ConnectionUntils.close(rs, pst, conn);
            }
            return result;
        }

     

    update操作,update时候主要利用PreparedStatement的setClob方法:

     

    public boolean update(String name,String content){
            int result = 0;
            Connection conn = ConnectionUntils.getInstance();
            String sql = "update temp set temp_clob=? where name=?";
            PreparedStatement pst =null;
            try {
                CLOB clob   = oracle.sql.CLOB.createTemporary(conn, false,oracle.sql.CLOB.DURATION_SESSION);
                clob.setString(1L, content);
                pst = conn.prepareStatement(sql);
                pst.setClob(1, clob);
                pst.setString(2,name);
                result = pst.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                ConnectionUntils.close(null, pst, conn);
            }
            if(result==0)
                return false;
            return true;
        }

     

    查询就主要是从结果集ResultSet中定位到对应的字段后,往外读:

     

    public Article select(String name){
            Article article = new Article();
            Connection conn = ConnectionUntils.getInstance();
            String sql = "select name,age,temp_clog from temp where name = ?";
            PreparedStatement pst =null;
            ResultSet rs = null;
            try {
                pst = conn.prepareStatement(sql);
                pst.setInt(1,id);
                rs = pst.executeQuery();
                StringBuilder builder = new StringBuilder();
                if(rs.next()){
                    Clob clob = rs.getClob("temp_clog");
                    Reader rd = clob.getCharacterStream();
                    char [] str = new char[12];
                    while(rd.read(str) != -1) {
                        builder.append(new String(str));
                    }
                    article.setContent(builder.toString());
                    article.setName(rs.getString("name"));
                    article.setAge(rs.getInt("age"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                ConnectionUntils.close(rs, pst, conn);
            }
            return article;
        }

     

    (二)、Hibernate、Mybatis框架操作

    • 这个因为框架都封装集成好了,所以我们使用的时候直接配置变量的类型为CLOB就可以。

      譬如:Mybatis

    <result column="temp_clob" property="content" jdbcType="Clob"  typeHandler="org.apache.ibatis.type.ClobTypeHandler"/> 

    貌似Hibernate5内部做了对应的处理,可以直接当string类型一样处理即可。

    六、总结

      虽然CLOB能解决VARCHAR2字符大小的限制,但是我们的DBA们都不建议用这些来处理,可能效率问题吧,大的文件应该放在服务器上,然后Database中存响应地址即可。

            if ( U.read(me.Blog) ) $("#推荐").click();
            if ( U.copy(me.Blog) ) $("#u Blog").console("原文链接:http://www.cnblogs.com/Grand-Jon/p/7389427.html ");
            else me.Fuck(U);
    展开全文
  • jdbc 读取oracle long raw 字段,里面的是文本 参考: http://singlewolf.iteye.com/blog/278769 http://blog.csdn.net/restraint/article/details/7190265 ... String ...

    jdbc 读取oracle long raw 字段,里面存的是文本

    参考:

    http://singlewolf.iteye.com/blog/278769

    http://blog.csdn.net/restraint/article/details/7190265

    http://blog.csdn.net/bq1073100909/article/details/49335491

    String sql = "select condition from tbl t where t.a = ? and t.b = ?";
                PreparedStatement statement = hebSgConn.prepareStatement(sql);
                statement.setString(1, "20170305");
                statement.setInt(2, 146897);
                ResultSet resultSet = statement.executeQuery();
                if (resultSet.next()) {
                    InputStream inputStream = resultSet.getBinaryStream("condition");
                    ByteArrayOutputStream infoStream = new ByteArrayOutputStream();
                    int len = 0;
                    byte[] bytes = new byte[1024];
                    try {
                        while ((len = inputStream.read(bytes)) != -1) {
                            // 将bcache中读取的input数据写入infoStream
                            infoStream.write(bytes, 0, len);
                        }
                    } catch (IOException e1) {
                        throw new Exception("输入流读取异常");
                    } finally {
                        try {
                            inputStream.close(); // 输入流关闭
                        } catch (IOException e) {
                            throw new Exception("输入流关闭异常");
                        }
                    }
                    try {
                        String result = infoStream.toString(DEFAULT_ENCODING);
                        System.out.println(result);
                    } catch (UnsupportedEncodingException e) {
                        throw new Exception("输出异常");
                    }
                }

    基本上是流操作;

     

    展开全文
  • Oracle 存储大文本

    2006-06-11 15:16:00
    Oracle 存储大文本 string sql = string.Format( "update t_bas_publishtype set content=:content where id='{0}'" , id );OracleParameter p = new OracleParameter( ":content" , OracleType.Clob);p.Direct...
    Oracle 存储大文本  
    string sql = string.Format( "update t_bas_publishtype set content=:content where id='{0}'" , id );
        OracleParameter p = new OracleParameter( ":content" , OracleType.Clob);
        p.Direction=ParameterDirection.Input;
        p.Value =content;
        OracleParameter [] param = new OracleParameter[1];
        param[0] = p;
        Global.pageBase.ExecuteCommand(sql,param);


    content 类型为:clob

    转载于:https://www.cnblogs.com/wangzhq/archive/2006/06/11/423171.html

    展开全文
  • 数据库中提供了两种字段类型 Blob 和 Clob 用于存储大型字符串或二进制数据(如图片)。 Blob 采用单字节存储,适合保存二进制数据,如图片文件。...Oracle中处理BLOB/CLOB字段的方式比较特别,所以需要特别
    展开全文
  • Clob 采用多字节存储,适合保存大型文本数据。 ###Oracle中处理BLOB/CLOB字段的方式比较特别,所以需要特别注意下面两点: 在Oracle JDBC中采用流机制对 BLOB/CLOB 进行读写操作,所以要注意不能在批处理中读写 ...
  • Oracle 快速卸载数据到文本文件

    千次阅读 2016-12-27 13:56:06
    一、需求 有个需求要从oracle表里导出数据,成csv文本文件。数据量有4亿多行、25g。最普通的解决方案是在sql*plus使用spool。尽管该方案在某些情况下可行,但它的速度太慢,输出大约每秒1m字节,全部导出需要7个...
  • --脚本文件名为expmyusr.sql,数据的文件名为e:\exp.txt set echo on --是否显示执行的命令内容  set feedback off --是否显示 * rows selected  set heading off --是否显示字段的名称 set verify ...
  • 1 package cn.itcast.web.oracle.util; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 public class Jdbc...
  • oracle导入csv文本文件到vertica

    千次阅读 2016-05-23 20:41:30
    oracle数据到vertica create table tmp.DATA_MOBILESTRAT (  session_id NVARCHAR2(36),  device_id NVARCHAR2(100),  android_imei NVARCHAR2(200),  mac_address NVARCHAR2(200)...
  • 发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。 根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法: 1.新建记录,插入BLOB数据  1.1首先新建记录的...
  • 发现,如果BLOB中存储的是文本文件的话,就没问题,如果是二进制文件,传输就会有问题。 根据自己的经验,以及查阅了Oracle的官方文档,都是使用如下处理方法: 1.新建记录,插入BLOB数据  1.1首先新建记录的...
  • oracle数据库怎么存储长文本的字段

    万次阅读 2017-05-04 16:29:32
    由于oracle中varchar2最大存储长度是4000,所以存储超过4000字节的文本数据,考虑用clob类型. 例如: 创建包含clob类型的表: create table test ( id int, name clob ); 在clob类型中插入数据(与往varchar2...
  • spring中存oracle的clob类型数据
  • 今天在做文档管理相关系统时,需要将网页上的文本输入框(textarea或input)中的内容,上传到ORACLE数据库的CLOB字段中去。在网上找了好长时间,总算有所收获,现将方法总结如下,其中部分代码为其它网友的源码:一、...
  • 一是运用excel工具中通过ODBC连接oracle数据库,将文本导出。 一是通过oracle的命令导出。基本上想运用各种第三方工具之类的。如:PL/sql developer 先查询再将结果为excel或者Copy进excel中。 先来说说第一个...
  • 正当觉得前方有那么一点光亮的时候,问题又出现了…没有觉得这个方法太危险了吗,恩恩,是啊,很危险…而且,人家经理要求上传的时候两个表,一个存图片,另一个存文本内容,而且两个之间有外键关联,我的天。...
  • oracle+jsp中blob类型存储大文本问题解决方法oracle 存储大文本一直是一个棘手的问题。一、数据库://定义变量java.sql.Connection conn; //数据库连接对象String sql;long id;ResultSet rs;Statement stmt,stmt1;...
  • 前几天项目中有个到处文件的功能,但是有一个字段进的数据存在换行情况,导出来的数据会出现错乱的情况,所以需要把换行的数据转换成一行。当然也可以在java程序中实现。 数据库中的数据为: SQL> SELECT A...
  • 背景:项目上线前,需要整理数据库脚本,不让用dmp文件,只能是SQL,但是有超大文本,CLOB,BLOB之类的,导不出来sql,plsql不支持...但是如果超大文本,超过4000行,比如某个字段的是JS代码(眼泪。。。) 百度了...
  • oracle导出表内数据为txt文本

    千次阅读 2014-02-18 09:48:25
    一、 1: 在pl/sql dev里面把这个表的内容SELECT出来; 2:拷贝,复制到EXCEL中 3:把EXCEL文件另存为 .CSV文件 4:用记事本把.CSV文件打开! 二、 set linesize 1000 ...set termout off
  • ORACLE中可以使用LONG类型保存大文本,但是操作LONG类型的数据和一般的数据类型不同,下面就举例说明如何将数据保存到LONG类型的字段中. 保存数据到LONG类型的字段中,下面将使用一个表进行测试,该表的创建语句如下:...
  • 今天遇到一个问题,做一个接口返回oracle数据库表中的数据,但是某个字段含有html标签,显示的时候会把这些标签显示出来影响效果,就想到用oracle正则把这些标签去除掉 sql语句如下 --正则验证去除html元素 select ...
  • 首先是oracle: clob类型,但对于这个类型处理起来还是比较麻烦的,varchar2长度为4000bytes,如果varchar2能满足楼主的需求,建议使用varchar2; 然后是mysql: ①、TEXT TEXT有4有类型: 1、TINYTEXT 256bytes 2、...
  • clob 4G 字符大类型 小说 blob 4G 二进制大类型 图片。视频
  • varchar2字段最多存储4000个字节,如果需要存储更长的字节,...现在通过C#将长字节进去。 1、首先保存引用了用于连接Oracle数据库的DLL 2、数据库连接 private string GoOracle_Do(string SQLstring) {...
  • Linux主机sqlldr工具数据导入oracle数据库(受限空间,只拿几十条数据测试) 数据来源:世界银行共享的样本 http://www.ibm.com/developerworks/cn/data/library/bd-hivetool/ 参考: ... ORACLE-S
  • 初识Oracle-关于Oracle

    2020-04-05 16:11:40
    初识OracleOracle基础一、Oracle简介二、主流数据库三、Oracle 数据库学习内容四、Oracle 数据库的版本五、Oracle 中的一些概念1、Oracle数据库2、Oracle实例六、搭建Oracle环境(安装与配置)1、系统需求2、Oracle...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,890
精华内容 8,356
关键字:

oracle存文本