我有一個應用程式在 CLOB 中存盤文本塊的情況。
每個文本塊都被一個標簽 [SYSDATE] 包圍(測驗案例見下文)。
我正在尋找可以提取匹配標簽之間資料的查詢。例如,如何獲取所有匹配項的 [11-22-2021 14:16:19] 標簽之間的文本。在這種情況下'ZZZZZZZZZZZZZZZZZZZ'
其次,有沒有更好的方法來處理這種情況?也許也許使用 XML?所有的輸入、想法和作業示例將不勝感激。
ALTER SESSION SET NLS_DATE_FORMAT = 'MMDDYYYY HH24:MI:SS';
CREATE table t(
seq_num integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
c CLOB DEFAULT ' ',
create_date DATE DEFAULT SYSDATE
);
/
insert into t (c) values (' ')
/
CREATE OR REPLACE PROCEDURE lob_append(
p_clob IN OUT CLOB,
p_text IN VARCHAR2
)
AS
l_text varchar2(32760);
l_date_string VARCHAR2(50);
BEGIN
select '[' || TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') || ']'
into l_date_string from dual;
-- newline each time code is appended for clarity.
l_text :=chr(10) || l_date_string || chr(10)
|| p_text || chr(10)
|| l_date_string||chr(10);
dbms_lob.writeappend(p_clob, length(l_text), l_text );
END;
/
DECLARE
l_clob CLOB := empty_clob();
lTime date;
BEGIN
lTime := sysdate;
SELECT c INTO l_clob FROM t WHERE seq_num = 1 FOR UPDATE;
lob_append(l_clob, rpad('Z',20,'Z'));
loop
exit when sysdate = lTime interval '5' second;
end loop;
l_clob := empty_clob();
SELECT c INTO l_clob FROM t WHERE seq_num = 1 FOR UPDATE;
lob_append(l_clob, rpad('Y',10,'Y'));
END;
/
SEQ_NUM C CREATE_DATE
1
[11-22-2021 14:16:19]
ZZZZZZZZZZZZZZZZZZZZ
[11-22-2021 14:16:19]
[11-22-2021 14:16:24]
YYYYYYYYYY
[11-22-2021 14:16:24]
11222021 14:15:54
uj5u.com熱心網友回復:
您的示例 CLOB 包含換行符;我認為這是正確的,并明確處理了換行符。(下面的解決方案假設每個“令牌”本身不包含換行符 - 如果包含,那么您可以regexp_substr稍微修改呼叫,使用允許點元字符匹配換行符的選項。)
select t.seq_num, l.ord, l.token
from t cross join lateral
(
select level as ord,
regexp_substr(c, '(\[\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}])'
|| chr(10) || '(.*?)' || chr(10) || '\1'
, 1, level, null, 2)
as token
from dual
connect by level <=
regexp_count(c, '(\[\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2}])'
|| chr(10) || '(.*?)' || chr(10) || '\1')
) l
order by seq_num, ord -- if needed
;
SEQ_NUM ORD TOKEN
---------- ---------- -------------------------
1 1 ZZZZZZZZZZZZZZZZZZZZ
1 2 YYYYYYYYYY
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/364371.html
