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字节的串。
