【问题标题】:Number to char implicit conversion in pl/sqlpl/sql 中数字到字符的隐式转换
【发布时间】:2015-11-16 22:03:03
【问题描述】:

我正在创建一个存储过程,它根据奖金和薪水计算总金额。 存储过程创建如下:

        Create or replace procedure cal_sum( p_salary in number, p_bonus inout number, p_output out number)
         Begin
         p_bonus :=p_salary*bonus/100;
         p_output :=p_bonus+p_salary;
         End;

并使用匿名块调用存储过程,如下所示:

          Declare
          v_salary number := 2000;
          v_bonus number  := 10;
          v_total char(10);
          Begin
          cal_sum(v_salary,v_bonus,v_total);
           End;

上述程序运行良好,没有编译时错误。 我在上面的查询中理解的是 查询是如何工作的,即使存储过程和匿名块中的 p_output 和 v_total 参数的数据类型不同 pl/sql 是否支持数字到字符的隐式转换? 请帮忙

【问题讨论】:

  • 有多篇文章深入介绍了隐式转换。 intermediatesql.com/oracle/…
  • 对于您正在尝试的内容,函数难道不会比存储过程更合适吗?
  • 以上查询只是一个例子,用来说明数据类型转换的场景
  • 关于隐式数据类型转换,您需要记住的唯一一件事是:避免它。任何依赖它的代码都应该在代码审查中失败。

标签: sql plsql


【解决方案1】:

回答您的简单问题。下面的例子说明了你的困境:)

    SQL> SET SERVEROUTPUT ON;
    SQL> DECLARE
      2  lv_number NUMBER:='12345';
      3  BEGIN
      4  dbms_output.put_line(lv_number);
      5  END;
      6  /
    12345

尽管 vv_number 是 NUMBER 数据类型,但我仍然在 '' 中分配了它。 所以甲骨文通过它的智能运行:P,即它自己的转换。但是如果你尝试下面的例子也是一样的

SQL> ed
Wrote file afiedt.buf
SQL> DECLARE
  2  lv_number NUMBER:='12345a';
  3  BEGIN
  4  dbms_output.put_line(lv_number);
  5  END;
  6  /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 2

现在您可以看到将 12345a 转换为 NUMBER 时失败的明显区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多