Oracle PL / SQL:为IN变量分配新值

时间:2011-11-14 17:55:01

标签: oracle plsql oracle10g

我有一个定义为:

的程序
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()中之外,是否有更有效的方法来处理这种情况?

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

2 个答案:

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