如何在Oracle中将NUMBER转换为VARCHAR2?

时间:2013-12-16 17:21:29

标签: sql oracle plsql casting

我遇到一些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返回类型也很重要。

3 个答案:

答案 0 :(得分:13)

您正在寻找的功能是TO_CHAR

tmp := TO_CHAR(LINE_ID);

答案 1 :(得分:3)

您无法为函数的参数指定NUMBER精度和比例。只需声明如下:

CREATE OR REPLACE FUNCTION MyFunction2(LINE_ID NUMBER)

答案 2 :(得分:1)

问题不在您的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 ...