2017-06-23 4 views
-2

私は、パラメータによってVARCHAR2型の数値を受け取り、 'HH24:MI:SS'という形式で1時間を返すPL/SQL関数をコーディングしようとしています。例:パラメータ '6'で送信すると、関数は06:00:00を返します。問題は関数がNULL値を返すことですが、単純なPL/SQLブロックに同じプロセスを書き込むとうまく動作します。あなたは何か考えていますか?感謝:)PL/SQLなぜ私の関数は 'HH24:MI:SS'形式の値ではなくNULL値を返しますか?

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

+2

あなただけの(フォーマット済み)のテキストを使用することができたときに画像を使用しないでください。 –

+0

ありがとうアレックス。結果を表示するためだけに画像を貼り付けました。 –

+1

基本的なデバッグでは、 'if'条件が満たされていないことがわかりました。これは正規表現の質問に絞っていました。 –

答えて

3

あなたの正規表現に間違った種類の括弧があります。

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

マッチング/クラスブラケットのグループ化括弧を使用しました。 '0-9'という文字列を渡した場合は、日付/時刻に変換されませんでした。

Read more

+0

なぜ、私の質問に否定的な人が投票したのか分かりません。私はこのページがプログラミングについての質問であると思います...アレックスに感謝、私は正規表現をリフレッシュし、コーディングを続ける必要があります。あなたの時間をもう一度ありがとう。 –

2

あなたの無名ブロックは、ない同じプロセスです。匿名ブロックにはif regexp_like...がありません。正規表現ではグループ化されていないので、文字列0-9を探しています。したがって、v_hour_timeはプロシージャで設定されていません。

あなたは[0-9]を探していると思いますが、範囲内の文字の1つに一致しています。代わりに、[[:digit:]]https://docs.oracle.com/cd/B12037_01/server.101/b10759/ap_posix001.htm#i690819

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 
関連する問題