PL / SQL为什么我的函数返回NULL值而不是'HH24:MI:SS'格式的值?

时间:2017-06-23 21:06:21

标签: oracle plsql

我正在尝试编写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;

enter image description here

当我使用相同的过程编写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;

enter image description here

3 个答案:

答案 0 :(得分:3)

正则表达式中的括号类型错误;它应该是:

IF REGEXP_LIKE(p_hour, '[0-9]') THEN

您使用了分组括号,匹配/类括号的insteaf。如果你传入字符串'0-9',你就会得到一个匹配,然后不会转换为日期/时间。

Read more

答案 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