oracleclobsql
① oracle clob欄位插入問題
在oracle中,有4個大對象(lobs)類型可用,分別是blob,clob,bfile,nclob。
  下面是對lob數據類型的簡單介紹。
   blob:二進制lob,為二進制數據,最長可達4GB,存貯在資料庫中。
   clob:字元lob,字元數據,最長可以達到4GB,存貯在資料庫中。
bfile:二進制文件;存貯在資料庫之外的只讀型二進制數據,最大長度由操作系統限制。
   nclob:支持對位元組字元集合(nultibyte characterset)的一個clob列。
  對於如何檢索和操作這些lob數據一直是oracle資料庫開發者經常碰到的問題。下面我將在oracle對lob數據處理的一些方法和技巧,介紹給讀者,希望能夠對讀者以後的開發有所幫助。
  
  oracle中可以用多種方法來檢索或操作lob數據。通常的處理方法是通過dbms_lob包。
  其他的方法包括使用api(application programminginterfaces)應用程序介面和oci(oracle call interface)oracle調用介面程序。
  一、在oracle開發環境中我們可以用dbms_lob包來處理!dbms_lob包功能強大,簡單應用。既可以用來讀取內部的lob對象,也可以用來處理bfile對象。但處理兩者之間,還有一點差別。處理內部lob對象(blob,clob)時,可以進行讀和寫,但處理外部lob對象bfile時,只能進行讀操作,寫的操作可以用pl/sql處理。另外用sql也可以處理lob,但要注意sql僅可以處理整個lob,不能操作lob的數據片。
  
  在dbms_lob包中內建了read(),append,write(),erase(),(),getlength(),substr()等函數,可以很方便地操作lob對象。這里不做深入討論,讀者可以參看相關的書籍。
  
  對於pl/sql,下面介紹一種技巧,用動態的pl/sql語句處理clob對象來傳替表名!
  example 1.
  動態PL/SQL,對CLOB欄位操作可傳遞表名table_name,表的唯一標志欄位名field_id,clob欄位名field_name記錄號v_id,開始處理字元的位置v_pos,傳入的字元串變數v_clob
  
  修改CLOB的PL/SQL過程:updateclob
  create or replace procere 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;
  l /用法說明:
  在插入或修改以前,先把其它欄位插入或修改,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;
  l 用法說明:
  用select getclob(table_name,field_id,field_name,v_id,v_pos) as
  partstr from al;
  可以從CLOB欄位中取2000個字元到partstr中,
  編一個循環可以把partstr組合成dbms_lob.getlength(field_name)長度的目標字元串。
  二、對於在其他不同的開發環境,例如vc,vb,pb,java等環境下對lob的處理,處理方法不盡相同,在這里將簡要舉幾個例子來說明不在oracle開發環境下對lob的處理。
  
  (一) 在pb中的處理
  exampler 2.
  string ls_path,ls_filename,ls_jhdh
  long ll_num,ll_count,rtn
  blob ole_blob
  ll_num=dw_lb.getrow()
  if ll_num>0 then ls_jhdh=dw_lb.object.ct_njhdh[ll_num]
  select count(*) into :ll_count from sj_jh_jhfjb where
  ct_jhdlxbh='1' and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;
  if ll_count>0 then
  rtn=messagebox("提示","是否要修改此附件",question!,yesno!,1)
  if rtn=1 then
  SELECTBLOB ct_jhfjnr INTO le_blob from sj_jh_jhfjb where
  ct_jhdlxbh='1' and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;
  ole_1.objectdata =ole_blob
  If ole_1.activate(offsite!) <> 0 Then
  Messagebox("OLE Activate","不能激活")
  Return -1
  end If
  end if
  else
  messagebox("提示","沒有附件")
  end if
  end if
  (二)在vb中的處理
  在vb中處理大對象,一般可以用OO4O(oracle objects for
  ole)來處理大對象。這里介紹一種不用0040處理大對象blob的方法。
  下面這段程序可以將一個文件(文本文件,doc文件,圖象文件等)保存到資料庫中,並可以將其從資料庫讀出
  需要兩個commandbutton
  cmd1 名稱 cmdsave caption 保存
  cmd2 名稱 cmdread caption 讀取
  一個cmddialog控制項
  同時需要創建一張表t_demo(欄位id 類型 number,;欄位text 類型 blob;)
  exmple 3.
  Option Explicit
  Dim rn As ADODB.Connection
  Public Function CreateDataSource(DataSource As String, UserID
  As String, Password As String) As Boolean
  On Error GoTo DbConErr:
  Set rn = New ADODB.Connection
  With rn
  .ConnectionString = "Provider=OraOledb.Oracle.1;" & _
  "password=" & Password & ";" & _
  "User ID =" & UserID & ";" & _
  "Data Source=" & DataSource & ";" & _
  "Locale Identifier=2052"
  .Open
  End With
  CreateDataSource = True
  Exit Function
  DbConErr:
  CreateDataSource = False
  End Function
  
  Private Sub cmdRead_Click()
  Dim rs As New ADODB.Recordset
  rs.ActiveConnection = rn
  rs.LockType = adLockOptimistic
  rs.CursorLocation = adUseClient
  rs.Source = "select * from t_demo"
  rs.Open
  ComDlgDir.DialogTitle = "保存文件"
  ComDlgDir.Filter = "*.*"
  ComDlgDir.ShowSave
  Call BlobToFile(rs.Fields("text"), ComDlgDir.filename)
  Set rs = Nothing
  Exit Sub
  Set rs = Nothing
  End Sub
  
  Private Sub cmdsave_Click()
  Dim rs As New ADODB.Recordset
  rs.ActiveConnection = rn
  rs.LockType = adLockOptimistic
  rs.CursorLocation = adUseClient
  rs.Source = "select * from t_demo"
  rs.Open
  rs.AddNew
  ComDlgDir.DialogTitle = "選取文件"
  ComDlgDir.ShowOpen
  rs.Fields("id").Value = 1
  If ComDlgDir.filename <> "" Then
  Call FileToBlob(rs.Fields("text"), ComDlgDir.filename)
  rs.Update
  End If
  Set rs = Nothing
  Exit Sub
  Set rs = Nothing
  End Sub
  
  Private Sub Form_Load()
  If Not CreateDataSource("sid", "systemp", "manager") Then
  MsgBox "Connection failure!"
  End If
  End Sub
  
  fld As ADODB.Field, filename As String, Optional ChunkSize As
  Long = 8192)
  Dim fnum As Integer, bytesleft As Long, bytes As Long
  Dim tmp() As Byte
  If (fld.Attributes And adFldLong) = 0 Then
  Err.Raise 1001, , "field doesn't support the GetChunk method."
  
  End If
  If Dir$(filename) = "" Then Err.Raise 53, , "File not found"
  fnum = FreeFile
  Open filename For Binary As fnum
  bytesleft = LOF(fnum)
  Do While bytesleft
  bytes = bytesleft
  If bytes > ChunkSize Then bytes = ChunkSize
  ReDim tmp(1 To bytes) As Byte
  Get fnum, , tmp
  fld.AppendChunk tmp
  bytesleft = bytesleft - bytes
  Loop
  Close #fnum
  End Sub
  
  Sub BlobToFile(fld As ADODB.Field, filename A
② oracle如何導出具有clob欄位類型的sql
我擦,clob類型也只不過是個類型而已。搞那麼復雜做啥。和普通欄位一樣查詢就行了:select
t.那個clob的欄位名
from
表名
t科普一下:oracle有clob和blobl兩種大對象類型的數據類型。clob是存字元的(可以認為是超大容量的varchar類型,最大存儲4G)。blob是存二進制的。要注意的是帶有clob、blob類型的表時不能導出sql文件,sql文件只能導出小對象類型。
③ oracle sql怎麼修改clob類型里的內容
修改全部內容還是部分內容。
全部修改的話,就當作nvarchar欄位修改了。
普通的update語句就可以了。
部分內容修改的話,可以用
update
表
set
欄位=regexp_replace(欄位,'修改目標內容','查找正則表達式')
where
條件
這個有一個不好的地方,就是全部替換,否則,就要把這個函數的參數,正則表達式寫的完美一點。
④ 如何從ORACLE中讀取CLOB類型的數據
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。
    iBATIS一詞來源於「internet」和「abatis」的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)
