如何在pl-sql中显示变量的数据类型

时间:2013-11-18 17:09:27

标签: sql plsql cursor

我有一个字段“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中的行之后它是否仍然相同。

有什么办法可以打印这个字段/变量的数据类型吗? 或者还有什么我在这里失踪的? 任何指针都会有很大的帮助。

1 个答案:

答案 0 :(得分:1)

感谢大家提供的意见! 这是发生了什么 -

正如其中一条评论中提到的,我正在将一个csv格式的输入文件加载到临时表中。然后,登台表中的一列作为参数传递给函数FOO。 在加载数据时,我使用了SQL Loader的属性。

OPTIONALLY ENCLOSED BY '"'

但是在我使用的示例文件中,这些值只是用逗号分隔,没有双引号(“”)。我更改了文件,使文件中的每个值都被怀疑引号括起来,将这个文件加载到临时表中,然后执行上面的程序,它工作得很好。所以问题不在于代码而在文件中。

感谢大家花时间回答我的问题,并提供意见!