Oracle PL/SQL:给一个IN变量赋一个新值



我有一个定义为:

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);

但是会产生重赋错误

除了用NVL()包装AS_OF_DATE_IN的所有用法之外,是否有更有效的方法来处理这种情况?

**编辑**我犯了一个相当愚蠢的错误——我在写一个过程,而不是一个函数。过程没有返回值

可以在函数内部使用局部变量:

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)你传递的是日期而不是变量。您不能更改传入的字符串值。

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

最新更新