powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно передать в PL/pgSQL функцию композитный тип?
8 сообщений из 8, страница 1 из 1
Как правильно передать в PL/pgSQL функцию композитный тип?
    #34776201
MaxI_PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу передать в функцию на PL/pgSQL композитный тип:
CREATE TYPE "dbkernel_mdt"."t_object_attrs" AS (
"tb_attrs_names" VARCHAR[],
"tb_attrs_codes" VARCHAR[],
"tb_attrs_types" BIGINT[]
);
Не могу понять как это сделать..
Раньше писал на PL/SQL, на нем я бы мог просто создать анонимный PL/SQL блок там тип подекларить и там же его заполнить и вызвать мою процедурку, в которую передаю этот тип.
Как сие реализовать на PL/pgSQL?
...
Рейтинг: 0 / 0
Как правильно передать в PL/pgSQL функцию композитный тип?
    #34779358
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
наверное так и передавать...

CREATE OR REPLACE FUNCTION "dbkernel_mdt"."function1_test" (arg1 "dbkernel_mdt"."t_object_attrs") RETURNS "pg_catalog"."void" AS
$body$
DECLARE
BEGIN

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
...
Рейтинг: 0 / 0
Как правильно передать в PL/pgSQL функцию композитный тип?
    #34779370
MaxI_PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в том, что я не могу понять, как мне заполнить этот тип для передачи в функцию?
Просто в PL/SQL я могу написать что-то вроде:
DECLARE
attr dbkernel_mdt.t_object_attrs;
BEGIN
attr.tb_attrs_names[0]:='Name1';
attr.tb_attrs_names[1]:='Name2';
attr.tb_attrs_codes[0]:='Code1';
attr.tb_attrs_codes[1]:='Code2';
attr.tb_attrs_types[0]:=10;
attr.tb_attrs_types[1]:=20;

dbkernel_mdt.myfunc(attr);

END;

То есть просто с клиента отправляю это на сервер и все работает на ура.
Я не могу понять как мне заполнить этот тип для передачи в свою процедурку. Неужели придется создавать еще одну, выполнить, а потом дропнуть??? Это извращение, по-моему должен быть другой человеческий способ.
...
Рейтинг: 0 / 0
Как правильно передать в PL/pgSQL функцию композитный тип?
    #34779599
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для Оракле PL/SQL - родной язык.
Postgresql не знает ничего кроме SQL, расширенного некоторыми специфическими коммандами.
PL/pgSQL - это только подключаемый адаптированный язык для написания функций.

Могу только предложить написать PL/pgSQL функцию , которая использует
PL/pgSQL команду EXECUTE command-string [ INTO [STRICT] target ];
где параметром будет строка с требуемым кодом.
...
Рейтинг: 0 / 0
Как правильно передать в PL/pgSQL функцию композитный тип?
    #34779618
ЯЕХХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да всё просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select function1_test(
  (
    ARRAY['hello','world'],
    ARRAY['превед','медвед'],
    ARRAY[ 33 , 44 ]
  )::"dbkernel_mdt"."t_object_attrs"
);

...
Рейтинг: 0 / 0
Как правильно передать в PL/pgSQL функцию композитный тип?
    #34780067
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЯЕХХДа всё просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select function1_test(
  (
    ARRAY['hello','world'],
    ARRAY['превед','медвед'],
    ARRAY[ 33 , 44 ]
  )::"dbkernel_mdt"."t_object_attrs"
);


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


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select function1_test(
  "dbkernel_mdt".create_object_attrs(array['hello', 'world'], array['превед', 'медвед'], array[ 33 , 44 ]));

CREATE OR REPLACE FUNCTION "dbkernel_mdt".create_object_attrs(varchar[], varchar[], bigint[]) RETURNS "dbkernel_mdt"."t_object_attrs" AS
$body$
DECLARE
  tb_attrs_names ALIAS FOR $ 1 ;
  _result "dbkernel_mdt"."t_object_attrs";
BEGIN
  _result.tb_attrs_names := tb_attrs_names;
  ...
  RETURN _result; 
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
что-то типа того.
...
Рейтинг: 0 / 0
Как правильно передать в PL/pgSQL функцию композитный тип?
    #34781013
djon_mnemonik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй так

select * from dbkernel_mdt.function1_test('("{''dfgdfsg'',''258dfg''}","{''dfgdfsg'', ''258dfg''}","{10,20}")'::dbkernel_mdt.t_object_attrs);


P.S.djon_mnemonik
...
Рейтинг: 0 / 0
Как правильно передать в PL/pgSQL функцию композитный тип?
    #34782381
MaxI_PM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо.
Разобрался =)
На PL/SQL все проще однако... Ну что же - вот они трудности миграции.
Еще раз спасибо, вопросы еще обязательно возникнут =)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как правильно передать в PL/pgSQL функцию композитный тип?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]