【问题标题】:How do I cast a NUMBER value to a single CHAR in Oracle?如何在 Oracle 中将 NUMBER 值转换为单个 CHAR?
【发布时间】:2012-03-15 00:29:52
【问题描述】:

在几乎任何普通的编程语言中,都可以使用类似于此的转换轻松地将整数/短/字节转换为字符

char alpha = (char)123;

我正在尝试在 Oracle 数据库中执行此操作。我有 CHAR(1 BYTE) 类型的列,我希望能够在其中存储 NUMBER 值(其中不大于 30 左右)。 CAST 函数不允许我这样做。

rank := 10;
CAST(rank as CHAR(1))

其中 rank 是一个 NUMBER 变量。我收到一个错误:

Value from cast operand is larger than cast target size.

这是如何在 Oracle PL/SQL 中完成的?

【问题讨论】:

  • 您想将两位数转换为一个字符的 CHAR。该错误会告诉您您需要知道的一切。
  • 一个字符是1个字节,十进制数10可以用一个字节(00001010)表示。我使用的是我作为程序员习惯的“cast”这个词的定义,它可能与 SQL 的定义不同。
  • "Oracle 以 100 为基数存储一个数字,每个字节可以存储 2 位数字,一个字节总是为指数保留"(来自:dbasupport.com/forums/showthread.php?t=17375)。您将需要一个更大的列。
  • @Ollie - 我不知道它是这样工作的,我以为是字符长度。感谢您指出这一点!
  • 我将你们俩引导到我在北极回答中的评论。我不关心存储具有任何意义的人类可读字符。我正在尝试将一个单字节值存储在一个单字节列中,该列恰好期望一个字符而不是一个数字。

标签: oracle casting plsql char int


【解决方案1】:

根据我对@northpole 回答的评论...

与您想要的最接近的可能不完全正确,但 CHR 函数会将数字转换为等效的 ascii。
alpha := chr(113); 会将字符“q”放入 alpha 变量中,从而将您的数字“113”存储为单个字节。

【讨论】:

    【解决方案2】:

    您有几个选择。您可以使用 TO_CHAR 并执行以下操作:

    TO_CHAR(rank,'99')
    

    或者使用 CAST 函数并通过提供更大的 CHAR 来修复您的尝试:

    CAST(rank as CHAR(2))
    

    原因正如 Ollie 在他的评论中所描述的那样。

    【讨论】:

    • 恐怕你误解了我的问题。我不是想得到一个数字的字符串表示。我要做的基本上是将单字节数字存储在需要单字节字符的列中。理论上,这应该很简单:一个字节的数字完全适合一个字节的列。例如,在 Java 或 C# 中,我可以将数字 113(敏锐的观察者在显示时会注意到它是三个字符长)存储到单字节 char 变量中,只需说 char a = (char)113;结果字符是“q”,但这与我完全无关。
    • 最接近您想要的可能并不完全正确,但 CHR 函数会将数字转换为它的 ascii 等价物。即alpha := chr(113); 会将字符“q”放入 alpha 变量中,从而将您的数字“113”存储为单个字节。
    • 这几乎正是我想要的。谢谢你,奥利。
    • 我将添加我的评论作为未来人们搜索此问题的答案。
    • 哇,我对这个问题的理解还差得很远。感谢您清理它@Ollie
    【解决方案3】:

    你可以试试这个:

    SUBSTR(CAST(rank as CHAR(2)), 2, 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2015-06-04
      • 1970-01-01
      • 2010-12-20
      • 2017-01-18
      • 2011-08-09
      • 2013-10-29
      相关资源
      最近更新 更多