語(yǔ)法:select * from TABLE表 where\x0d\x0adbms_lob.instr(字段名(clod類型),'查詢條件',1,1) 0\x0d\x0a\x0d\x0acreate table products(\x0d\x0aproductid number(10) not null,\x0d\x0aname varchar2(255),\x0d\x0adescription CLOB);\x0d\x0a\x0d\x0a查詢語(yǔ)句:\x0d\x0a\x0d\x0aselect t.productid, t.name from products t\x0d\x0a\x0d\x0awhere dbms_lob.instr(t.description, 'aaa', 1, 1) 0;\x0d\x0a\x0d\x0a在Oracle中,可以使用instr函數(shù)對(duì)某個(gè)字符串進(jìn)行判斷,判斷其是否含有指定的字符。其語(yǔ)法為:\x0d\x0ainstr(sourceString,destString,start,appearPosition).\x0d\x0a其中sourceString代表源字符串;destString代表想聰源字符串中查找的子串;start代表查找的開(kāi)始位置,該參數(shù)可選的,默認(rèn)為\x0d\x0a1;appearPosition代表想從源字符中查找出第幾次出現(xiàn)的destString,該參數(shù)也是可選的,默認(rèn)為1;如果start的值為負(fù)數(shù),那\x0d\x0a么代表從右往左進(jìn)行查找。\x0d\x0a返回值為:查找到的字符串的位置。
創(chuàng)新互聯(lián)秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營(yíng)銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì),小程序制作,網(wǎng)頁(yè)設(shè)計(jì)制作,手機(jī)網(wǎng)站制作,成都營(yíng)銷網(wǎng)站建設(shè)幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級(jí)專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對(duì)客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長(zhǎng)。
在Oracle中,可以使用instr函數(shù)對(duì)某個(gè)字符串進(jìn)行判斷,判斷其是否含有指定的字符。其語(yǔ)法為:
eg: dbms_lob.instr(字段名(clod類型),'查詢條件',1,1)
其中sourceString代表想要查詢的字段;
destString代表查詢條件;
start代表查找的開(kāi)始位置,該參數(shù)可選的,默認(rèn)為1;
appearPosition代表想從源字符中查找出第幾次出現(xiàn)的destString,該參數(shù)也是可選的,默認(rèn)為1;
如果start的值為負(fù)數(shù),那么代表從右往左進(jìn)行查找。
返回值為:當(dāng)目標(biāo)字符串沒(méi)有在源字符串中找到,返回0;當(dāng)源字符串或目標(biāo)字符串為null,則返回null;
其他情況則返回目標(biāo)字符串在源字符串中的其實(shí)位置
在oracle中 有 個(gè)大對(duì)象(lobs)類型可用 分別是blob clob bfile nclob 下面是對(duì)lob數(shù)據(jù)類型的簡(jiǎn)單介紹 blob:二進(jìn)制lob 為二進(jìn)制數(shù)據(jù) 最長(zhǎng)可達(dá) GB 存貯在數(shù)據(jù)庫(kù)中 clob:字符lob 字符數(shù)據(jù) 最長(zhǎng)可以達(dá)到 GB 存貯在數(shù)據(jù)庫(kù)中 bfile:二進(jìn)制文件;存貯在數(shù)據(jù)庫(kù)之外的只讀型二進(jìn)制數(shù)據(jù) 最大長(zhǎng)度由操作系統(tǒng)限制 nclob 支持對(duì)字節(jié)字符集合(nultibyte characterset)的一個(gè)clob列 對(duì)于如何檢索和操作這些lob數(shù)據(jù)一直是oracle數(shù)據(jù)庫(kù)開(kāi)發(fā)者經(jīng)常碰到的問(wèn)題 下面我將在oracle對(duì)lob數(shù)據(jù)處理的一些方法和技巧 介紹給讀者 希望能夠?qū)ψx者以后的開(kāi)發(fā)有所幫助 oracle中可以用多種方法來(lái)檢索或操作lob數(shù)據(jù) 通常的處理方法是通過(guò)dbms_lob包 其他的方法包括使用api(application programming interfaces)應(yīng)用程序接口和oci(oracle call interface)oracle調(diào)用接口程序 一 在oracle開(kāi)發(fā)環(huán)境中我們可以用dbms_lob包來(lái)處理! dbms_lob包功能強(qiáng)大 簡(jiǎn)單應(yīng)用 既可以用來(lái)讀取內(nèi)部的lob對(duì)象 也可以用來(lái)處理bfile對(duì)象 但處理兩者之間 還有一點(diǎn)差別 處理內(nèi)部lob對(duì)象(blob clob)時(shí) 可以進(jìn)行讀和寫(xiě) 但處理外部lob對(duì)象bfile時(shí) 只能進(jìn)行讀操作 寫(xiě)的操作可以用pl/sql處理 另外用sql也可以處理lob 但要注意sql僅可以處理整個(gè)lob 不能操作lob的數(shù)據(jù)片 在dbms_lob包中內(nèi)建了read() append write() erase() copy() getlength() substr()等函數(shù) 可以很方便地操作lob對(duì)象 這里不做深入討論 讀者可以參看相關(guān)的書(shū)籍 對(duì)于pl/sql 下面介紹一種技巧 用動(dòng)態(tài)的pl/sql語(yǔ)句處理clob對(duì)象來(lái)傳替表名!example 動(dòng)態(tài)PL/SQL 對(duì)CLOB字段操作可傳遞表名table_name 表的唯一標(biāo)志字段名field_id clob字段名field_name記錄號(hào)v_id 開(kāi)始處理字符的位置v_pos 傳入的字符串變量v_clob修改CLOB的PL/SQL過(guò)程 updateclobcreate or replace procedure updateclob(table_name in varchar field_id in varchar field_name in varchar v_id in number v_pos in number v_clob in varchar )islobloc clob;c_clob varchar ( );amt binary_integer;pos binary_integer;query_str varchar ( );beginpos:=v_pos* + ;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 updatedEXECUTE IMMEDIATE query_str INTO lobloc USING v_id; from pos position write varchar into loblocdbms_lob write(lobloc amt pos c_clob);mit;exceptionwhen others thenrollback;end;l /用法說(shuō)明 在插入或修改以前 先把其它字段插入或修改 CLOB字段設(shè)置為空empty_clob() 然后調(diào)用以上的過(guò)程插入大于 到 個(gè)字符 如果需要插入大于 個(gè)字符 編一個(gè)循環(huán)即可解決問(wèn)題 查詢CLOB的PL/SQL函數(shù) getclobcreate or replace function getclob(table_name in varchar field_id in varchar field_name in varchar v_id in number v_pos in number) return varchar islobloc clob;buffer varchar ( );amount number := ;offset number := ;query_str varchar ( );beginquery_str := select ||field_name|| from ||table_name|| where ||field_id|| = :id ; initialize buffer with data to be foundEXECUTE IMMEDIATE query_str INTO lobloc USING v_id;offset:=offset+(v_pos )* ; read varchar from the bufferdbms_lob read(lobloc amount offset buffer);return buffer;exceptionwhen no_data_found thenreturn buffer;end;l 用法說(shuō)明 用select getclob(table_name field_id field_name v_id v_pos) as partstr from dual;可以從CLOB字段中取 個(gè)字符到partstr中 編一個(gè)循環(huán)可以把partstr組合成dbms_lob getlength(field_name)長(zhǎng)度的目標(biāo)字符串 二 對(duì)于在其他不同的開(kāi)發(fā)環(huán)境 例如vc vb pb java等環(huán)境下對(duì)lob的處理 處理方法不盡相同 在這里將簡(jiǎn)要舉幾個(gè)例子來(lái)說(shuō)明不在oracle開(kāi)發(fā)環(huán)境下對(duì)lob的處理 (一) 在pb中的處理exampler string ls_path ls_filename ls_jhdhlong ll_num ll_count rtnblob ole_blobll_num=dw_lb getrow()if ll_num then ls_jhdh=dw_lb object ct_njhdh[ll_num]select count(*) into :ll_count from sj_jh_jhfjb where ct_jhdlxbh= and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;if ll_count thenrtn=messagebox( 提示 是否要修改此附件 question! yesno! )if rtn= thenSELECTBLOB ct_jhfjnr INTO le_blob from sj_jh_jhfjb where ct_jhdlxbh= and ct_jhdh=:ls_jhdh and ct_jdlxbh=:is_jdlx;ole_ objectdata =ole_blobIf ole_ activate(offsite!) ThenMessagebox( OLE Activate 不能激活 )Return end Ifend ifelsemessagebox( 提示 沒(méi)有附件 )end ifend if(二)在vb中的處理在vb中處理大對(duì)象 一般可以用OO O(oracle objects for ole)來(lái)處理大對(duì)象 這里介紹一種不用 處理大對(duì)象blob的方法 下面這段程序可以將一個(gè)文件(文本文件 doc文件 圖象文件等)保存到數(shù)據(jù)庫(kù)中 并可以將其從數(shù)據(jù)庫(kù)讀出需要兩個(gè)mandbuttoncmd 名稱 cmdsave caption 保存cmd 名稱 cmdread caption 讀取一個(gè)cmddialog控件同時(shí)需要?jiǎng)?chuàng)建一張表t_demo(字段id 類型 number ;字段text 類型 blob;)exmple Option ExplicitDim rn As ADODB ConnectionPublic Function CreateDataSource(DataSource As String UserID As String Password As String) As BooleanOn Error GoTo DbConErr:Set rn = New ADODB ConnectionWith rn ConnectionString = Provider=OraOledb Oracle ; _ password= Password ; _ User ID = UserID ; _ Data Source= DataSource ; _ Locale Identifier= OpenEnd WithCreateDataSource = TrueExit FunctionDbConErr:CreateDataSource = FalseEnd FunctionPrivate Sub cmdRead_Click()Dim rs As New ADODB Recordsetrs ActiveConnection = rnrs LockType = adLockOptimisticrs CursorLocation = adUseClientrs Source = select * from t_demo rs OpenComDlgDir DialogTitle = 保存文件 ComDlgDir Filter = * * ComDlgDir ShowSaveCall BlobToFile(rs Fields( text ) ComDlgDir filename)Set rs = NothingExit SubSet rs = NothingEnd SubPrivate Sub cmdsave_Click()Dim rs As New ADODB Recordsetrs ActiveConnection = rnrs LockType = adLockOptimisticrs CursorLocation = adUseClientrs Source = select * from t_demo rs Openrs AddNewComDlgDir DialogTitle = 選取文件 ComDlgDir ShowOpenrs Fields( id ) Value = If ComDlgDir filename ThenCall FileToBlob(rs Fields( text ) ComDlgDir filename)rs UpdateEnd IfSet rs = NothingExit SubSet rs = NothingEnd SubPrivate Sub Form_Load()If Not CreateDataSource( sid systemp manager ) ThenMsgBox Connection failure! End IfEnd Subfld As ADODB Field filename As String Optional ChunkSize As Long = )Dim fnum As Integer bytesleft As Long bytes As LongDim tmp() As ByteIf (fld Attributes And adFldLong) = ThenErr Raise field doesn t support the GetChunk method End IfIf Dir$(filename) = Then Err Raise File not found fnum = FreeFileOpen filename For Binary As fnumbytesleft = LOF(fnum)Do While bytesleftbytes = bytesle lishixinzhi/Article/program/Oracle/201311/17733