0

我有一个执行 SELECT INTO 并将返回的结果存储在名为 VARCHAR2 变量中的过程account_

SELECT DISTINCT NVL(XYZ_API.Get_Ref(company, currency, pay_type, order_id), 
                    XYZ_API.Get_Id(company, currency, pay_type, order_id)) account
INTO account_
FROM some_table
WHERE company                     = company_
     AND payment_type             = 'SUPP'
     AND order_id                 = order_id_
     AND payment_date             = pay_date_;

company_order_id_pay_date_都是我用来过滤记录的 VARCHAR2 变量。

然后将输入的结果account_格式化如下,并存储在另一个名为 的 VARCHAR2 变量中giro_

giro_ := LPAD( TRANSLATE( account_, '1234567890- ','1234567890' ), 16, '0' );

然后我检查是否giro_是一个数字,如下用一个 FOR 循环。

FOR i_ IN 1..LENGTH( giro_ ) LOOP
     c_ := ASCII( SUBSTR( giro_ , i_, 1 ) );
     IF ( c_ < ASCII( '0' ) OR c_ > ASCII( '9' ) ) THEN
        RETURN FALSE;
     END IF;
  END LOOP;

我有一个场景,上面显示的 SELECT 查询没有获取任何记录。

这最终在 FOR 循环中引入了一个异常,错误为 ORA-06502 和 ORA-06512。

据我了解,原因是LENGTH( giro_ )

1..LENGTH( giro_ )失败,因为giro_值的 LENGTH(LENGTH 为 NULL)无法转换为 NUMBER。

我的问题是,此时在这种情况下,是giro_空字符串还是 NULL?这里到底发生了什么?

谢谢!

4

1 回答 1

0

你的理解是错误的。LENGTH将始终返回一个数字(字符串长度),它不会检查其参数是否为数字。

规则的例外是,如果它的 ( LENGTH's) 参数是一个空字符串(在 Oracle 中,它等于NULL) - 那么长度也是未知的(NULL):

SQL> select length(''), length(null) from dual;

LENGTH('') LENGTH(NULL)
---------- ------------


SQL>

在这种情况下,请修改您的代码以使其包含该NVL功能,例如

FOR i_ IN 1 .. NVL(LENGTH( giro_ ), 0) LOOP

对于空字符串,它不会做任何事情。

于 2020-10-11T10:03:41.873 回答