【问题标题】:Is LPAD allowed in PLSQL?PLSQL 中是否允许使用 LPAD?
【发布时间】:2020-10-28 14:34:21
【问题描述】:

我有一个 PL/SQL 脚本,其中有一个名为 v_credit_hours 的变量,它是一个数字数据类型。我从游标中获取我的字段并将它们插入到一个表中,其中 credit_hours 字段也是一个数字。我需要用前导零填充 v_credit_hours 并在插入之前以四位数结尾。所以 50 小时应该像 0050。我在插入语句之前有这一行。

v_credit_hours := LPAD(ROUND(v_credit_hours), 4, 0);

问题是它没有改变任何东西。 50 仍然显示为 50。如果我将 4 更改为 10 或完全删除 LPAD,则不会发生任何事情。我尝试在 ROUND 内将 v_credit_hours 更改为 v_credit_hours * 8,这改变了结果。就好像 Oracle 只是忽略了 LPAD。这个查询结果很好,但当我使用 PL/SQL 时就不行了。我还尝试在 LPAD 和 ROUND 之间添加 TO_CHAR,但没有任何效果。

SELECT LPAD(ROUND(50), 4, 0) FROM dual;

我不能以这种方式使用 LPAD 吗?我可以在我的原始光标中做到这一点,但我真的只想在最终输出中看到前导零。

【问题讨论】:

  • LPAD 返回一个字符串 (VARCHAR2)。如果将其保存在 NUMBER 变量中,则会立即丢失格式。
  • 如果 v_credit_hours 和 credit_hours -- 它们应该是 -- 键入为 NUMBER,那么前导零严格来说是一个显示问题。 NUMBER 是一个内部的二进制结构,不存储前导零 - 在数学术语中 - “微不足道的数字”。如果您想查看前导零,请在为人眼准备时通过正确构造的 TO_CHAR 函数传递您的 NUMBER。

标签: oracle plsql


【解决方案1】:

很难判断 v_credit_hours 是输入为 Number 还是 Varchar。但是,如果你这样做,你会得到你想要的。

 DECLARE
 v_formatted_credit_hours  varchar2(60);

BEGIN 

 SELECT lpad(round(50),4,0)
 INTO v_formatted_credit_hours
 FROM dual ;

SYS.dbms_output.put_line( v_formatted_credit_hours) ;

END;

希望这有助于阐明您的问题。

【讨论】:

  • 我是这样做的。我没有意识到它会改变数据类型。所以我更改了表中的数据类型,并且必须创建一个新的 varchar 变量,因为以前的游标使用数字 v_credit_hours。谢谢大家。
  • 那么您的表中的数据类型是什么,您将其更改为什么?正如我之前所说,数字应存储为 NUMBER(日期应存储为 DATE)。并且所有内部操作(比较等)都应该作为 NUMBER 来完成。当您需要将其显示给人类时,您可以并且应该将其转换为字符串(VARCHAR2 等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2012-08-04
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多