Могут ли хранимые в Postgres функции иметь как возвращаемое значение, так и параметры out? - PullRequest
6 голосов
/ 10 января 2011

Я знаю Oracle и PL / SQL

По сравнению с тем, что я знаю об Oracle PL / SQL, я не очень хорошо знаком с хранимыми процедурами PostgreSQL и plpgsql. В Oracle есть два типа вызываемых:

  • Процедуры. Они могут иметь параметры IN , OUT и IN OUT , но без возвращаемых значений
  • Функции. Они могут иметь параметры IN , OUT и IN OUT , и они ДОЛЖНЫ возвращать значение

Но я новичок в plpgsql

Я понимаю, что в plpgsql все хранимые процедуры считаются functions. Насколько я понимаю, это означает, что они могут (но не обязаны) всегда возвращать значение. Теперь я вижу на странице документации , что я также могу объявить параметры OUT для функций , что невозможно в Oracle . Но я не вижу примера или какого-либо четкого заявления о том, могут ли параметры OUT быть объединены с возвращаемыми значениями. Также я не вижу, возможны ли параметры IN OUT .

Так вот мои вопросы:

  • Позволяет ли plpgsql IN OUT параметры?
  • Позволяет ли plpgsql OUT параметры комбинироваться с возвращаемыми значениями? Это обычная практика? У вас есть примеры для этого?

Ответы [ 3 ]

14 голосов
/ 10 января 2011

IN и OUT в основном являются псевдонимами для более старого синтаксиса.

старый способ:

create function test(param int) 
returns integer as 
$$ select 1 $$ 
language sql;

эквивалент:

create function test(in param int, out int)
as $$ select 1 $$
langauge sql;

Что предоставляют параметры, это информация о типев основном создает анонимный тип для вашего возврата:

create function test(in param, out int, out int)
as $$ select 1, 2 $$
langauge sql;

теперь вы можете написать:

 select * from test(1);
 column1 | column2 
---------+---------
       1 |       2

Без параметров out вам бы пришлось создать тип или таблицу, в которой было бы дваИнтервал для приведения данных к нужному типу:

create or replace function test(in a int) 
returns record as 
as $$ select 1, 2 $$ 
language sql;
                                ^
select * from test(1);
ERROR:  a column definition list is required 
   for functions returning "record"
2 голосов
/ 10 января 2011

... на самом деле я сам должен был поискать немного больше.Ответ не далеко на странице документации:

http://www.postgresql.org/docs/current/static/sql-createfunction.html

0 голосов
/ 10 января 2011

если вы указали выходной параметр, это означает структуру вашего результата

например.

create function test(in param, out int, out int)

вернет 2 столбца типа int.в Postgre до сих пор я знаю 2 способа сделать это.

1 вернуть setof refcursor и использовать приложение, чтобы прочитать его.

create function test(in param) RETURNS setof refcursor AS
declare result refcursor;
declare parameters refcursor;
begin
 open result for select * from mytable;
 return next result;

 open parameter for select 11 as a, 22 as b;
 return next parameters;
end;

2 использовать уведомление о повышении.В уведомлении npgsql есть событие, к которому вы можете добавить обработчик для получения.

raise notice 'my parameter = %', 11;
return query select * from mytable;

извините, что я не прояснил.

1, используя параметр 'out', чтобы указать возвращаемый запроссостав.Вы не можете вернуть данные + переменную.'out' в postgre не означает передачу ссылки на параметр.

2, если вы хотите вернуть данные + переменную, либо метод 1, либо 2.

...