|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Обычная потоковая табличная функция, которая используется в SQL запросе с оператором table. Если объектный тип и вложенная таблица определены на уровне схемы, все ок. Если в пакете - выдает ошибку. Вот здесь https://oracle-base.com/articles/misc/pipelined-table-functions нашел: "Regular table functions require named row and table types to be created as database objects.". Но почему - не объясняется. Вопрос 1. Почему так происходит? Интересует суть, почему объявление на уровне пакета не работает, а на уровне схемы - работает. Вопрос 2. Можно ли в примере ниже заменить явное присваивание полей присваиванием на уровне записи с использованием bulk collect? У меня не получилось (из-за того, что если объявить два типа коллекций с одинаковыми определениями, получаем два разных типа данных, и переменные одного типа нельзя присвоить переменным другого типа). Заранее благодарю) Определение на уровне схемы (отрабатывает нормально): Код: 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. 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.
Определение на уровне пакета (выдает ошибку): Код: 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. 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 17:55 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Давно не брал я в руки шашку... ArchiSQL, авторВопрос 1. Почему так происходит? Интересует суть, почему объявление на уровне пакета не работает, а на уровне схемы - работает. By design, смиритесь. Видимо возникнут проблемы с грантами и областями видимости. авторВопрос 2. Можно ли в примере ниже заменить явное присваивание полей присваиванием на уровне записи с использованием bulk collect? У меня не получилось (из-за того, что если объявить два типа коллекций с одинаковыми определениями, получаем два разных типа данных, и переменные одного типа нельзя присвоить переменным другого типа). А если так? Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 09:05 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Павел Воронцов, какой тайный смысл цикла LOOP? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 09:51 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL Если в пакете - выдает ошибку. Мудрить надо меньше. Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 10:50 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
andrey_anonymous, у ArchiSQL ф-ция не PIPELINED и не в пакете ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 10:59 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Stax ф-ция не PIPELINED и не в пакете ЕМНИП, автоматическая генерация типов уровня схемы на основе пакетных типов есть только у pipelined. Впрочем, на сегодня не знаю ни одной причины делать табличную не-pipelined функцию, предназначенную для использования в качестве источника данных для sql-запроса. А что не в пакете - это не важно: Код: 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. 26. 27. 28. 29. 30.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 11:15 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Павел Воронцов А если так? Все было бы хорошо, если бы не: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
А если объявлять RETURN EMP%ROWTYPE; (как у меня) будет несоответствие типов на этапе FETCH CV_IN BULK COLLECT INTO RETVAL; andrey_anonymous, спасибо, посмотрю Ваше решение ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 11:30 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL посмотрю Ваше решение Определние типов для pipelined через курсор очень удобно, но в 18с и 19с oracle накосячил с генерацией типов - генерируются атрибуты с идентификаторами "ATTR_1", "ATTR_2", ... "ATTR_N" вместо определенных курсором. Doc ID 2517404.1 Есть патч и два workarounds, но они описаны в ноте и потому я не могу тут об этом написать, не нарушая правил форума. ..определять тип курсора через table_name%rowtype не очень удачная практика, как по мне. Привязка к конкретной таблице остаётся жесткой. Проще прямо внутри pipelined цикл по конкретной таблице зарядить, если не функция предполагает некоторой доли универсальности. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 11:54 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Stax, Недоглядел. Не вели казнить, отец родной! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 15:28 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL Все было бы хорошо, если бы не: Говорю же - давно я Оркалом не махал. Забыл уже нюансы, от пальцев не отскакивает. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 15:31 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
andrey_anonymous, andrey_anonymous Определние типов для pipelined через курсор очень удобно andrey_anonymous определять тип курсора через table_name%rowtype не очень удачная практика, как по мне. Привязка к конкретной таблице остаётся жесткой. Да, мне Ваше решение понравилось. Привязка к таблице только в одном месте в определении курсора. И для pipelined функции fetch идет на уровне строки, а не отдельно по полям. Насчет использования pipeline вместо потоковой - понял, спасибо. Есть еще один вопрос - в книге Фейштейна сказано: "Prior to Oracle Database 12c, table functions could return only nested tables and VARRAYs. From 12.1, you can also define table fuctions that return an integer-indexed associative array whose type is defined in a package ". По всей видимости речь идет о потоковой табличной функции, т.к. для pipeline: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Сначала хочу сделать пример с потоковой табличной функцией для nested table, потом уже пробовать для associative array. То есть мне нужно сделать потоковую табличную функцию с возвращаемой коллекцией типа nested type, определенной в пакете. И тут как ни пробую получаю invalid datatype. Пример кода: Код: 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. 26. 27. 28. 29. 30. 31. 32.
Пробовал и с созданием объектного типа на уровне схемы, все равно когда коллекция объявлена на уровне пакета, ORA-00902: invalid datatype ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 16:04 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL, andrey_anonymous ЕМНИП, автоматическая генерация типов уровня схемы на основе пакетных типов есть только у pipelined. ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 16:23 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL Сначала хочу сделать пример с потоковой табличной функцией для nested table, потом уже пробовать для associative array. Потоковая = PIPELINED. Вы же упорно делаете просто табличную. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 17:20 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Stax, так в примере выше создаются типы на уровне пакета, но все равно не работает. А когда я создавал тип объекта на уровне схемы, все остальные типы были объявлены на уровне пакета. По сути своей я сделал тоже самое что в первом стартовом сообщении для рабочей версии, только коллекцию запихнул в пакет (а объектный тип оставил на уровне схемы) - и тоже самое сообщение ORA-00902: invalid datatype Очень хочется проверить то о чем писал Фейштейн :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 17:24 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
andrey_anonymous ArchiSQL Сначала хочу сделать пример с потоковой табличной функцией для nested table, потом уже пробовать для associative array. Потоковая = PIPELINED. Вы же упорно делаете просто табличную. В соответствии с книгой Фейштейна (на русском языке), потоковая - обычная; конвеерная - pipelined С pipelined (конвеерной) я привел вышел пример, для которого тип коллекции ассоциативный массив не поддерживается с этим типом табличной функции. Поэтому вариант только один - создать потоковую (обычную) табличную функцию ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 17:26 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL так в примере выше создаются типы на уровне пакета, но все равно не работает. Вероятно, Вы несколько поторопились переходить к Ферштейну. Начните с database concepts, где сможете узнать, что oracle rdbms - в некотором смысле чудовище Франкенштейна, содержащее независимые машины SQL и PL/SQL, каждая - со своими типами данных и механизмами. Потому определение типа в пакете - это тип PL/SQL, а определение типа в схеме - это тип SQL-машины. И они разные. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 17:29 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
andrey_anonymous ArchiSQL так в примере выше создаются типы на уровне пакета, но все равно не работает. Вероятно, Вы несколько поторопились переходить к Ферштейну. Начните с database concepts, где сможете узнать, что oracle rdbms - в некотором смысле чудовище Франкенштейна, содержащее независимые машины SQL и PL/SQL, каждая - со своими типами данных и механизмами. Потому определение типа в пакете - это тип PL/SQL, а определение типа в схеме - это тип SQL-машины. И они разные. Спасибо за совет, концепты читал, все что Вы написали мне хорошо известно) Я лишь хочу попробовать сделать так, как написано в книге - табличная функция возвращающая коллекцию типа ассоциативный массив, определенную в пакете. Реализацию с коллекцией типа nested table на уровне схемы я привел в первом сообщении. Далее привел пример, что написанное в книге нельзя реализовать с pipelined функцией, поэтому нужно брать обычные потоковую функцию. И здесь да, выдает сообщение о несоответствие типов. Но это вовсе не означает, что я не знаю что такое SQL; PL/SQL ядро и то что типы данных используемые в БД и поддерживаемые SQL ядром отличаются от типов данных поддерживаемых PL/SQL ядром. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 17:48 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL Есть еще один вопрос - в книге Фейштейна сказано: "Prior to Oracle Database 12c, table functions could return only nested tables and VARRAYs. From 12.1, you can also define table fuctions that return an integer-indexed associative array whose type is defined in a package ". Версия 12.1 Создаю обычную потоковую табличную функцию возвращающую коллекцию типа ассоциативный массив индексируемый по типу varchar2 (считаем что ename уникальны) уровня пакета. Получаем ошибку на этапе компиляции sql запроса. Код: 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. 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.
Теперь создаю обычную потоковую табличную функцию возвращающую коллекцию типа ассоциативный массив индексируемый по типу pls_integer уровня пакета. Здесь все компилируется успешно как и написано у Фейштейна. Код: 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. 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.
Сейчас остаются неясными 3 вопроса: 1. SQL компилятор выполняет запрос SELECT * FROM TABLE(L_AA_VAR), где L_AA_VAR - ассоциативный массив индексируемый по pls_integer. Почему тогда поле таблицы может иметь тип коллекции только nested table или varray, но не ассоциативный массив. 2. Если для рабочей версии с индексированием по pls_integer я опускаю переменную L_AA_VAR и пишу FOR REC IN (SELECT * FROM TABLE(TYPE_DEF_PKG.TBL_FUNC_AA(CUR_VAR_AA))), то получаю ошибку Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Если через L_AA_VAR, ошибки нет Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
3. В цикле Код: plsql 1. 2. 3. 4. 5.
если я раскомментариваю DBMS_OUTPUT, то выдает ошибку, почему, непонятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 16:52 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL [/src] 3. В цикле Код: plsql 1. 2. 3. 4. 5.
если я раскомментариваю DBMS_OUTPUT, то выдает ошибку, почему, непонятно. как вариант, оптимизатор убрал Ваш пустой цикл for rec зы c пустым циклом желательно не тестировать вместо DBMS_OUTPUT, можете вставить напр i:=i+1; шоб не пустой был +вывод і после цикла ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 17:13 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
[quot Stax#22385978] ArchiSQL как вариант, оптимизатор убрал Ваш пустой цикл for rec зы c пустым циклом желательно не тестировать вместо DBMS_OUTPUT, можете вставить напр i:=i+1; шоб не пустой был +вывод і после цикла ..... stax Да, согласен, это я излишне пообрезал для форума :) Вернул обратно) То что цикл в строках 11-15 выполняется - это понятно, PL/SQL ядро заполняет ассоциативный массив L_AA_VAR вызовом функции TYPE_DEF_PKG.TBL_FUNC_AA(CUR_VAR_AA). В цикле в строках 18-22 источник данных SQL запроса - ассоциативный массив, преобразованный оператором table(). И он выполняется SQL ядром, и поддерживается. Хотя в моем понимании ассоциативный массив не может быть типом данных БД и не может быть отработан SQL ядром, но видимо я ошибаюсь. Кстати, по поводу моего 2 вопроса: http://www.dba-oracle.com/t_plsql_associative_array_example.htm "Note: The function with its return type as an associative array cannot be directly used in the TABLE function and it has to be assigned to a local variable for it to use the TABLE function as shown in the below example." Почему - не объясняется. И там же идет вывод через DBMS_OUTPUT.PUT_LINE (мой 3 вопрос). Если я расскомментирую вывод, получаю ошибку: ERROR at line 21: ORA-06550: line 21, column 32: PLS-00302: component 'EMPNO' must be declared ORA-06550: line 21, column 7: PL/SQL: Statement ignored Код: 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. 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 08:30 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL Почему - не объясняется. 22385407 оракля втихаря создает (создавал) SQL тип, аля SYS_PLSQL_123456_78_1 , возможно Вы нарвались на баг, посмотрите шо возвращает ("структуру") SELECT * FROM TABLE(L_AA_VAR) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 09:00 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Stax ArchiSQL Почему - не объясняется. 22385407 оракля втихаря создает (создавал) SQL тип, аля SYS_PLSQL_123456_78_1 , возможно Вы нарвались на баг, посмотрите шо возвращает ("структуру") SELECT * FROM TABLE(L_AA_VAR) ..... stax Sql запрос не в pl/sql блоке не отрабатывает. А как еще посмотреть структуру - пока нет идей. Код: plsql 1. 2. 3. 4. 5. 6.
Но это не отменяется того факта, что sql ядро обрабатывает запрос SELECT * FROM TABLE(L_AA_VAR) внутри анонимного pl/sql блока. А это возможно в 3 случаях: 1. Использование существующих типов коллекций odcinumberlist, odcivarchar2list 2. Явное создание типа коллекции на уровне схемы create type 3. Пакетное определение типа коллекции (мой случай), в котором оракл автоматически создает внутренний тип данных на уровне схемы. Кстати, мой пример кода в прошлом сообщении показывает, что автоматическая генерация типов уровня схемы произошла для обычной табличной функции, не pipelined. andrey_anonymous ЕМНИП, автоматическая генерация типов уровня схемы на основе пакетных типов есть только у pipelined. Возможно я где-то ошибаюсь, было бы интересно услышать комментарии andrey_anonymous на этот счет ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 09:30 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL Sql запрос не в pl/sql блоке не отрабатывает. А как еще посмотреть структуру - пока нет идей. dbms_sql ps XML ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 09:58 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
Stax ArchiSQL Sql запрос не в pl/sql блоке не отрабатывает. А как еще посмотреть структуру - пока нет идей. dbms_sql А что для парсинга передавать? Коллекция L_AA_VAR генерирует свой внутренний тип на уровне схемы, какое у него название и где его найти - под sys наверное в словаре данных должен быть То есть код ниже не пройдет если передавать влоб SELECT * FROM TABLE(L_AA_VAR) Код: 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. 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 11:59 |
|
Пару вопросов по табличной функции
|
|||
---|---|---|---|
#18+
ArchiSQL уровне схемы, какое у него название и где его найти - под sys наверное в словаре данных должен быть https://community.oracle.com/tech/developers/discussion/2286500/object-of-type-sys-plsql-how-to-determine-association-to-pkg-or-prc на работе я от оракла (почти) отключен, многое пробовать не могу наскоко помню, в v$sql видно название типа, но могу ошибатся, давно было зы Узнать имя пакета, в котором содержится тип record ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2021, 12:19 |
|
|
start [/forum/topic.php?fid=52&msg=40105438&tid=1879803]: |
0ms |
get settings: |
28ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
72ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
559ms |
get tp. blocked users: |
1ms |
others: | 306ms |
total: | 1000ms |
0 / 0 |