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

Posted

技术标签:

【中文标题】似乎无法在 PL SQL 函数中减去两个数字【英文标题】:Can't seem to subract two numbers in a PLSQL function 【发布时间】:2011-05-18 13:03:35 【问题描述】:

以下函数旨在将分隔的 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 错误。

我失去了联系吗?我是不是忘记了如何减去两个数字之类的?

请帮忙。谢谢。

编辑

好吧,刚刚发生了最奇怪的事情......在这个包的其余部分,我知道我在不同函数的其他地方减去了一些 PLS_INTEGER......所以我找到了这样一个例子,然后复制并粘贴减号在我的其他函数中找到符号,然后编译...

感谢您的帮助...

【问题讨论】:

没那么奇怪;您似乎在出错的版本中的减号上使用了 em-dash... 【参考方案1】:

为什么不做之前的计算

oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, (nEndIdx – nStartIdx), nStartIdx); 

例如

calcValue := nEndIdx – nStartIdx;

oRet(oRet.LAST) := DBMS_LOB.SUBSTR(sText, calcValue, nStartIdx); 

【讨论】:

Rob,使用您上面提供的 EXACT 代码,我得到了相同的编译器错误,只是这次它出现在 calcValue 行上。即使我注释掉 oRet(oRet.LAST) 行,我也会得到相同的编译器错误。 用户从脚本的另一部分复制了工作代码,它现在正在工作【参考方案2】:

“涉及模式作为参数的操作,如COMPARE、INSTR和SUBSTR,不支持模式参数或子字符串中的正则表达式或特殊匹配字符(如SQL中LIKE运算符中的%)。” http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_lob.htm

我认为你应该在 SUBSTR 函数之外计算“nEndIdx – nStartIdx”

Substr 参考。 http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_lob.htm#i999349

【讨论】:

fsonmezay,使用 Rob 在不同答案中给出的 EXACT 代码,我得到了相同的编译器错误,只是这次它在 calcValue 行上。即使我注释掉 oRet(oRet.LAST) 行,我也会得到相同的编译器错误。 nStartIdx PLS_INTEGER := 1; nEndIdx PLS_INTEGER := 1;您应该将 PLS_INTEGER 更改为 INTEGER,substr 参数在语法中为 INTEGER。

以上是关于似乎无法在 PL SQL 函数中减去两个数字的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQl sqldeveloper想在plsql中输出多行

PL/SQL 函数错误 - 无法理解

Oracle ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误

我正在 oracle 19c 中创建一个 PL SQL 函数来查找两个数字中的最大值

无法从 cmd PL/SQL 中的简单查询中获得正确的结果

我的 VB.Net 代码中出现 PL SQL 错误,但无法在 SQL Developer 中重现