我們正在使用 Oracle 功能有限的軟體。我需要通過確保它具有特定值來過濾 CLOB 欄位。通常,在此軟體之外,我會執行以下操作:
DBMS_LOB.SUBSTR(t.new_value) = 'Y'
但是,這不受支持,因此我嘗試使用它CAST。我嘗試了許多不同的嘗試,但到目前為止,我發現的是:
該軟體有一個內置的查詢檢查器/驗證器,這些是它顯示為無效的:
DBMS_LOB.SUBSTR(t.new_value)
CAST(t.new_value AS VARCHAR2(10))
CAST(t.new_value AS NVARCHAR2(10))
但是,驗證器確實接受這些:
CAST(t.new_value AS VARCHAR(10))
CAST(t.new_value AS NVARCHAR(10))
CAST(t.new_value AS CHAR(10))
不幸的是,即使驗證器允許這些通過,但在運行查詢以獲取資料時,我ORA-22835: Buffer too small在使用VARCHARor時得到了NVARCHAR。我ORA-25137: Data value out of range在使用CHAR.
在過濾資料時,還有其他方法可以嘗試檢查我的 CLOB 欄位是否具有特定值?如果沒有,我該如何解決我當前的問題?
uj5u.com熱心網友回復:
你得到的錯誤表明,甲骨文正試圖以應用CAST(t.new_value AS VARCHAR(10))到行,其中new_value有超過10個字符。鑒于您的描述new_value是一個通用審計欄位,它具有來自具有各種資料長度的大量不同表的值,這是有道理的。鑒于此,您需要以某種方式構造查詢,強制優化器將您應用的行集cast減少到new_value在應用cast.
不知道您使用的軟體為構建代碼提供了什么樣的范圍,我不確定您在那里有哪些選擇。請注意,根據您需要的穩健程度,優化器具有相當大的靈活性,可以選擇以任意順序在投影上應用謂詞和函式。因此,即使您發現一種方法一次有效,但將來當統計資料發生變化或資料庫升級并且 Oracle 決定選擇不同的計劃時,它也可能停止作業。
uj5u.com熱心網友回復:
使用它作為樣本資料
create table tab1(col clob);
insert into tab1(col) values (rpad('x',3000,'y'));
您需要使用dbms_lob.substr(col,1)來獲取第一個字符(從默認值offset= 1)
select dbms_lob.substr(col,1) from tab1;
DBMS_LOB.SUBSTR(COL,1)
----------------------
x
請注意,子字串的默認值amount(= 長度)是32767so using onlyDBMS_LOB.SUBSTR(COL) 將回傳比您預期的更多。
CAST對于CLOB不不 切串到鑄造長度,但(如你觀察)回傳例外ORA-25137: Data value out of range ,如果原始字串是longert的鑄造長度。
正如CAST宣告中記錄的那樣
CAST 不直接支持任何 LOB 資料型別。當您使用 CAST 將 CLOB 值轉換為字符資料型別或將 BLOB 值轉換為 RAW 資料型別時,資料庫將 LOB 值隱式轉換為字符或原始資料,然后將結果值顯式轉換為目標資料型別。如果結果值大于目標型別,則資料庫回傳錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368567.html