2、CLOB
    SQL CLOB 是內置類型,它將字元大對象 (Character Large Object) 存儲為資料庫表某一行中的一個列值。默認情況下,驅動程序使用 SQL locator(CLOB) 實現 Clob 對象,這意味著 CLOB 對象包含一個指向 SQL CLOB 數據的邏輯指針而不是數據本身。Clob 對象在它被創建的事務處理期間有效。
3、MyBatis對CLOB類型數據實現增刪改查
oracle表結構
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   
create table T_USERS  
(  
  ID      NUMBER not null,  
  NAME    VARCHAR2(30),  
  SEX     VARCHAR2(3),  
  BIRS    DATE,  
  MESSAGE CLOB  
)  
create sequence SEQ_T_USERS_ID  
minvalue 1  
maxvalue 99999999  
start with 1  
increment by 1  
cache 20;
配置mybatis配置文件UsersMapper.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
   
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN">
 
<mapper namespace="examples.mapper.UsersMapper" >
 
    <!-- Result Map-->
    <resultMap type="examples.bean.Users" id="BaseResultMap">
        <result property="id" column="id" />
        <result property="name" column="name" />
        <result property="sex" column="sex" />
        <result property="birs" column="birs" jdbcType="TIMESTAMP"/>
        <result property="message" column="message" jdbcType="CLOB" 
            javaType = "java.lang.String"  typeHandler ="examples.service.OracleClobTypeHandler"/>
    </resultMap>
     
    <sql id="Tabel_Name">
        t_users
    </sql>
     
    <!-- 表中所有列 -->
    <sql id="Base_Column_List" >
        id,name,sex,birs,message
    </sql>
 
    <!-- 查詢條件 -->
    <sql id="Example_Where_Clause">
        where 1=1
        <trim suffixOverrides=",">
            <if test="id != null">
                and id = #{id}
            </if>
            <if test="name != null and name != ''">
                and name like concat(concat('%', '${name}'), '%')
            </if>
            <if test="sex != null and sex != ''">
                and sex like concat(concat('%', '${sex}'), '%')
            </if>
            <if test="birs != null">
                and birs = #{birs}
            </if>
            <if test="message != null">
                and message = #{message}
            </if>
        </trim>
    </sql>
     
    <!-- 2.查詢列表 -->
    <select id="queryByList" resultMap="BaseResultMap" parameterType="Object">
        select
        <include refid="Base_Column_List" />
        from t_users 
        <include refid="Example_Where_Clause"/>
    </select>
