Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
Добрый день! Решили перейти с Оракла на Postgre и здесь образовалась такая небольшая проблемка. Есть тип: CREATE TYPE any_ids_table AS (any_ids_table integer[]); Также имеется функция: CREATE OR REPLACE FUNCTION cash_sum(atmids any_ids_table) RETURNS SETOF cash_type_table AS ... Как вызвать результат функции? Пример вызова из Оракла: select * from table(CASH_SUM(any_ids_table('100048','100045'))); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:09 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRamselect * from table(CASH_SUM(any_ids_table('100048','100045'))); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:13 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
vyegorov, ERROR: function any_ids_table(unknown, unknown) does not exist LINE 1: select * from CASH_SUM(any_ids_table('100048','100045')); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:15 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRam, Также select * from CASH_SUM('100048','100045)); ERROR: unterminated quoted string at or near "'100045));" LINE 1: select * from CASH_SUM('100048','100045)); Не получается также если прописать ARRAY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:18 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRam, Про работу с композитными типами в доках много . В данном случае композитный тип не нужен, ПЖ поддерживает массивы и так : Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:29 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
vyegorov, vyegorov, ERROR: function cash_sum(integer[]) does not exist LINE 1: SELECT * FROM cash_sum('{100048, 100045}'::int[]); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:33 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
vyegorovAndRam, Про работу с композитными типами в доках много . В данном случае композитный тип не нужен, ПЖ поддерживает массивы и так : Код: sql 1. 2. 3. 4. 5. У нас в Оракле просто практически вся система сделана через композитные типы. Не хотелось бы от них избавляться - это очень много доп. работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:39 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. и да , композит -- это композит [row|record]. а array -- это array. не надо путать одно с другим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:45 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRam, Композитный тип не есть массив, так что я бы рассмотрел вариант сделать всё как следует. Вам надо выбрать значение нужного типа (`SELECT ...`), а потом уже выражение `...` подставить в вызов функции "как есть". У меня это работает: Код: sql 1. 2. Соответственно: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 14:51 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
vyegorovAndRam, Композитный тип не есть массив, так что я бы рассмотрел вариант сделать всё как следует. Вам надо выбрать значение нужного типа (`SELECT ...`), а потом уже выражение `...` подставить в вызов функции "как есть". У меня это работает: Код: sql 1. 2. Соответственно: Код: sql 1. Спасибо! Кажется заработало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2016, 15:00 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
Добрый день! Теперь проблема как запихать в функции переданный тип в запрос: CREATE OR REPLACE FUNCTION cash_sum (atmids any_ids_table) RETURNS SETOF CASH_TYPE_TABLE AS $body$ BEGIN RETURN QUERY SELECT sum(v.cash) AS cash , 0, get_currency_id(v.dic_currency__id) FROM ( SELECT * FROM ... WHERE t.atm__id in (select atmids) ) GROUP BY v.dic_currency__id; END; $body$ LANGUAGE PLPGSQL; В данном примере выдает: ERROR: operator does not exist: bigint = any_ids_table LINE 10: AND t.atm__id in (select atmids) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 11:31 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRam, Вот первая мысль — сначала мучаетесь, как бы это всё так свернуть, чтобы функцию вызвать. Теперь мучаетесь, как бы развернуть это всё обратно. И всё ради того, чтобы "поменьше кода править". Мне кажется, что-то это странный подход... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 11:58 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
Так читабельнее будет: AndRamCREATE OR REPLACE FUNCTION cash_sum (atmids any_ids_table) RETURNS SETOF CASH_TYPE_TABLE AS $body$ BEGIN RETURN QUERY SELECT sum(cash) AS cash , 0, get_currency_id(dic_currency__id) FROM atm WHERE atm__id in (select atmids) GROUP BY dic_currency__id; END; $body$ LANGUAGE PLPGSQL; Так же еще вопросы: Есть ли какая-нибудь подробная документация по использованию композитных табличных типов и какие команды при этом используются, типа FIRST, LAST и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:02 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRam, По существу: т.к. вы только запрос вызываете, то вам не нужен plpgsql, тут функции на sql будет достаточно. sql предпочтительней, т.к. планировщик его "видит" и может оптимизировать, любой другой PL -- чёрный ящик конструкции ANY / ALL / SOME в ПЖ заточены под массивы, попробуйте что-то вроде: WHERE t.atm__id = ANY ( ($1).any_ids_table ) -- вам надо обратиться к колонке в записи, коей является сложный тип. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:05 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
vyegorovAndRam, Вот первая мысль — сначала мучаетесь, как бы это всё так свернуть, чтобы функцию вызвать. Теперь мучаетесь, как бы развернуть это всё обратно. И всё ради того, чтобы "поменьше кода править". Мне кажется, что-то это странный подход... Конечно это извращение, но альтернатива намного хуже. Подобных функций очень много и они используются и внутри кода и при вызове из приложения и в отчетах. Практически весь код в Oracle идет через подобные типы и внутри идет пошаговая обработка внутри типа, поэтому переделывать их неохота. К тому же хотелось бы знать работу postgre с подобными типами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:11 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRamДобрый день! Решили перейти с Оракла на Postgre и здесь образовалась тa... Сочувствую, мы тоже рассматривали перевод части функционала, но выяснилось, что мороки пока что больше, чем плюсов. Решили подождать 10-ю версию в надежде, что п-г несколько повзрослеет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:12 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
JonhsonAndRamДобрый день! Решили перейти с Оракла на Postgre и здесь образовалась тa... Сочувствую, мы тоже рассматривали перевод части функционала, но выяснилось, что мороки пока что больше, чем плюсов. Решили подождать 10-ю версию в надежде, что п-г несколько повзрослеет ф топег приглашаедся г--н Лавров со своим бессмертным мемом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:21 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
qwwqJonhsonпропущено... Сочувствую, мы тоже рассматривали перевод части функционала, но выяснилось, что мороки пока что больше, чем плюсов. Решили подождать 10-ю версию в надежде, что п-г несколько повзрослеет ф топег приглашаедся г--н Лавров со своим бессмертным мемом Проблема в том что если не перейдем с оракла на постгре заказчик откажется от программы. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:31 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
vyegorovAndRam, По существу: т.к. вы только запрос вызываете, то вам не нужен plpgsql, тут функции на sql будет достаточно. sql предпочтительней, т.к. планировщик его "видит" и может оптимизировать, любой другой PL -- чёрный ящик конструкции ANY / ALL / SOME в ПЖ заточены под массивы, попробуйте что-то вроде: WHERE t.atm__id = ANY ( ($1).any_ids_table ) -- вам надо обратиться к колонке в записи, коей является сложный тип. 1) CREATE TYPE cash_type_table AS (cash_type_table cash_type[]); CREATE TYPE cash_type AS (cash_sum bigint, cash_sum2 bigint, dic_currency__id bigint); CREATE TYPE any_ids_table AS (any_ids_table integer[]); 2) CREATE OR REPLACE FUNCTION cash_sum3(atmids any_ids_table) RETURNS SETOF CASH_TYPE_TABLE AS $body$ BEGIN RETURN QUERY SELECT 1,2,3 FROM atm WHERE id = ANY ( ($1).any_ids_table ); END; $body$ LANGUAGE PLPGSQL; 3) SELECT * FROM cash_sum3( (ROW(ARRAY[ 100048, 100045 ]))::any_ids_table ); 4) В результате такая ошибка. ERROR: structure of query does not match function result type DETAIL: Returned type integer does not match expected type cash_type[] in column 1. CONTEXT: PL/pgSQL function cash_sum3(any_ids_table) line 3 at RETURN QUERY ********** Ошибка ********** ERROR: structure of query does not match function result type SQL-состояние: 42804 Подробности: Returned type integer does not match expected type cash_type[] in column 1. Контекст: PL/pgSQL function cash_sum3(any_ids_table) line 3 at RETURN QUERY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:37 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRamqwwqпропущено... ф топег приглашаедся г--н Лавров со своим бессмертным мемом Проблема в том что если не перейдем с оракла на постгре заказчик откажется от программы. :( и правильно сделает. ибо проблема -- не в инструментах (хотя я жуть как не люблю сракел). но в исполнителях. вы зря начали с предубеждений и ограничений. попробуйте переписать пару ф--ий БЕЗ них. посмотрите на результат, помедитируйте. попробуйте ещё раз рано или поздно прилёте к примерному пониманию, как и рыппку съесть и оппу не ободрать. пж очень демократичен к экспериментам, тут не надо штатом ДБА его обследовать после каждой 600. имхо -- везде, где можно обойтись простыми типами , вместо унаследованных -- надо обходиться простыми. везде , где можно уйти от наследства сракела -- надо от него уходить. у вас и без этого будет полно проблем с другим устройством сейвпойнтов, отсутствием внутренних коммитов, эмуляцией автономий и прочими нехорошими привычками, типа strict для каждого select into. (вместо if FOUND then ). и вообще -- у пж масса своих проблем, чтобы тащить в него унаследованные проблемы сшивки старого овнокода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:44 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRamvyegorovAndRam, По существу: т.к. вы только запрос вызываете, то вам не нужен plpgsql, тут функции на sql будет достаточно. sql предпочтительней, т.к. планировщик его "видит" и может оптимизировать, любой другой PL -- чёрный ящик конструкции ANY / ALL / SOME в ПЖ заточены под массивы, попробуйте что-то вроде: WHERE t.atm__id = ANY ( ($1).any_ids_table ) -- вам надо обратиться к колонке в записи, коей является сложный тип. 1) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 12:54 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
AndRamqwwqпропущено... ф топег приглашаедся г--н Лавров со своим бессмертным мемом Проблема в том что если не перейдем с оракла на постгре заказчик откажется от программы. :( ну у нас не так жёстко, поэтому пока мы посмотрим, так скажем а там авось допилят и п-г до чего-то приличного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 14:32 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
Jonhsonа там авось допилят и п-г до чего-то приличного. Не допилят. PostgreSQL развивается без оглядки на другие СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 14:37 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
vyegorovJonhsonа там авось допилят и п-г до чего-то приличного. Не допилят. PostgreSQL развивается без оглядки на другие СУБД. если так, то перспектив вылезти на жирных заказчиков у него мало... жаль. Мне нравится эта субд и чувствую в ней перспективу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2016, 14:42 |
|
||
|
Результаты из функции со своим типом.
|
|||
|---|---|---|---|
|
#18+
qwwqAndRamпропущено... 1) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Не работает. При создании функции ошибка: ERROR: return type mismatch in function declared to return cash_type DETAIL: Final statement returns integer instead of bigint at column 1. CONTEXT: SQL function "cash_sum3" ********** Ошибка ********** ERROR: return type mismatch in function declared to return cash_type SQL-состояние: 42P13 Подробности: Final statement returns integer instead of bigint at column 1. Контекст: SQL function "cash_sum3" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2016, 06:50 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39267241&tid=1997130]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
179ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 286ms |

| 0 / 0 |
