Передача значения из процедуры для выбора оператора - PullRequest
2 голосов
/ 07 апреля 2011

Я хотел бы создать процедуру, которая возвращает МАКСИМАЛЬНУЮ дату из таблицы сотрудников, а затем позволяет мне снова вызывать максимальную дату в операторах выбора.

Спасибо.

ПРИМЕЧАНИЕ : я буду использовать max_date_PARAM во многих утверждениях для отчетов.

CREATE OR REPLACE PROCEDURE max_date_proc (max_date_PARAM out DATE) 
IS
BEGIN
    SELECT  max(start_date)  INTO max_date_PARAM
     FROM employee 
   END max_date_proc;
/
select * from benefits where claim > = max_date_PARAM;

Ответы [ 3 ]

4 голосов
/ 07 апреля 2011

Если вы создали функцию

CREATE OR REPLACE FUNCTION get_max_start_date
  RETURN DATE
IS
  l_max_date DATE;
BEGIN
  SELECT MAX(start_date)
    INTO l_max_date
    FROM employee;
  RETURN l_max_date;
END get_max_start_date;

Тогда вы можете запросить

SELECT *
  FROM benefits
 WHERE claim >= get_max_start_date();

Конечно, вы могли бы сделать это и без функции

SELECT * 
  FROM benefits
 WHERE claim >= (SELECT MAX(start_date)
                   FROM employee)
3 голосов
/ 07 апреля 2011

Вы должны использовать функцию вместо процедуры.http://psoug.org/reference/functions.html

1 голос
/ 07 апреля 2011

Если вы выполняете свои операторы в SQL * Plus (или я думаю, что SQL Developer не уверен в других), вы можете использовать переменную связывания:

variable l_max_date date;
exec max_date_proc(:l_max_date);
select * from benefits where claim >= :l_max_date;

То же самое с функцией, которая болееподходит здесь;используя Джастина:

variable l_max_date date;
exec :l_max_date := get_max_start_date();
select * from benefits where claim >= :l_max_date;

Конечно, нет особого смысла делать эту функцию или процедуру, если вы используете результат только один раз, но я предполагаю, что вы хотите использовать одно и то же значение несколько рази не пересчитывать его каждый раз.

Еще один вариант, использующий SQL * Plus ' для обработки столбцов для определения переменной:

column max_date new_value l_max_date noprint;
select max(start_date) max_date from employee;
select * from benefits where claim >= &l_max_date;
...