我有一个定义为:
的程序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()中之外,是否有更有效的方法来处理这种情况?
**编辑** 我犯了一个相当愚蠢的错误 - 我正在写一个程序,而不是一个函数。该过程不返回值。
答案 0 :(得分:6)
您可以在函数内使用局部变量:
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)
您有两个问题:
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