【发布时间】: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。