Oracle PL / SQL: назначить новое значение переменной IN - PullRequest
1 голос
/ 14 ноября 2011

У меня есть процедура, определенная как:

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 ]

6 голосов
/ 14 ноября 2011

Вы можете использовать локальную переменную внутри функции:

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;
2 голосов
/ 14 ноября 2011

У вас есть две проблемы:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...