</mapper>
Mapper類介面
1
2
3
4
5
6
7
8
9
10
11
   
package examples.mapper;
 
import java.util.List;
 
public interface UsersMapper<T> {
     
    public List<T> queryBySelective(T t);
 
    public List<T> queryByList(T t);
     
}
類型轉換工具類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
   
package examples.service;
 
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import oracle.sql.CLOB;
 
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
 
public class OracleClobTypeHandler implements TypeHandler<Object> {
     
    public Object valueOf(String param) {
        return null;
    }
 
    @Override
    public Object getResult(ResultSet arg0, String arg1) throws SQLException {
        CLOB clob = (CLOB) arg0.getClob(arg1);
        return (clob == null || clob.length() == 0) ? null : clob.getSubString((long) 1, (int) clob.length());
    }
 
    @Override
    public Object getResult(ResultSet arg0, int arg1) throws SQLException {
        return null;
    }
 
    @Override
    public Object getResult(CallableStatement arg0, int arg1) throws SQLException {
        return null;
    }
 
    @Override
    public void setParameter(PreparedStatement arg0, int arg1, Object arg2, JdbcType arg3) throws SQLException {
        CLOB clob = CLOB.empty_lob();
        clob.setString(1, (String) arg2);
        arg0.setClob(arg1, clob);
    }
}
Spring配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
   
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="
 
    xmlns:xsi="
 
    xmlns:mvc="
    xmlns:tx="
    xsi:schemaLocation="
    default-autowire="byType">
 
    <!-- 配置數據源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
         <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property> 
         <property name="url"><value>jdbc:oracle:thin:@127.0.0.1:1521:pms</value></property> 
         <property name="username"><value>pms</value></property> 
         <property name="password"><value>pms</value></property>
    </bean>
 
    <!-- 配完數據源 和 擁有的 sql映射文件 sqlSessionFactory 也可以訪問資料庫 和擁有 sql操作能力了 -->
