2011-11-14 4 views
1
変数

INに新しい値を割り当てる私は手順は以下のように定義している。これらの方法で実行することができOracleのPL/SQLは:

CREATE OR REPLACE PROCEDURE foo (
    AS_OF_DATE_IN IN DATE DEFAULT TRUNC(sysdate)-1 
) AS ... 

:私は何をしたいか

-- passes '11-NOV-2011' 
exec foo('11-NOV-2011'); 

--set DEFAULT value (yesterday's date) 
exec foo(); 

--makes things more difficult, as default value isn't set 
exec foo(NULL); 

AS_OF_DATE_IN:=NVL(AS_OF_DATE_IN, TRUNC(sysdate)-1); 

ですが、再割り当てエラーが発生します。

AS_OF_DATE_INのすべての用途をNVL()でラップする以外に、この状況を処理するための効率的な方法はありますか?

**編集** 私はかなりばかげた過ちを犯しました。私は手続きを書いています。機能ではありません。このプロシージャは値を戻しません。

答えて

6

あなたが関数内のローカル変数を使用することができます。

1)あなたは、変数対日付に渡している。

CREATE OR REPLACE FUNCTION foo (
    AS_OF_DATE_IN IN DATE DEFAULT TRUNC(sysdate)-1 
) RETURN ??? AS 
    V_AS_OF_DATE DATE DEFAULT NVL(AS_OF_DATE_IN, TRUNC(sysdate)-1); 
BEGIN 
... use V_AS_OF_DATE throughout 
END; 
+1

私は 'あなたが意味するものと仮定しています:あなたの変数宣言で='ないdefaultを。 'v_as_of_date DATE:= nvl(as_of_date_in、trunc(sysdate)-1)' –

+1

それは主に怠惰なコピーですが、 'DEFAULT'はうまく動作します。問題は、 'AS'の前に' RETURN'節がないことです。 –

+1

うわー!変数宣言で 'DEFAULT'を使うことはできませんでした。毎日何か新しいことを学ぶ。 –

2

次の2つの問題を抱えています。渡される文字列の値は変更できません。

2)値を「IN OUT」パラメータに設定してから値を割り当てることができます。

例:

CREATE OR REPLACE FUNCTION FOO (as_of_date in out date) return date 
AS 
BEGIN 
    as_of_date:= nvl(as_of_date,trunc(sysdate)-1); 
    return as_of_Date; 
END; 


-- pass in a null date 
DECLARE 
    returnDate Date:= null; 
BEGIN 
    returnDate := foo(null); 
    dbms_output.put_line('return date is '|| returnDate) 
END 

-- pass in a real date 
DECLARE 
    returnDate Date:= '01-JAN-2011'; 
BEGIN 
    returnDate := foo(null); 
    dbms_output.put_line('return date is '|| returnDate) 
END 
関連する問題