我有一个字段“DIVISIONS”,其管道(|)分隔了NUMBER个。我使用DECLARE部分中的跟随光标拆分管道分隔值,如下所示。我用表加入它是因为我需要根据我拆分的每个值从表中获取一些其他字段并添加这些值。表中的字段为NUMBER(38)。
FUNCTION foo (divisions IN VARCHAR2)
RETURN NUMBER
IS
CURSOR splitDiv
IS
SELECT ud.* FROM (
SELECT REGEXP_SUBSTR(divisions, '[^|]+', 1, ROWNUM) AS division
FROM DUAL
CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE(divisions, '[^|]+')) + 1
) d
JOIN ud
ON NVL(TO_NUMBER(d.division),0) = NVL(TO_NUMBER(ud.udValue),0);
divStatusVar NUMBER(38) := 0;
BEGIN
FOR d IN splitDiv
LOOP
divStatusVar := divStatusVar + TO_NUMBER(d.status);
END LOOP;
RETURN divStatusVar ;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Code : ' || SQLCODE || ' Error : ' || SQLERRM);
RETURN divStatusVar ;
END foo;
这就是我调用函数的方式:
DECLARE
...
status NUMBER(38) := 0;
...
BEGIN
...
status := foo('1234|6789');
...
END;
当我执行上面的代码时,我收到以下错误:
ORA-01722: invalid number ORA-01403: no data found
我无法理解为什么会抛出此错误。我想看看“d.status”的数据类型。我可以访问数据库和表UD,并且该字段的数据类型是NUMBER(38),但我不确定在获取Cursor中的行之后它是否仍然相同。
有什么办法可以打印这个字段/变量的数据类型吗? 或者还有什么我在这里失踪的? 任何指针都会有很大的帮助。
答案 0 :(得分:1)
感谢大家提供的意见! 这是发生了什么 -
正如其中一条评论中提到的,我正在将一个csv格式的输入文件加载到临时表中。然后,登台表中的一列作为参数传递给函数FOO。 在加载数据时,我使用了SQL Loader的属性。
OPTIONALLY ENCLOSED BY '"'
但是在我使用的示例文件中,这些值只是用逗号分隔,没有双引号(“”)。我更改了文件,使文件中的每个值都被怀疑引号括起来,将这个文件加载到临时表中,然后执行上面的程序,它工作得很好。所以问题不在于代码而在文件中。
感谢大家花时间回答我的问题,并提供意见!