【问题标题】:How do I CAST a NUMBER to VARCHAR2 in Oracle?如何在 Oracle 中将 NUMBER 转换为 VARCHAR2?
【发布时间】:2013-12-16 17:21:29
【问题描述】:

我对某些 P-SQL 语法有疑问。我已将代码示例减少到下面的最小值。

以下作品:

CREATE OR REPLACE FUNCTION MyFunction(LINE_ID SMALLINT)
RETURN VARCHAR2 IS
    tmp VARCHAR2(4000);
BEGIN
    tmp := CAST(LINE_ID AS VARCHAR2);
    RETURN(tmp);
END MyFunction;
/

但是,我需要将 LINE_ID 参数更改为 NUMBER(5, 0),之后以下操作不起作用:

CREATE OR REPLACE FUNCTION MyFunction2(LINE_ID NUMBER(5, 0))
RETURN VARCHAR2 IS
    tmp VARCHAR2(4000);
BEGIN
    tmp := CAST(LINE_ID AS VARCHAR2);
    RETURN(tmp);
END MyFunction2;
/

Oracle SQL Developer 3.2.10.09 中的错误信息是

错误(1,36):PLS-00103:在期待一个时遇到符号“(” 以下内容: := 。 ) , @% 默认字符 符号“:=” 被替换为“(”以继续。

我应该如何编写CAST 语句才能使其与NUMBER(5, 0) 而不是SMALLINT 一起使用?

同样,这不是原始代码,但我正在寻找一种不会与第二个版本有太多偏差的解决方案,而且最好也不是另一个函数调用。 VARCHAR2 返回类型也很重要。

【问题讨论】:

  • 您可以随时尝试 to_char。它甚至可能会起作用。
  • 为什么要重新发明轮子? Oracle 已经为此提供了一个(更通用的)功能:to_char()
  • 这是从 SQL Server 脚本转换而来的。因此,我最初对这个事实“视而不见”。我应该在我的问题中提到这一点,以便其他人了解我来自哪里。

标签: sql oracle plsql casting


【解决方案1】:

你要找的函数是TO_CHAR:

tmp := TO_CHAR(LINE_ID);

【讨论】:

  • 在参数中包含精度/比例是最初的问题,但这也是一个有用的建议。
【解决方案2】:

您不能为函数的参数指定NUMBER 精度和小数位数。像这样声明它:

CREATE OR REPLACE FUNCTION MyFunction2(LINE_ID NUMBER)

【讨论】:

    【解决方案3】:

    问题不在于您的 CAST,而在于您的参数定义。来自documentation

    你可以声明一个约束子类型的形参,像这样:

    DECLARE
      SUBTYPE n1 IS NUMBER(1);
      SUBTYPE v1 IS VARCHAR2(1);
    
      PROCEDURE p (n n1, v v1) IS ...
    

    但是你不能在形参声明中包含约束,像这样:

    DECLARE
      PROCEDURE p (n NUMBER(1), v VARCHAR2(1)) IS ...
    

    【讨论】:

      猜你喜欢
      • 2017-01-17
      • 2020-12-20
      • 2011-11-28
      • 2022-01-23
      • 1970-01-01
      • 2016-03-10
      • 2012-10-03
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多