當前位置:首頁 » 編程語言 » oracleclobsql

oracleclobsql

發布時間: 2022-07-26 02:23:25

① 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位元組的串。

熱點內容
oraclesqlnumber 發布:2025-01-27 12:04:22 瀏覽:849
如何看三才配置數理暗示力 發布:2025-01-27 12:04:15 瀏覽:811
我的世界離線2b2t的伺服器 發布:2025-01-27 11:51:25 瀏覽:144
網站被異常篡改訪問有風險 發布:2025-01-27 11:50:01 瀏覽:431
光遇國際服腳本全部圖 發布:2025-01-27 11:47:40 瀏覽:139
ios資源加密 發布:2025-01-27 11:36:33 瀏覽:816
c語言居右 發布:2025-01-27 11:36:32 瀏覽:609
b站緩存看不了 發布:2025-01-27 11:14:27 瀏覽:651
apache文件壓縮 發布:2025-01-27 11:08:30 瀏覽:471
ipad桌面文件夾 發布:2025-01-27 10:38:40 瀏覽:615