Oracle String Literal太长 - 在字符串中提取数据

时间:2012-07-03 01:51:51

标签: sql regex oracle plsql oracle11g

使用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,然后处理我需要的条目 - 只是不确定如何处理并解决我的问题?

感谢。

1 个答案:

答案 0 :(得分:2)

在以下代码中,我预先填充了CLOBc”,其中包含一些数据,例如您的样本。我不确定你对每个符合条件的条目你想做什么;我只是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>

我希望这会有所帮助。