似乎无法在PL SQL函数中减去两个数字

时间:2011-05-18 13:03:36

标签: oracle stored-procedures plsql

以下函数旨在将分隔的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&粘贴在我的其他函数中找到的减号,并且该东西编译...

感谢您的帮助......

2 个答案:

答案 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