【问题标题】:function oracle to postgresqloracle 到 postgresql 的函数
【发布时间】:2018-02-28 20:29:23
【问题描述】:

我正在将 Oracle 数据库迁移到 PostgreSQL,以传输我没有问题的表,但是我无法转录一个函数以使其在 Postgres 中运行,在 Oracle 中找到的函数下方:

create or replace FUNCTION  "FN_HOUR_MINUTE" (P_HOUR IN NUMBER) 
RETURN NUMBER 
IS
  -- PL/SQL Specification
  V_RETORN                 NUMBER(4);
  -- Convert hour to minute
  -- PL/SQL Block
BEGIN
V_RETORN := 60*TO_NUMBER(SUBSTR(LTRIM(TO_CHAR(P_HOUR,'0000'),' ') ,1,2))+
                  TO_NUMBER(SUBSTR(LTRIM(TO_CHAR(P_HOUR, '0000'),' '), 3,2));

RETURN V_RETORN;
EXCEPTION
WHEN OTHERS THEN
       RETURN NULL ;
END;

我尝试在 postgres 中写如下:

CREATE OR REPLACE FUNCTION fn_hour_minute(p_hour in NUMERIC)
  RETURNS NUMERIC(4) AS $$
DECLARE
  v_retorn NUMERIC(4);
BEGIN
  v_retorn := 60*TO_NUMBER(SUBSTR(LTRIM(TO_CHAR(p_hour,'0000'),' ') ,1,2))+
                   TO_NUMBER(SUBSTR(LTRIM(TO_CHAR(p_hour, '0000'),' '), 3,2));
  RETURN v_retorn;
END;
$$ LANGUAGE plpgsql;

但是给出一个错误,说 to_number 函数不存在。

【问题讨论】:

  • 试试TO_NUMBER(SUBSTR(LTRIM(TO_CHAR(p_hour,'0000'),' ') ,1,2), '0000') 还有,你为什么要转换成字符然后转换成数字?
  • 成功了,谢谢。我不太明白他为什么要进行这两次转换,Oracle数据库不是我做的,但是那个功能在那里工作。

标签: sql postgresql plpgsql


【解决方案1】:

如果将表达式分解为因子:

select TO_CHAR(1234,'0000'),
    ltrim(TO_CHAR(1234,'0000')),
    substr(ltrim(TO_CHAR(1234,'0000')),1,2),
    substr(ltrim(TO_CHAR(1234,'0000')),3,2)
from dual;

TO_CH LTRIM SU SU
----- ----- -- --
 1234 1234  12 34

你会发现这只是计算这种表达式的一种非常高级的方法

60 * TRUNC( p_hour / 100 ) + p_hour % 100

【讨论】:

    【解决方案2】:

    您忘记包含 TO_NUMBER 部分的格式。将TO_NUMBER 更新为TO_NUMBER(SUBSTR(LTRIM(TO_CHAR(p_hour,'0000'),' ') ,1,2), '0000'),它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-27
      • 2018-09-26
      • 2015-09-12
      • 2022-01-17
      • 1970-01-01
      • 2021-02-04
      • 2013-10-02
      相关资源
      最近更新 更多