函数oracle到postgresql

问题描述 投票:2回答:2

我正在将一个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函数不存在。

sql postgresql plpgsql
2个回答
0
投票

你忘了包括TO_NUMBER部分的格式化。更新TO_NUMBERTO_NUMBER(SUBSTR(LTRIM(TO_CHAR(p_hour,'0000'),' ') ,1,2), '0000')它应该工作。


2
投票

如果将表达式扩展为因子:

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
© www.soinside.com 2019 - 2024. All rights reserved.