параметр OUT хранимой процедуры оракула против параметра OUT функции postgresql pl / pgsql - PullRequest
1 голос
/ 21 февраля 2012

Я пытаюсь портировать хранимые процедуры Oracle (plsql) в функцию postgresql (pl / pgsql).

В Oracle можно определить хранимую процедуру с параметрами IN и OUT.

CREATE OR REPLACE PROCEDURE MY_TEST(foo IN NUMBER,
                                    bar OUT NUMBER)
IS 
BEGIN
bar := 1
END

Это сохранит значение 1 в переменной, которая передается хранимой процедуре.Я могу назвать это следующим образом:

DECLARE
outValue NUMBER ;
BEGIN
Exec MY_TEST(10, outValue); 
DBMS_OUTPUT.PUT_LINE('Value Returned Is : '||outValue) ;
END ;

В Postgresql (pl / pgsql) я могу определить функцию, подобную этой:

CREATE OR REPLACE FUNCTION MY_TEST(foo IN NUMBER,
                                   bar OUT NUMBER)
BEGIN
bar := 1
END;
$body$
LANGUAGE PLPGSQL;

Однако я не могу использовать параметр outтак же, как я мог в оракуле.В postgresql параметр OUT определяет возвращаемое значение.В хранимых процедурах оракула нет возвращаемых значений, но вместо этого запишите выходные данные в переменную, переданную в вызове

Есть ли что-то, что я упустил, что позволило бы мне использовать функции pl / pgsql в аналогичныхКак используется хранимая процедура в приведенном выше примере?

Любые советы приветствуются.

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

В PostgreSQL функции PL / pgSQL или SQL принимают параметры значения и возвращают значения.

Они не принимают указатели или ссылки - чтобы можно было манипулировать значением ссылочного адреса.

Вы могли бы сделать что-то подобное в теории с функцией языка C , где вы можете передатьзначения по ссылке.Однако де-факто вы не можете.Руководство предупреждает:

Предупреждение

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

Вкратце: то, что вы пытаетесь сделать, невозможно в PostgreSQL.

0 голосов
/ 21 февраля 2012

Прочтите это.

http://www.postgresonline.com/journal/archives/129-Use-of-OUT-and-INOUT-Parameters.html

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

CREATE OR REPLACE FUNCTION fn_plpgsqltestout(param_subject text, 
    OUT subject_scramble text, OUT subject_char text)
   AS
$$
BEGIN
    subject_scramble := substring($1, 1,CAST(random()*length($1) As integer));
    subject_char := substring($1, 1,1);
END;
    $$
  LANGUAGE 'plpgsql' VOLATILE;

DO $body$
DECLARE 
  o_subject_scramble TEXT;
  o_subject_char     TEXT;
begin
  --Option1
  SELECT (fn_plpgsqltestout('This is a test subject')).* INTO o_subject_scramble,o_subject_char;

  --Option2
  SELECT (fn_plpgsqltestout('This is a test subject')).subject_scramble INTO o_subject_scramble;
  SELECT (fn_plpgsqltestout('This is a test subject')).subject_char INTO o_subject_char;

  --Option3
  o_subject_scramble := (fn_plpgsqltestout('This is a test subject')).subject_scramble;
  o_subject_char := (fn_plpgsqltestout('This is a test subject')).subject_char;

  raise notice 'Return value is: %', o_subject_scramble;
  raise notice 'Return value is: %', o_subject_char;
end;
$body$
0 голосов
/ 21 февраля 2012

Вам не нужен параметр OUT для Postgres:

CREATE OR REPLACE FUNCTION MY_TEST(foo IN integer)
  returns integer
as
$body$
BEGIN
    return 1;
END;
$body$
LANGUAGE PLPGSQL;

Тогда используйте это так:

DO $body$
DECLARE 
  result integer;
begin
  result := my_test(42);
  raise notice 'Return value is: %', result;
end;
$body$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...