【问题标题】:Assigning a string value to a variable of type NUMBER in pl/sql procedure not throwing any error在pl / sql过程中将字符串值分配给NUMBER类型的变量不会引发任何错误
【发布时间】:2015-07-01 21:33:24
【问题描述】:

我最近开始研究 pl/sql。所以对概念还不是很清楚。我正在编写一个具有一些输入值的存储过程。 使用这些输入值作为键,我创建了一个光标。

在此之后,我遍历游标输出,并为获取的每一行调用插入语句。 在调用插入之前,我做了一些数据操作。

  1. 拆分字符串 '4564:0:75556' 考虑 : 作为分隔符。 为此,我正在使用 SUBSTR 和 INSTR 函数

我的实际问题从这里开始。 SUBSTR 的输出将是一个字符串值。我将此值分配给我在 proc 中声明的 NUMBER 类型的变量。

我在编译这个过程时或至少在我测试它时预计会出错。

奇怪的是我没有收到任何错误,proc 工作正常。

这是预期的行为吗?

我们可以将字符串值分配给 NUMBER 类型的变量吗? 在我的过程中,我将 SUBSTR 的输出分配给变量 d_c1_subscr_no、d_c1_account_no、d_c1_subscr_no_resets NUMBER

我的存储过程:

         CREATE OR REPLACE PROCEDURE P4_UPDATE_BILL_PERIOD_BULK(oldperiod IN      VARCHAR,
                                                   newperiod IN VARCHAR,
                                                   accountno IN VARCHAR) IS
    d_c1_subscr_no        NUMBER;
    d_c1_account_no       NUMBER;
    d_c1_subscr_no_resets NUMBER;
    d_first_occ           NUMBER;
    d_second_occ          NUMBER;

     CURSOR c1_active_subs IS
     select ciem.external_id      as occ_ext_id,
       ciem.subscr_no        as fx_subscr_no,
       ciem.subscr_no_resets as fx_subscr_no_resets
     from customer_id_equip_map ciem, service s
    where ciem.subscr_no = s.subscr_no
     AND s.parent_account_no = to_number(accountno)
     AND ciem.subscr_no_resets = s.subscr_no_resets
     AND ciem.external_id_type = 6
      AND ciem.active_date < SYSDATE
     AND (ciem.inactive_date is null or ciem.inactive_date > SYSDATE);

    d_subscriber c1_active_subs%ROWTYPE;

      BEGIN

     OPEN c1_active_subs;
    LOOP
     FETCH c1_active_subs
          into d_subscriber;
            EXIT WHEN c1_active_subs%NOTFOUND;

        IF c1_active_subs%FOUND THEN
         d_first_occ  := INSTR(d_subscriber.occ_ext_id, ':', 1, 1);
                d_second_occ := INSTR(d_subscriber.occ_ext_id, ':', 1, 2);

            d_c1_subscr_no        := SUBSTR(d_subscriber.occ_ext_id,
                                  1,
                                  d_first_occ - 1);
           d_c1_subscr_no_resets := SUBSTR(d_subscriber.occ_ext_id,
                                  d_first_occ + 1,
                                  d_second_occ - d_first_occ - 1);
           d_c1_account_no       := SUBSTR(d_subscriber.occ_ext_id,
                                  d_second_occ + 1);

              INSERT INTO P4_BULK_DATA
            (BATCH_ID, STATUS, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8)
            VALUES
              (10300,
        0,
         accountno,
       d_subscriber.fx_subscr_no,
          d_subscriber.fx_subscr_no_resets,
         d_c1_account_no,
         d_c1_subscr_no,
        d_c1_subscr_no_resets,
        oldperiod,
         newperiod);

         END IF;

      END LOOP;
      CLOSE c1_active_subs;

    END;

【问题讨论】:

  • 隐式转换 varchar2 -> 数字link

标签: sql plsql plsqldeveloper


【解决方案1】:

Oracle 数据库通常会在许多数据类型之间进行隐式转换。正如评论中提供的链接所阐明的那样,Oracle 隐式地从 VARCHAR2 转换为 NUMBER,反之亦然。也就是说,始终不推荐使用 Oracle 隐式转换的方法。使用 Oracle 提供的丰富的转换函数库总是更好。例如:

  • 使用连接运算符 (||) 连接字符串和算术表达式会产生错误,您可以通过在连接之前使用 TO_CHAR 函数将算术表达式转换为字符串来防止这种错误

  • 依赖数据库中的语言设置来设置 DATE 值的格式可能会产生意外的结果,您可以通过使用 TO_CHAR 函数并指定所需的格式来防止这种情况 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多