婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Oracle的CLOB大數據字段類型操作方法

Oracle的CLOB大數據字段類型操作方法

熱門標簽:上海網絡外呼系統 百度地圖標注飯店位置怎么 理財產品電銷機器人 南通電銷外呼系統哪家強 百度地圖標注注解 地圖標注的坐標點 區域地圖標注怎么設置 外呼系統好點子 電話機器人那種好

一、Oracle中的varchar2類型

我們在Oracle數據庫存儲的字符數據一般是用VARCHAR2。VARCHAR2既分PL/SQL Data Types中的變量類型,也分Oracle Database中的字段類型,不同場景的最大長度不同。

在Oracle Database中,VARCHAR2 字段類型,最大值為4000;PL/SQL中 VARCHAR2 變量類型,最大字節長度為32767。

當 VARCHAR2 容納不下我們需要存儲的信息時,就出來的Oracle的大數據類型LOB( Large Object,大型對象)。

二、Oarcle中的LOB類型

在Oracle中,LOB(Large Object,大型對象)類型的字段現在用得越來越多了。因為這種類型的字段,容量大(最多能容納4GB的數據),且一個表中可以有多個這種類型的字段,很靈活,適用于數據量非常大的業務領域(如圖象、檔案等)。

LOB類型分為BLOB和CLOB兩種:BLOB即二進制大型對象(Binary Large Object),適用于存貯非文本的字節流數據(如程序、圖象、影音等)。

而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 方法總結

 dbms_lob.createtemporary(V_SQL,true);   --創建一個臨時clob,用來存儲拼接的sql
 dbms_lob.write(v_SQL,'寫入信息');     --寫入操作
 dbms_lob.append(v_SQL,',');        --拼接clob
 dbms_lob.substr(v_SQL);          --截取clob,不傳參數就是全部讀取
 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類型一樣處理即可。

總結

以上所述是小編給大家介紹的Oracle的CLOB大數據字段類型操作方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

您可能感興趣的文章:
  • 關于oracle中clob字段查詢慢的問題及解決方法
  • PHP處理Oracle的CLOB實例
  • 向Oracle數據庫的CLOB屬性插入數據報字符串過長錯誤
  • 解析jdbc處理oracle的clob字段的詳解
  • oracle數據庫中如何處理clob字段方法介紹
  • Oracle 插入超4000字節的CLOB字段的處理方法
  • 詳解Oracle修改字段類型方法總結

標簽:紹興 寧波 百色 自貢 中衛 遼源 海東 昭通