<!-- 
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
          <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations">
            <list>
                <value>classpath:examples/mybatis/oracle/UsersMapper.xml</value>
            </list>
        </property>
    </bean>
 
    <!-- 通過設置 mapperInterface屬性,使介面服務bean 和對應xml文件管理 可以使用其中的sql -->
    <bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <!-- 此處等同於 Mybatis 中 ServerDao serverDao = sqlSession.getMapper(ServerDao.class); 指明映射關系 -->
        <property name="mapperInterface" value="examples.mapper.UsersMapper" />
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
</beans>
測試類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   
package examples.service;
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.;
 
import examples.bean.Users;
import examples.mapper.UsersMapper;
 
public class TestUsersService {
 
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws ParseException {
            ApplicationContext ac = 
            new ("classpath:/examples/service/spring.xml");
            UsersMapper<Users>  = (UsersMapper<Users>)ac.getBean("");
             
            //查詢
             Users nullBean = new Users();
            List<Users> list = .queryByList(nullBean);
            if(list != null) {
                for(Users user : list) {
                    System.out.println(user);
                }
            }
             
    }
 
}
⑤ oracle把一列該成clob欄位的sql語句怎麼寫
oracle不可以將欄位類型修改為:object、REF、nested table、VARRAY、 CLOB、BLOB。
解決方案也很簡單就是像學數據結構時經常用到的兩變數(a,b)交換值的方法,c = a, a = b, b = c。當然我們這里可以簡單處理,具體方法如下:
1、將欄位a改名為_a
2、新建一個欄位a,用正確的類型
3、將_a欄位中的數據經一定轉換(一般要做轉換的,因為類型變了)後插入了a欄位中
4、刪除_a欄位
如果表中或該欄位中還沒有數據,那就更簡單了,把那個欄位刪除再以正確的數據類型新建一個即可。
⑥ 如何通過sql的insert語句插入大量字元串到oracle的clob欄位
當通過insert語句直接插入大量字元串(主要是html的內容),超過4000字元時候,就會報: ORA-01489: 字元串連接的結果過長 雖然欄位是clob,足以存儲,但是通過這種直接插入的時候,因為沒有強制指定帶插入字元串為clob類型, oracle會把插入的字元串作為 「字元串類型」處理,由於oracle有最大字元串限制(不超過4000個字元),所以會報錯。 解決思路:指定待插入字元串類型為clob,可以使用過程或存儲過程 例子: DECLARE REALLYBIGTEXTSTRING CLOB := '待插入的海量字元串'; BEGIN INSERT INTO test_table VALUES('test', REALLYBIGTEXTSTRING, '0'); end ; / 中國mit; 這樣就可以解決問題。 補充:java的jdk對這種情景有通過l流的方式處理,因此比較方便。 另外:插入html內容,可能含有空格 ,字元&是oracle的關鍵字,因此插入之前要轉義 如:'||chr(38)||'nbsp
⑦ oracle的sql怎麼寫入clob
建一個CLOB類型變數再進行insert就好
⑧ oracle.jdbc.OracleClob與oracle.sql.CLOB的區別
oracle 的欄位類型和 Java的對應數據類型而已。
⑨ Oracle資料庫中把SQL存在CLOB欄位中 ,現需對其定時執行,通過存儲過程對其執行報錯
CLOB這個類型就是使用CHAR來保存數據的,把nvarchar類型數據插入到oracle對應的CLOB類型中只要加個to_char()轉換下就可以了
⑩ 怎麼用SQL語句往oracle clob類型里存入大於4000的字元串
SQL語句中的字元串不能超過4000位元組,這是沒辦法改變的。處理超過4000自己的字元串只能用綁定變數,比如insert
into
mytable(mycolumn)
values
(:1);在執行的時候變數:1可以綁定超過4000位元組的串。
