似乎无法在 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中输出多行
Oracle ORA-06502 PL/SQL:数字或值错误:字符到数字的转换错误