Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
DB2 - вопросы по возврату TABLE из функции, UDT, курсорам, временным таблицам.
|
|||
|---|---|---|---|
|
#18+
Добрый день. Осуществляю переезд с Oracle на DB2 - соответственно перенос ХП, функций и изменения в клиентском приложении. Возник ряд трудностей, уже несколько дней борюсь - прошу Вашей помощи. Есть ограничения клиентского приложения - нет всего исходного кода, поэтому обращение к базе только реализованными методами: -нельзя делать вызов ХП через call, вызов функций только через запросы вида select f_name() from dual; соответственно все реализуется только на функциях. внутри функций можно вызывать ХП. Основная задача написать универсальную функцию - на вход табличной функции приходит текст запроса: select 4 полей (поля разные, таблицы разные, но поля всегда 4). (число 4 для примера, на самом деле около 20.) На выходе соотв. таблица, полученная путем выполнения данного запроса. Очень не хочется делать через временные таблицы, хочется получать результат табличной функцией. Пытался вернуть значение табличной функции 3мя способами: -через User Defined Type -через явный курсор -через неявный курсор (return select...) Но ничего не вышло, посему возникли следующие вопросы: 1. Вопрос по пользовательским типам Возможно ли определить User Defined Type, затем массив таких типов и возвращать его как результат табличной функции? Не получается не то, что массив, даже одиночную типизированную запись вернуть результатом функции. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. автор "F_REC.FLD1" недопустимо в контексте, где оно используется. LINE NUMBER=31. SQLSTATE=42703 2. Возможно ли в табличной функции использовать курсоры? 3. Если да, то возможно результатом табличной функции сделать курсор? Либо записи отобранные курсором, поместить в типизированную переменную и вернуть через result. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 4. Возможно ли как-то получить результат табличной функции таким способом? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. получю авторSQL0104N Обнаружен неправильный элемент ")" после текста "lect * from (sel_sql". Список возможных правильных элементов: "<join_type_without_spec> JOIN <join_operand>". LINE NUMBER=11. SQLSTATE=42601 НО когда я жестко в коде зашиваю RETURN select * from (select f1,f2,f3,f4 from table1); все супер! . 5. Если я использую Global Temporary Table (структура всегда одинаковая, свой tablespace) ее лучше каждый раз создавать в процедуре, функции либо один раз и навсегда создать а в функциях лишь заполнять\очищать? просто во втором варианте непонятно, чем она лучше обычной таблицы. P.S. Прошу прощения за большое кол-во текста - хотелось максимально информативно объяснить проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2012, 18:59 |
|
||
|
DB2 - вопросы по возврату TABLE из функции, UDT, курсорам, временным таблицам.
|
|||
|---|---|---|---|
|
#18+
То есть вы хотите использовать табличную функцию вместо F_NAME()? Код: sql 1. Не получится - табличные функции можно использовать только в таком контексте: Код: sql 1. Потом, кажется, курсоры в теле табличных функций (на SQL) не разрешены. DB2 на какой платформе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2012, 23:32 |
|
||
|
DB2 - вопросы по возврату TABLE из функции, UDT, курсорам, временным таблицам.
|
|||
|---|---|---|---|
|
#18+
mustaccio, авторselect * from table (f_name()); такой вариант меня прекрасно устраивает =) вопрос только как выполнить пришедший строкой запрос выборки в функцию и вернуть его результатом табличной функции, если в табличных функциях нельзя использовать курсоры, execute и т.д. в Oracle было проще. был структурированный тип CREATE OR REPLACE TYPE "SOME_T" as object Код: plsql 1. 2. 3. 4. 5. и тип абстрактной таблицы вышеуказанного типа. Код: plsql 1. дальше была функция Код: plsql 1. в функции объявлялся массив вышеуказанного типа res SOME_T_TABLE := SOME_T_TABLE(); открывался курсор for sel_sql и производилось наполнение массива. получение результата return res; вызов авторselect * from table (f_name()); Пытаюсь что-нибудь подобное реализовать на db2 без временных таблиц. Попробую покурить типизированные массивы UNNEST. db2 пока под win, но планируется перенос под ос\400. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2012, 11:24 |
|
||
|
DB2 - вопросы по возврату TABLE из функции, UDT, курсорам, временным таблицам.
|
|||
|---|---|---|---|
|
#18+
kalupatorОсновная задача написать универсальную функцию - на вход табличной функции приходит текст запроса: select 4 полей (поля разные, таблицы разные, но поля всегда 4). (число 4 для примера, на самом деле около 20.) На выходе соотв. таблица, полученная путем выполнения данного запроса.Если при каждом вызове количество и тип полей всегда одинаков, то вам поможет функция на внешнем языке, таком как C или JAVA. Самый простой способ - на JAVA, т.к. можно скомпилировать на win и использовать тот же самый class файл и для win, и для os/400. Там достаточно просто всё. Unvsl_Tab.java Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. Supported SQL data types in DB2GENERAL routines и соответственно изменить набор вызовов 'set' для каждого типа поля в select. В примере - работа с разными типами полей. Потом из db2cw компилируете класс: Код: plaintext Создаёте функцию: Unvsl_Tab.ddl Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. и работаете: Код: sql 1. Если же у вас при каждом вызове будет разный набор полей и их типы, то в этой версии так делать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2012, 13:53 |
|
||
|
|

start [/forum/topic.php?fid=43&fpage=46&tid=1601897]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 37ms |
| total: | 189ms |

| 0 / 0 |
