我正在尝试编写PL / SQL函数以通过参数接收VARCHAR2类型中的数字并以“HH24:MI:SS”格式返回一小时。例如:如果我通过参数'6'发送,该功能将返回06:00:00。问题是函数返回NULL值但是如果我在一个简单的PL / SQL块中编写相同的进程它可以正常工作。你有什么主意吗?。谢谢:))
CREATE OR REPLACE FUNCTION format_hour_test (
p_hour VARCHAR2)
RETURN VARCHAR2
IS
v_hour_time TIMESTAMP;
v_hour_char VARCHAR2(50);
BEGIN
IF
REGEXP_LIKE(p_hour, '(0-9)') THEN
v_hour_time := TO_TIMESTAMP(p_hour, 'HH24');
END IF;
v_hour_char := TO_CHAR(v_hour_time, 'HH24:MI:SS');
RETURN v_hour_char;
END format_hour_test;
/
SHOW ERRORS;
当我使用相同的过程编写anonymus块时,这可以正常工作。
SET SERVEROUTPUT ON
DECLARE
v_hour VARCHAR2(20) := '6';
v_hour_time TIMESTAMP := TO_TIMESTAMP(v_hour, 'HH24');
v_result VARCHAR2(20) := TO_CHAR(v_hour_time, 'HH24:MI:SS');
BEGIN
DBMS_OUTPUT.PUT_LINE(v_result);
END;
答案 0 :(得分:3)
正则表达式中的括号类型错误;它应该是:
IF REGEXP_LIKE(p_hour, '[0-9]') THEN
您使用了分组括号,匹配/类括号的insteaf。如果你传入字符串'0-9'
,你就会得到一个匹配,然后不会转换为日期/时间。
答案 1 :(得分:2)
您的匿名阻止不相同的进程。在匿名块中,您没有_collections
在正则表达式中,parens组,因此您正在查找字符串if regexp_like...
。因此,程序中未设置0-9
。
我认为你正在寻找v_hour_time
,它与范围中的一个字符相匹配。或者,[0-9]
https://docs.oracle.com/cd/B12037_01/server.101/b10759/ap_posix001.htm#i690819
答案 2 :(得分:0)
您的v_hour_time
永远不会被初始化,因为您的REGEXP_LIKE有条件:
select (case when REGEXP_LIKE('6', '(0-9)') then 'true' else 'false' end) as res from dual;
返回:
RES
-----
false