А можно тут создать функцию как на оракле?

Konstanrtin
Дата: 26.11.2014 21:15:52
Можно ли в postgre сделать функцию как на оракле, чтобы был
1 входной параметр, по нему будем проверять некие условия
2 выходных параметра, если условия по первому удовлетворительны
и Returns integer типа код ошибки
как то так:
create function (in a integer, out name varchar, out code varchar) returns integer
как это сделать правильно на plpgsql?
vyegorov
Дата: 26.11.2014 21:37:26
Maxim Boguk
Дата: 26.11.2014 23:28:19
Konstanrtin
Можно ли в postgre сделать функцию как на оракле, чтобы был
1 входной параметр, по нему будем проверять некие условия
2 выходных параметра, если условия по первому удовлетворительны
и Returns integer типа код ошибки
как то так:
create function (in a integer, out name varchar, out code varchar) returns integer
как это сделать правильно на plpgsql?


Всегда возвращать из функции все 3 значения... просто в случае ошибки первые два в NULL ставить.
Функция не умеет разное количетсво колонок возвращать в разных ситуациях.

PS: я что то такой возможности в оракле не помню. Приведите пример оракловой функции с требуемой функциональностью.

--Maxim Boguk
www.postgresql-consulting.ru
kak_v_oracel
Дата: 26.11.2014 23:30:40
Konstanrtin
Можно ли в postgre сделать функцию как на оракле, чтобы был
1 входной параметр, по нему будем проверять некие условия
2 выходных параметра, если условия по первому удовлетворительны
и Returns integer типа код ошибки
как то так:
create function (in a integer, out name varchar, out code varchar) returns integer
как это сделать правильно на plpgsql?


create function kak_v_oracel(IN a integer, out b_check boolean)
RETURNS boolean
AS
$kak_v_oracel$
BEGIN
   IF a=1 THEN
       b_check:=true;
   ELSE 
         RAISE 'ERROR v pg ne kak v oracel,  -- varhar(5) P0001'; 
   END;
   RETURN;
END;
$kak_v_oracel$;
-----------
SELECT kak_v_oracel(2);
Maxim Boguk
Дата: 27.11.2014 00:53:23
kak_v_oracel
Konstanrtin
Можно ли в postgre сделать функцию как на оракле, чтобы был
1 входной параметр, по нему будем проверять некие условия
2 выходных параметра, если условия по первому удовлетворительны
и Returns integer типа код ошибки
как то так:
create function (in a integer, out name varchar, out code varchar) returns integer
как это сделать правильно на plpgsql?


create function kak_v_oracel(IN a integer, out b_check boolean)
RETURNS boolean
AS
$kak_v_oracel$
BEGIN
   IF a=1 THEN
       b_check:=true;
   ELSE 
         RAISE 'ERROR v pg ne kak v oracel,  -- varhar(5) P0001'; 
   END;
   RETURN;
END;
$kak_v_oracel$;
-----------
SELECT kak_v_oracel(2);


так RAISE это же не возврат значения
RAISE есть и в Pg c тем же синтаксисом:
http://www.postgresql.org/docs/9.3/static/plpgsql-errors-and-messages.html

--Maxim Boguk
www.postgresql-consulting.ru
Konstanrtin
Дата: 27.11.2014 07:01:30
Maxim Boguk
Приведите пример оракловой функции с требуемой функциональностью.

Да сколько угодно можете и сами придумать, главное там такая возможность есть
declare
   account_num varchar2(100);
   address varchar2(300);
   result integer;
begin
  result := get_my_func(123, account_num, address);
  if result <> 0 then
    raise_error 'dsfgfsdfgsdfg';
  else
    do_something_with_account_num_and_address;
  end if;
end;

получается в pg никак?
Konstanrtin
Дата: 27.11.2014 07:08:24
kak_v_oracel, Ваш пример не подходит, т.к. нужно несколько out параметров и один integer в returns, чтобы вызывать i := get_func(111, a, b);
kak_v_oracel
Дата: 27.11.2014 08:14:49
Konstanrtin
kak_v_oracel, Ваш пример не подходит, т.к. нужно несколько out параметров и один integer в returns, чтобы вызывать i := get_func(111, a, b);


мальчик, ты тупой ?
тебе дали ссылку 16910607 -- делай чо хошь

PS много полей возвращаются как "returns record"



PPS и имей в виду, дурачок, -- параметры, в т.ч. inout передаются в пж по значению
поэтому все твои выбоины с неявной передачей якобы через out параметры не пройдут. после вызова надо явно присваивать переменным текущего контекста поля возврата.
Konstanrtin
Дата: 27.11.2014 10:23:50
kak_v_oracel
PS много полей возвращаются как "returns record"

так тоже не подходит, хотя я надеелся что в pg есть такое просто я не нашел

P.S. можно не словоблудить как ты, д..., а просто написать - "так нельзя в pg"
vyegorov
Дата: 27.11.2014 11:37:19
Konstanrtin
... а просто написать - "так нельзя в pg"

Можно! В PostgreSQL можно больше, чем в ORACLE — однозначно. Вот только постановка задачи несколько завуалирована, потому и блуждаем.
Думается, что если все же вы потратите свое время и почитаете документацию, то все найдете.

Тут много примеров что PostgreSQL может для PL/SQL функций: http://www.postgresql.org/docs/current/interactive/xfunc-sql.html
Аналогичное можно делать и на других языках, из которых PL/pgSQL (вкупе с PL/SQL) является стандартным: http://www.postgresql.org/docs/current/interactive/plpgsql.html