|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
имеется таблица value................row......col ---------------------------------- синий...............1..........1 розовый...........1..........2 голубой...........1..........3 оранжевый.....2..........1 зелёный...........2..........2 как написать запрос который мне вернёт эту таблицу в таком виде сol1...................сol2...........сol3 --------------------------------------------- синий................розовый...голубой оранжевый......зелёный...NULL количество заданных столбцов и строк может быть любым тоесть таблицу надо строить исходя из максимальных ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 09:20 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
kmskmskms, неубедительно можно конечно слепить dynamic sql , но Вы скорее всего пытаетесь построить сферического коня в вакууме Давайте полную постановку задачи, откуда появляются такие таблицы? рождаются из воздуха? Если количество таких таблиц ограничено В каком виде Вы хотите получить результат, (неопределенные таблицы либо в виде sysrefcursor, либо строкой), и что Вы с полученным резултатом будете делать. Скорее всего задача решается по другому и гораздо проще. памятка: HOWTO :: Как правильно задавать вопросы Как мне оформить свое сообщение? Студентам, желающим помощи 1) Полная постановка задачи (без сокращений) 2) Подготовьте тестовые данные, лучше в виде with пример (не ваш случай) в конце 3) Покажите что сделали, что получили, без сокращений. ( лучше не в виде screenshot) 4) используйте Тэги, читать код без них неудобно, правильно оформляйте сообщение Пример подготовленных данных, запроса и вывода. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 10:18 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
таблицы в информационной системе, на которую я не влияю. Результат мне нужен в таком же виде как если бы я сделал обычный SELECT, именно такие запросы отрисовываются в отчётах в виде таблиц. В моей власти только составлять эти запросы. Уверен както через переменные или циклы это можно реализовать ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 12:52 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
kmskmskmsВ моей власти только составлять эти запросы. Уверен както через переменные или циклы это можно реализовать Нет. Это нужен отчёт стиля "шахматка". Если отчётник его не поддерживает - обломись. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 13:04 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
kmskmskms, PRIVATE TEMPORARY TABLE. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 15:13 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
kmskmskms запросы отрисовываются в отчётах в виде таблиц. Подавляющее количество отчеток умеет crosstab, который и является правильным решением задачи. Еще одним подходом к решению может быть динамическая генерация запросов либо в слое-поставщике данных для отчетки, либо в БД (на базе weak ref cursor, пакета dbms_sql или их комбинации). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2021, 16:18 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
хорошо, я могу както создать тип TYPE t_col IS RECORD(...) но с произвольным количеством столбцов переданном в функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 11:46 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
kmskmskms таблицы в информационной системе, на которую я не влияю. Результат мне нужен в таком же виде как если бы я сделал обычный SELECT, именно такие запросы отрисовываются в отчётах в виде таблиц. В моей власти только составлять эти запросы. Уверен както через переменные или циклы это можно реализовать Почему бы не делать обычный SELECT? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 12:27 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
Алымов Анатолий, напишите пример, каким образом это возможно? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 13:13 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
kmskmskms, В общем виде - это невозможно. Максимум, что можно - написать pivot запрос (см. документацию) в виде Код: sql 1.
где 1, 2, 3 - возможные значения в столбце col. Их нужно перечислить явно. Соответственно, если в столбце col у вас месяцы в году, то они будут все время разные, и запрос нужно будет все время менять. А если у вас там, например, филиалы вашей компании, которых всего пять, и новые в следующие 10 лет не появятся, то сойдет и так. Поэтому у вас и просят подробности постановки задачи - в зависимости от задачи, где-то можно будет срезать угол. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 13:23 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
kmskmskms Алымов Анатолий, напишите пример, каким образом это возможно? Не понятно что вы можете сделать. Какими инструментами оперируете. И что в итоге хотите получить. В первом приближении клиентская часть просто выполняется нужный select и получает результат какой ей надо ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 13:45 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY PRIVATE TEMPORARY TABLE. Исходная таблица: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Создаем процедуру: Код: 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.
Выполняем процедуру и затем select из PTT: Код: 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.
Из минусов: 1. процедура автоматом коммитит. 2. PTT хранится в памяти. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 16:16 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY SY PRIVATE TEMPORARY TABLE. 1. процедура автоматом коммитит. 2. PTT хранится в памяти. SY. Два вопросика для общего развития 1. Eсли создать в автономной, будет ли видна TEMPORARY в "основной транзакции". 2. задействуется ли весь механизм undo (сегменты отката) и соответственно redo (насколько я помню, rollback сегменты журнализируются) при выполнении ДМЛ над PRIVATE TEMPORARY TABLE? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 09:45 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
Stax Два вопросика для общего развития 1. Eсли создать в автономной, будет ли видна TEMPORARY в "основной транзакции". 2. задействуется ли весь механизм undo (сегменты отката) и соответственно redo (насколько я помню, rollback сегменты журнализируются) при выполнении ДМЛ над PRIVATE TEMPORARY TABLE? 1. Будет если создать с ON COMMIT PRESERVE DEFINITION. Но автономная не видит незакоммиченные изменения основной. 2. механизм undo (сегменты отката) - да если ON COMMIT PRESERVE DEFINITION (куда PTT UNDO пишется в память или в TEMP - не знаю). REDO - нет PTT хранится в памяти а UNDO либо памяти либо в TEMP. REDO (начиная c 12C) нет и для GTT т.к. GTT хранится в TEMP и GTT UNDO также (начиная c 12C) пишется в TEMP. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 13:10 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY 2. механизм undo (сегменты отката) - да если ON COMMIT PRESERVE DEFINITION (куда PTT UNDO пишется в память или в TEMP - не знаю) SY. спасибо с ТЕМР примерно понятно, я о undo (роллбек сегментам), раз туда пишется, а "блоки" роллбек логируются (поправте если ошибаюсь), то при ДМЛ с PRIVATE TEMPORARY в логи будет будет всетаки инфа записываться? или они (оракл) знают, что ето TEMPORARY и в лог нифига не пишут? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 14:26 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
Stax с ТЕМР примерно понятно, я о undo (роллбек сегментам), раз туда пишется, а "блоки" роллбек логируются (поправте если ошибаюсь), Stax, TEMP tablespace не логируется, память тоже. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 15:30 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY Stax с ТЕМР примерно понятно, я о undo (роллбек сегментам), раз туда пишется, а "блоки" роллбек логируются (поправте если ошибаюсь), Stax, TEMP tablespace не логируется, память тоже. SY. ето (TEMP tablespace не логируется, память тоже) мне понятно не понятно с роллбек инфой, да бог с ней спасибо ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 16:00 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
Stax не понятно с роллбек инфой Temp table UNDO пишется в TEMP tablespace (а для PTT возможно в память). Ни TEMP tablespace ни память не логируется, ergo temp table UNDO не логируется. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 16:34 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SYTemp table UNDO пишется в TEMP tablespace (а для PTT возможно в память). Ни TEMP tablespace ни память не логируется, ergo temp table UNDO не логируется. Это не всегда так, а по умолчанию совсем не так. Подробнее смотрите в документации: Managing Temporary Undo авторBy default, undo records for temporary tables are stored in the undo tablespace and are logged in the redo, which is the same way undo is managed for persistent tables. However, you can use the TEMP_UNDO_ENABLED initialization parameter to separate undo for temporary tables from undo for persistent tables. When this parameter is set to TRUE, the undo for temporary tables is called temporary undo. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 17:15 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SeaGate, Ну если хочешь писать никому не нужные GTT UNDO в REDO то флаг в руки. А вот с PTT и это не выйдет. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 18:19 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY, SYНу если хочешь писать никому не нужные GTT UNDO в REDO то флаг в руки. По умолчанию, будет работать именно так, независимо от того где находится флаг. SYА вот с PTT и это не выйдет. Это не верно. Код: 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. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154.
redo: Код: 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. 81. 82. 83. 84. 85. 86. 87. 88.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 19:45 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SeaGate, Значит был неправ когда решил что если PTT в памяти то и UNDO там же (хотя и сомневался: "куда PTT UNDO пишется в память или в TEMP - не знаю"). У нас temp_undo_enabled=true заложено в new database template. Не знаю почему Oracle решил дефолтное значение false. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2021, 21:23 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SeaGate, Спасибо ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 08:52 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY PRIVATE TEMPORARY TABLE. Соломон, я так и не понял, в чём преимущество подхода с PTT против классических ref cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 12:03 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
andrey_anonymous Соломон, я так и не понял, в чём преимущество подхода с PTT против классических ref cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта? PTT это чисто SQL решение. Конечно если клиент на OCI, java, .NET python, ... "REF cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта" проще. И по большому счету на таких клиентах все что нужно это SELECT T.*,MAX(COL) OVER(PARTITION BY RN) COL_CNT FROM TEST_TBL T ORDER BY RN; Кстати, как с PTT так и с "REF cursor на динамическом sql или даже просто выдачи текста динамического sql на клиента даже при условии, что клиент в состоянии делать два вызова к серверу БД для генерации одного отчёта" мы имеем потенциальный разрыв - SQL генерируется исходя из числа полей - MAX(COL) на момент выдачи SELECT а данные на момент создания PTT/выдачи динамического sql. Т.е. если в промежутке другая сессия закоммитила DELETE TEST_TBL WHERE COL = 3; то PTT/динамический SQL выдаст 3 поля и COL3 будет NULL во всех строках. Так-что по идее надо-бы взять текущий SCN и плясать от него как и в определении числа полей так и выборки данных. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 13:56 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
andrey_anonymous классических ref cursor на динамическом sql ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 14:33 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY PTT это чисто SQL решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 14:34 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
Sayan Malakshinov Implicit Statement Results (DBMS_SQL.RETURN_RESULT) Уж больно оно новомодное. Есть подозрение, что не каждый клиент справится - там апишка на клиенте вроде как своя (get_next_resultset). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 15:52 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
Кобанчег SY PTT это чисто SQL решение. SQL решение в смысле никаких сторонних tools типа Java, C++, .NET... и самое главное мы получаем результат через SELECT. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 20:24 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
Забыл про SQL макро, правда придется форсировать hard parse: Код: 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.
Теперь: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2021, 22:30 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY Забыл про SQL макро, правда придется форсировать hard parse: SY. test_tbl_seq.nextval форсирует hard parse? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 08:41 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
Stax test_tbl_seq.nextval форсирует hard parse? stax Не сам по себе а: Код: plsql 1. 2. 3.
Посему каждый раз имеем новый SQL текст которого нет в shared pool так-что hard parse. Из минусов - пухнущий shared pool. Можно избежать: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Теперь: Код: 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. 81. 82. 83. 84. 85.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 12:52 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
а как объявить функцию в пакете которая возвращает таблицу с заранее неизвестным количеством столбцов? количество столбцов будет известно только внутри функции исходя из содержимого таблицы ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 13:03 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY Не сам по себе а: понял, я проморгал амперсанд .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 13:09 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
kmskmskms а как объявить функцию в пакете которая возвращает таблицу с заранее неизвестным количеством столбцов? количество столбцов будет известно только внутри функции исходя из содержимого таблицы Число столбцов определяется только при hard parse посему что бы не использовалось (ODCI interface, SQL macro, polymorphic table function...) мы будем вынуждены форсировать hard parse для каждого нового числа столбцов что я и показал. Код: 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.
Первый SELECT в shared pool Oracle не находит и выполняет hard parse вызывая SQL macro который конструирует SELECT с четырьмя полями. Затем мы вставляем запись с COL=7 т.е. теперь надо вывести 7 полей. Однако при последующем выполнении идентичного SELECTа (абсолютно идентичный текст) Oracle находит SQL текст в shared pool и использует его. Посему SQL macro (ODCI interface, polymorphic table - любой метод переменного числа полей) не вызывается и последующие выполнения идентичного SELECTа выдадут 4 поля независимо от MAX(COL). А как только мы изменили текст SELECTа и Oracle не находит новый текст в shared pool то выполняется hard parse, вызывается SQL macro который конструирует SELECT с семью полями. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:19 |
|
запрос возвращающий таблицу с произвольным количеством столбцов
|
|||
---|---|---|---|
#18+
SY вызывается SQL macro который конструирует SELECT с семью полями. SY. имхо то что с макро не парсится, ето скорее косяк, чем достоинство добавили б хинт (прагму) парсить в любом случае (независимо от наличия в шаред пуле) ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2021, 14:28 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1879808]: |
0ms |
get settings: |
8ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
41ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
967ms |
get tp. blocked users: |
1ms |
others: | 286ms |
total: | 1317ms |
0 / 0 |