使用Oracle 11g,我有以下LDAP字符串,它只是我试图在这里演示的一部分。
基本上我有一个非常长的字符串,导致我'字符串文字太长'的问题,基本上在这个字符串中,我希望能够删除我不想要的甚至更好的部分,删除只有我需要的部分。
这只是字符串内容/长度的简短版本:
Member of = CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=aTIGERAdmin-Admin, CN=ea90045052, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=aTIGERCall-Admin, CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=aTIGERAdmin-Admin, CN=ea90045052, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=DAaTIGERCall-Admin, CN=aTIGERCall-Admin,
假设上面的长度超过4000个字符。
我的问题是,使用Oracle SQL和PL / SQL以及上面的“成员”字符串,我需要以某种方式过滤出看起来像'CN = aTIGER%'的位并完全忽略看起来像'CN的条目= DAaTIGER%'我相信,我们解决了我的字符串文字问题,但我无法先将其过滤掉,因为我的原始字符串已超过4000个字符长。
有人可以协助使用pl / sql的方法,这种方法只会返回看起来像'CN = aTIGER%'的“成员”内的条目,并完全忽略看起来像'CN = DAaTIGER%'的条目同时,确保结果末尾也有逗号。
我是否需要将其分配给CLOB,然后处理我需要的条目 - 只是不确定如何处理并解决我的问题?
感谢。
答案 0 :(得分:2)
在以下代码中,我预先填充了CLOB
“c
”,其中包含一些数据,例如您的样本。我不确定你对每个符合条件的条目你想做什么;我只是DBMS_OUTPUT
。
鉴于这一切,这里有一个刺:
SET SERVEROUTPUT ON
DECLARE
c CLOB;
l_offset POSITIVE := 1;
l_ldap_component LONG;
l_counter NATURAL := 0;
BEGIN
-- Set up the CLOB. In real life, this data will come
-- from some other source.
c := 'Member of = CN=aTIGERAdmin-Admin'
|| ', CN=D0902498'
|| ', CN=ea90045052'
|| ', CN=aTIGERCall-Admin'
|| ', CN=DAaTIGERCall-Admin'
--- Lots of additional data excised for the sake of brevity....
|| ', CN=aTIGERCall-Admin,';
DBMS_OUTPUT.PUT_LINE('Length of CLOB = ' || TO_CHAR(DBMS_LOB.GETLENGTH(c)));
-- Search for commas within the CLOB, and extract each subsequent
-- inter-comma string, including the trailing comma.
WHILE (DBMS_LOB.INSTR(c,',',l_offset) > 0)
LOOP
l_ldap_component :=
TRIM (
DBMS_LOB.SUBSTR(c
, DBMS_LOB.INSTR(c
, ','
, l_offset) - l_offset + 1
, l_offset)
);
IF (l_ldap_component LIKE 'CN=aTIGER%,') THEN
-- I'm printing the qualified entries to the screen, but you
-- can add them to a collection or whatever....
DBMS_OUTPUT.PUT_LINE(l_ldap_component);
END IF;
l_offset := DBMS_LOB.INSTR(c,',',l_offset) + 1;
END LOOP;
END;
/
根据我使用的数据,此代码生成输出:
Length of CLOB = 5127
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
CN=aTIGERAdmin-Admin,
CN=aTIGERCall-Admin,
PL/SQL procedure successfully completed.
SQL>
我希望这会有所帮助。