以下函数旨在将分隔的CLOB划分为字符串数组:
FUNCTION SPLIT_CLOB(sText IN clob, sDel IN VARCHAR2 := ',') RETURN CLOB_ARRAY IS
nStartIdx PLS_INTEGER := 1;
nEndIdx PLS_INTEGER := 1;
oRet CLOB_ARRAY := CLOB_ARRAY();
BEGIN
IF sText IS NULL THEN RETURN oRet; END IF;
IF DBMS_LOB.getlength(sText) = 0 THEN RETURN oRet; END IF;
LOOP
nEndIdx := DBMS_LOB.INSTR(sText, sDel, nStartIdx);
IF nEndIdx > 0 THEN
oRet.Extend;
/* compiler error on this statement: */
oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, (nEndIdx – nStartIdx), nStartIdx);
nStartIdx := nEndIdx + LENGTH(sDel);
ELSE
oRet.Extend();
oRet(oRet.LAST) := DBMS_LOB.SUBSTR(lob_loc => sText, offset => nStartIdx);
EXIT;
END IF;
END LOOP;
RETURN oRet;
END SPLIT_CLOB;
该行:
oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, (nEndIdx – nStartIdx), nStartIdx);
抛出PLS-00103编译器错误。但是,如果我将呼叫更改为:
oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, 5, nStartIdx);
一切都很好。我已经尝试创建另一个变量来提前进行减法,但遇到了相同的PLS-00103错误。
我失去了联系吗?我忘记了如何减去两个数字或什么?
请帮忙。感谢。
修改
好的,WEIRDEST刚刚发生了......在这个包的其余部分,我知道我在其他地方的某个地方减去了一些PLS_INTEGER ......所以我找到了这样一个例子,然后COPY&粘贴在我的其他函数中找到的减号,并且该东西编译...
感谢您的帮助......
答案 0 :(得分:1)
为什么不在
之前进行计算oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, (nEndIdx – nStartIdx), nStartIdx);
例如
calcValue := nEndIdx – nStartIdx;
oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, calcValue, nStartIdx);
答案 1 :(得分:1)
“涉及模式作为参数的操作,例如COMPARE,INSTR和SUBSTR,不支持模式参数或子字符串中的正则表达式或特殊匹配字符(例如SQL中LIKE运算符中的%)。” http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_lob.htm
我认为你应该在SUBSTR函数之外计算“nEndIdx - nStartIdx”
Substr Ref。 http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_lob.htm#i999349