巨人網絡通訊聲明:本文標題《Oracle的CLOB大數據字段類型操作方法》,本文關鍵詞  Oracle,的,CLOB,大,數據,字段,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Oracle的CLOB大數據字段類型操作方法》相關的同類信息!
  • 本頁收集關于Oracle的CLOB大數據字段類型操作方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日本一道本在线视频| 欧美日韩不卡一区二区| 99视频在线精品| 6080国产精品一区二区| 中文字幕日韩一区| 免费高清成人在线| 欧美三级视频在线| 一区二区在线看| 色综合天天性综合| 亚洲一级二级在线| 99视频有精品| 亚洲精品免费电影| 欧美日韩国产综合视频在线观看 | 久久久99精品免费观看| 久久精品国产免费| 国产性天天综合网| 9人人澡人人爽人人精品| 亚洲激情图片小说视频| 欧美日韩国产一级片| 天天综合网天天综合色| 精品毛片乱码1区2区3区| 国产精品一区二区久激情瑜伽| 国产精品人成在线观看免费| 色呦呦网站一区| 日韩**一区毛片| 久久日韩精品一区二区五区| 波多野结衣一区二区三区| 亚洲影视资源网| 精品国产免费一区二区三区香蕉| 国产在线精品一区二区三区不卡| 中文字幕一区二区三区四区| 欧美精品久久天天躁| 国产精品亚洲人在线观看| 亚洲乱码日产精品bd| 欧美本精品男人aⅴ天堂| 懂色av噜噜一区二区三区av| 日韩国产精品久久久| 一色屋精品亚洲香蕉网站| 在线视频欧美区| 国产成人午夜精品5599| 亚洲国产视频a| 国产精品污网站| 欧美一区二区三区在线看| 97久久精品人人爽人人爽蜜臀| 久久国产精品免费| 亚洲444eee在线观看| 欧美大度的电影原声| 天天av天天翘天天综合网| 国产一区不卡在线| 亚洲国产精品久久艾草纯爱| 日韩三级伦理片妻子的秘密按摩| 日韩在线卡一卡二| 久久精品视频一区| 欧美一级欧美三级在线观看| 国产美女精品在线| 亚洲色欲色欲www| 欧美日韩国产片| 日韩午夜电影在线观看| 亚洲成人你懂的| 日韩女优毛片在线| 欧美色欧美亚洲另类二区| 国产99久久久国产精品免费看| 一区二区三区国产精华| 久久精品视频在线免费观看| 91精品国产综合久久福利软件| 91美女在线视频| 99久久综合99久久综合网站| 久久久噜噜噜久噜久久综合| 7878成人国产在线观看| 不卡的av在线| 亚洲成av人片| 午夜电影网一区| 一区二区三区四区国产精品| 亚洲欧美日韩在线播放| 亚洲精品日韩一| 亚洲第一福利一区| 日本亚洲视频在线| 蜜桃av一区二区在线观看| 精品一区免费av| 国产成人av一区二区三区在线 | 久久99精品国产.久久久久久| 亚洲大片免费看| 亚洲色图第一区| 亚洲欧美在线观看| 综合精品久久久| 亚洲欧美一区二区不卡| 一区二区三区在线播放| 亚洲人成网站精品片在线观看| 亚洲精品成人悠悠色影视| 精品福利一区二区三区 | 欧美日韩一区中文字幕| 欧美亚洲国产一卡| 欧美日韩一区二区三区在线| 欧美美女视频在线观看| 欧美二区在线观看| 国产夜色精品一区二区av| 欧美精品一区二区三区在线播放| 91精品国产手机| 久久亚洲精华国产精华液| 日韩一区二区三免费高清| 久久综合久久综合九色| 欧美高清在线视频| 综合自拍亚洲综合图不卡区| 亚洲午夜久久久久久久久电影网 | 欧美日韩一卡二卡三卡| 欧美一二三区精品| 亚洲免费在线视频一区 二区| 日韩黄色在线观看| 99久久精品99国产精品| 日韩精品一区二区三区视频播放| 国产精品美日韩| 五月天亚洲精品| 91色视频在线| 久久午夜电影网| 日韩国产精品大片| 色欧美88888久久久久久影院| 久久这里只有精品6| 日韩av不卡在线观看| 在线区一区二视频| 国产精品人成在线观看免费| 国产资源在线一区| 日韩欧美精品在线| 天天色综合天天| jizz一区二区| 久久精品免费在线观看| 天天色天天爱天天射综合| 色婷婷av一区二区| 日本一区二区三区国色天香| 免费成人深夜小野草| 成人黄色免费短视频| 日韩你懂的电影在线观看| 亚洲日本欧美天堂| 国产精品香蕉一区二区三区| 精品电影一区二区| 一级精品视频在线观看宜春院| 久久国产精品区| 在线播放国产精品二区一二区四区 | 久久久久国产免费免费| 美日韩黄色大片| 日韩一区二区在线看| 久久精品99国产国产精| 欧美α欧美αv大片| 精品亚洲aⅴ乱码一区二区三区| 91精品国产综合久久精品性色| 亚洲综合色视频| 色悠久久久久综合欧美99| 一二三区精品福利视频| 欧美性猛交xxxx黑人交| 亚洲精品成人a在线观看| www.亚洲精品| 中文字幕佐山爱一区二区免费| 国产精品小仙女| 中文字幕综合网| 欧美性色黄大片手机版| 综合久久综合久久| 91免费看片在线观看| 亚洲国产综合色| 在线播放国产精品二区一二区四区| 亚洲精品久久嫩草网站秘色| 一本大道久久a久久精品综合| 久久青草国产手机看片福利盒子| 国产精品88av| 亚洲精品水蜜桃| 日韩精品在线网站| 国产91丝袜在线播放九色| 亚洲日本电影在线| 欧美一区三区二区| 国产精品亚洲а∨天堂免在线| 亚洲精品视频在线观看网站| 日韩午夜激情视频| 99久久久免费精品国产一区二区| 夜色激情一区二区| 精品国产乱码久久久久久1区2区 | 久久免费美女视频| 成人av免费网站| 日韩国产高清影视| 亚洲欧美在线aaa| 日韩精品一区二区三区四区视频| 成人免费高清在线| 亚洲成av人片在www色猫咪| 2021国产精品久久精品| 色94色欧美sute亚洲线路二| 精品写真视频在线观看| 一区二区三区不卡在线观看| 久久蜜桃香蕉精品一区二区三区| 在线欧美一区二区| 粉嫩欧美一区二区三区高清影视| 无吗不卡中文字幕| 亚洲视频一二三| 国产欧美一区二区三区在线老狼| 欧美怡红院视频| 成人视屏免费看| 青娱乐精品在线视频| 亚洲色图在线播放| 日本一区二区免费在线 | 欧美精品九九99久久| 91麻豆高清视频| 成人黄色国产精品网站大全在线免费观看| 亚洲午夜激情网站| 亚洲日本在线观看|