Как передать параметр для функции, содержащей входную переменную типа varchar (2) ARRAY [50] в postgresql - PullRequest
0 голосов
/ 29 апреля 2020

Это пользовательский тип и функция

CREATE TYPE test AS (test varchar(2) ARRAY[50]);
create function my_function(p_ste INOUT test ) returns text language plpgsql as $$
begin
  return p_ste ;
end;
$$;

Как передать параметр при вызове функции?

1 Ответ

0 голосов
/ 29 апреля 2020

Функция может иметь только входной параметр (ключевое слово IN, которое фактически необязательно): вы не можете использовать INOUT.

Для этого сценария вы можете объявить параметр функции с только что созданным именем типа. Пример:

Со следующим вводом:

create type my_type as(field varchar(2) array[50]);
create table my_table(c1 serial, c2 my_type);
insert into my_table(c2) values (row(array ['aa', 'bb' ]));
insert into my_table(c2) values (row(array ['cc', 'dd' ]));
select * from my_table;
--
create function my_function(p_val my_type) returns my_type 
language plpgsql 
as $$
begin
 p_val.field = (array['ok','ok']);
 return p_val;
end;
$$;
--
create procedure my_proc ()
language plpgsql
as $$
declare
 l_var1 my_table;
 l_var2 my_table;
begin
 select c2 into l_var1.c2 from my_table limit 1;
 raise notice 'input value=%', l_var1.c2;
 select my_function(l_var1.c2) into l_var2.c2;
 raise notice 'returned value=%', l_var2.c2;
end;
$$;

У меня есть следующий вывод:

create type my_type as(field varchar(2) array[50]);
CREATE TYPE

create table my_table(c1 serial, c2 my_type);
CREATE TABLE

insert into my_table(c2) values (row(array ['aa', 'bb' ]));
INSERT 0 1

insert into my_table(c2) values (row(array ['cc', 'dd' ]));
INSERT 0 1

select * from my_table;
 c1 |     c2      
----+-------------
  1 | ("{aa,bb}")
  2 | ("{cc,dd}")
(2 rows)

create function my_function(p_val my_type) returns my_type 
language plpgsql 
as $$
begin
 p_val.field = (array['ok','ok']);
 return p_val;
end;
$$;
CREATE FUNCTION

create procedure my_proc ()
language plpgsql
as $$
declare
 l_var1 my_table;
 l_var2 my_table;
begin
 select c2 into l_var1.c2 from my_table limit 1;
 raise notice 'input value=%', l_var1.c2;
 select my_function(l_var1.c2) into l_var2.c2;
 raise notice 'returned value=%', l_var2.c2;
end;
$$;
CREATE PROCEDURE

call my_proc();
psql:tt.sql:74: NOTICE:  input value=("{aa,bb}")
psql:tt.sql:74: NOTICE:  returned value=("{ok,ok}")
CALL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...