【问题标题】:Function PL/SQL ORACLE函数 PL/SQL ORACLE
【发布时间】:2020-12-01 15:53:27
【问题描述】:

我需要用下面的sql做一个函数

此sql将数字转换为字母

With
  Numero as (
  select 3 N from dual
  )
  ,
  PreProcesado1 as (
  select   N
        , floor(mod(N, 10)) Unidades
    from Numero
  )
  select   N,     case Unidades 
                  when 0 then ''
                  when 1 then 'one'
                  when 2 then 'two'
                  when 3 then 'three'
                  when 4 then 'four'
                  when 5 then 'five'
                  when 6 then 'six'
                  when 7 then 'seven'
                  when 8 then 'eight'
                  when 9 then 'nine'
                end
              end
            from PreProcesado1;

我是这样做的,但它不起作用,必须有一个输入参数,在这种情况下是entry_numero,应该转换

create or replace function fun_departamento(entry_numero number)
return varchar2 is
response varchar2(120);
begin
  With
      Numero as (
      select entry_numero N from dual
      )
      ,
      PreProcesado1 as (
      select   N
            , floor(mod(N, 10)) Unidades
        from Numero
      )
      select   N,     case Unidades 
                      when 0 then ''
                      when 1 then 'one'
                      when 2 then 'two'
                      when 3 then 'three'
                      when 4 then 'four'
                      when 5 then 'five'
                      when 6 then 'six'
                      when 7 then 'seven'
                      when 8 then 'eight'
                      when 9 then 'nine'
                    end
                  end
                  into response
                  from PreProcesado1; 
return response;
end;
/

我收到此错误,非常感谢您的帮助

PL/SQL: SQL Statement ignored
PL/SQL: ORA-00947: not enough values

【问题讨论】:

  • 您正在尝试选择值并返回到一个变量。要么在主选择中删除 N,要么在 INTO 子句中再添加一个变量。而且我认为 Case 语句中存在一个冗余 END。

标签: sql oracle oracle11g


【解决方案1】:

这是一种更简单的方式来满足您的需求:

to_char( to_date(n,'J'),'jsp')

例如:

SQL> select to_char( to_date(4,'J'),'jsp') as n from dual;

N
----------
four

注意这里不能处理 0,所以你可能需要:

select
  case
    when n != 0 then to_char( to_date(n,'J'),'jsp')
  end
from ...

Here你发现了更多。

【讨论】:

  • 好吧它是有效的,但如果我想按照问题的结构?
  • 如果您密切关注 OP 的问题,您会注意到输入可以是任何数字(不仅仅是零到九之间的整数)。在他的代码中,他将数字四舍五入,然后取余数 mod 10。您的解决方案也应该这样做。另外:我认为这个问题是关于如何将 SQL 语句按原样转换为 PL/SQL 包装语句的通用问题。如果这是 OP 提出问题的主要原因(显然是),那么您的解决方案将无济于事。
【解决方案2】:

正如你所说,你想按照你的方式来做,那么请参见第 16 行和第 29 行

  • 第 16 行:您选择了两个值(NCASE 表达式)
  • 第 29 行:您尝试将 2 个值放入单个变量 (response)

因此,从第 16 行删除 N(或添加另一个要插入的变量)。

SQL> create or replace function fun_departamento(entry_numero number)
  2  return varchar2 is
  3  response varchar2(120);
  4  begin
  5    With
  6        Numero as (
  7        select entry_numero N from dual
  8        )
  9        ,
 10        PreProcesado1 as (
 11        select   N
 12              , floor(mod(N, 10)) Unidades
 13          from Numero
 14        )
 15        select
 16                 --  N,                  --> without it! ...
 17                   case Unidades
 18                        when 0 then ''
 19                        when 1 then 'one'
 20                        when 2 then 'two'
 21                        when 3 then 'three'
 22                        when 4 then 'four'
 23                        when 5 then 'five'
 24                        when 6 then 'six'
 25                        when 7 then 'seven'
 26                        when 8 then 'eight'
 27                        when 9 then 'nine'
 28                    end
 29                    into response      --> ... as you're inserting into a single variable
 30                    from PreProcesado1;
 31  return response;
 32  end;
 33  /

Function created.

测试:

SQL> select fun_departamento(5) from dual;

FUN_DEPARTAMENTO(5)
--------------------------------------------------------------------------------
five

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多