|
View и параметры
|
|||
---|---|---|---|
#18+
Добрий день всем! Прошу помощи. Есть сложный View, который должен вызываться с параметрами. Сейчас это реализовано через временную таблицу. Перед вызовом View заносятся значения в таблицу и после вызывается View. Все работает отлично, но проблема в том, что вьюшку нужно вызывать одним запросом. Попробовал через функцию Код: plsql 1.
Но проблема в том, что сначала выполняется View, а уже потом заноситься значения во временную таблицу. Как можно решить эту проблему? Или как в одном запросе сначала заносить данные во временную таблицу, а потом вызывать View? Использовать табличные функции, пока, не очень хочеться. Укажите направление куда копать. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 10:30 |
|
View и параметры
|
|||
---|---|---|---|
#18+
123йй, Если другого пути не будет, то придется делать табличную функцию. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 11:08 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW 123йй, Если другого пути не будет, то придется делать табличную функцию. :( в табличную как данные передатите? ps можно глянуть в сторону контекста, но ето не решает задачу .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 11:35 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW, С 19.6 Код: plsql 1.
Regards Maxim ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 11:51 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Stax, А какие проблемы передать параметр в функцию? Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 12:23 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Maxim Demenko, Можно, пожалуйста, детальнее. Не понял идею. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 12:27 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW, https://blog.sqlora.com/en/parameterized-views-in-oracle-no-problem-with-sql-macros/ Regards Maxim ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 12:41 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW Stax, А какие проблемы передать параметр в функцию? Код: plsql 1.
где тут вью? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 13:42 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Maxim Demenko SergiiW, С 19.6 Код: plsql 1.
Regards Maxim можете привести манюсенький пример create view с return varchar2 SQL_MACRO для пользования как параметр и как тогда вьюшку вызывать ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 13:46 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiWКак можно решить эту проблему? Например, можно вернуться к истокам и прочитать что такое view и как его используют. Вы явно пытаетесь делать это совершенно извращённым способом. Обычно параметры передают запросу, который использует view: Код: sql 1.
А уж СУБД сама пропихнёт их внутрь. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 13:56 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Stax, там же по ссылке примеры , ну вот еще на моей 19.7 Код: 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.
Regards Maxim ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 14:05 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Maxim Demenko, так понятно, но ето ж не совсем вью ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 15:43 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Stax, Так pipelined function тоже не совсем вью ... Но кмк ТС такое надо - если конечно версия позволяет Regards Maxim ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 16:25 |
|
View и параметры
|
|||
---|---|---|---|
#18+
[quot Maxim Demenko#22274894] так я и для pipelined не понимал как они собираюся параметризировать вью имхо пока-что передать параметр во вью нельзя напр select * from view_p using xxx,yyy where ... ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 16:42 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Stax, Вью используется в функции. Функция возвращает результат работы вью. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 16:56 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Уважаемый, если бы все решалось "where field=:param" я бы даже не писал в форум. field не выводиться в поля вью. Да, можно вывести, но в этом случае выполнение вью заняло бы сутки, если не месяцы. Параметры используются в рекурсивных запросах и даже вывести их в поля вью будет сложно, а фильтровать по ним - это повеситься. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 17:02 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Maxim Demenko, спасибо! До сих пор не знал про такую возможность. Но, к сожалению, к моему случаю это не применимо. Можно изменить скрипт, который основан на вью, но невозможно изменить саму вью или передать ей параметры. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 17:05 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Возможно кто знает, как одним запросом внести данные в таблицу или установить переменные сессии, пакета и получить результат SELECT? MySql это делается просто (Inset ...; Select ...), а в oracle - даже не представлю. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 17:16 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW, Откуда возникает ограничение на один запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 18:03 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW Stax, Вью используется в функции. Функция возвращает результат работы вью. всеравно внутри функции параметр во вью не передать ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 18:11 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW Возможно кто знает, как одним запросом внести данные в таблицу или установить переменные сессии, пакета и получить результат SELECT? MySql это делается просто (Inset ...; Select ...), а в oracle - даже не представлю. Я создавал функцию вида Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
И потом выполнял запрос Код: plsql 1.
Работало. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 19:01 |
|
View и параметры
|
|||
---|---|---|---|
#18+
env Откуда возникает ограничение на один запрос? Такие условия, к сожалению, изменить сложно. 1. Есть готовая программа, которая оперирует только одним запросом. 2. Нужно получать эти данные в MS Excel через ODBC. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 21:10 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Stax все равно внутри функции параметр во вью не передать stax Внутри функции я сохраняю параметры во временную таблицу, а затем вызываю вью, которая уже использует эту временную таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 21:12 |
|
View и параметры
|
|||
---|---|---|---|
#18+
va_kochnev SergiiW Возможно кто знает, как одним запросом внести данные в таблицу или установить переменные сессии, пакета и получить результат SELECT? MySql это делается просто (Inset ...; Select ...), а в oracle - даже не представлю. Я создавал функцию вида Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
И потом выполнял запрос Код: plsql 1.
Работало. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 21:16 |
|
View и параметры
|
|||
---|---|---|---|
#18+
va_kochnev, Еще раз спасибо! Все получилось. Но остался вопрос, уже ради любопытства. Можно ли в оракле одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2021, 22:17 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW Можно ли в оракле одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT? Так и не увидел ответа на вопрос: откуда взялось ограничение на ОДИН ЗАПРОС? Что мешает открыть транзакцию, выполнить в ней пачку запросов и закрыть транзакцию? Или понятие транзакции не знакомо? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 00:19 |
|
View и параметры
|
|||
---|---|---|---|
#18+
va_kochnev SergiiW Возможно кто знает, как одним запросом внести данные в таблицу или установить переменные сессии, пакета и получить результат SELECT? MySql это делается просто (Inset ...; Select ...), а в oracle - даже не представлю. Я создавал функцию вида Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
И потом выполнял запрос Код: plsql 1.
Работало. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 02:39 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Правильный Вася SergiiW Можно ли в оракле одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT? Так и не увидел ответа на вопрос: откуда взялось ограничение на ОДИН ЗАПРОС? Правильный Вася Что мешает открыть транзакцию, выполнить в ней пачку запросов и закрыть транзакцию? Или понятие транзакции не знакомо? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 07:55 |
|
View и параметры
|
|||
---|---|---|---|
#18+
xtender если внутри вьюхи есть предикаты с этими переменная_сессии1,переменная_пакета2, то это не очень надежное решение, зависящее от того будет ли предикат " set_param('параметр1',999,sysdate) is null " вынесен на самый верхний фильтр (отдельная операция FILTER в плане) и, что в случае, если там таких будет несколько, то он выполнится первым - чего, естественно, никто не гарантирует. Код: plsql 1.
Только такое использование и планируется. Что именно тут может пойти не так? Если это решение не очень надежное (почему?), то что можете предложить лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 08:04 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW va_kochnev, Еще раз спасибо! Все получилось. Но остался вопрос, уже ради любопытства. Можно ли в оракле одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT? Наверное, можно в предложенную функцию добавить автономную транзакцию и в ней порезвиться от всей души. Но эти решения, с использованием в запросе функции инициализации, от безысходности, т.к. неизвестно, что придет в голову оптимизатору в каждом конкретном случае. Если есть малейшая возможность вынести подготовительную часть отдельно перед выполнением запроса, как коллеги и советуют, то лучше так и делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:08 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW Да будет вынесен на самый верх. Речь не о синтаксисе вызова. За SergiiW более 25 лет SQL можно было бы освоить планы запросов и понять, что речь идёт о порядке применения предикатов. Подумайте, что вернёт вью, если этот предикат отработает последним (верхним элементом плана). Надёжнее сделать, как уже советовали, pipeline функцию и обращаться к ней вместо вью. SergiiW одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT Не возникает такой необходимости. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:42 |
|
View и параметры
|
|||
---|---|---|---|
#18+
env можно было бы освоить планы запросов и понять, что речь идёт о порядке применения предикатов. Подумайте, что вернёт вью, если этот предикат отработает последним (верхним элементом плана). Теперь понял о чем речь. ок. Да, такая вероятность есть, но, предположу, что если при отладке все будет нормально, то вероятность, что что-то дальше пойдет не так - очень мала. Хотя, наверно, согласен, что это не совсем надежно. pipeline, пока, не хочу применять. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:48 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW если при отладке все будет нормально, то вероятность, что что-то дальше пойдет не так - очень мала Не зная ваше распределение данных, период актуализации статистики, характер изменения данных в исходных таблицах - сложно согласиться или опровергнуть ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 09:57 |
|
View и параметры
|
|||
---|---|---|---|
#18+
env Не зная ваше распределение данных, период актуализации статистики, характер изменения данных в исходных таблицах - сложно согласиться или опровергнуть Функция не выполняется. Но почему она может не выполнятся? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Притом поведение очень странное, как по мне. Код: plsql 1.
Не выполняется. Результат NULL Код: plsql 1.
Выполняется. Результат 01.12.2020 00:00:00 Код: plsql 1.
Выполняется. Результат 01.12.2020 00:00:00 Выполнял несколько раз подряд на одном соединении. Результат не меняется. Почему это зависит от того какое сравнение использовать "= 1" или "!= 0"? Или мои действия какие-то неправильные (какие?) или Оракал очень странно работает. На всякий случай приведу версию: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production PL/SQL Release 12.2.0.1.0 - Production CORE 12.2.0.1.0 Production TNS for Linux: Version 12.2.0.1.0 - Production NLSRTL Version 12.2.0.1.0 - Production ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 11:44 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW подряд От кеширования результата поcле первого вызова, до применения на разных шагах плана. С fast dual вообще много забавного можно получить. В плане на каком уровне фильтр оказывается, смотрели? упд. поменяйте местами вызовы с = 1 и != 0 и выполните в новой сессии. Думаю, эффект будет тот же. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 11:53 |
|
View и параметры
|
|||
---|---|---|---|
#18+
env SergiiW подряд От кеширования результата поле первого вызова, до применения на разных шагах плана. С fast dual вообще много забавного можно получить. В плане на каком уровне фильтр оказывается, смотрели? упд. поменяйте местами вызовы с = 1 и != 0 и выполните в новой сессии. Думаю, эффект будет тот же. 1. Почему кеширование используется только для = 1, но не используется для != 0 2. Не понял по поводу поменять? Что с чем? Все проверки я начинаю в новой сессии! Проверяю по несколько раз - результат не меняется. 3. Посмотрел планы запросов - один в один. Ничем не отличаются. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 12:05 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW, Порядок выполнения первых двух запросов поменяйте. Нет никакой разницы будет ли первым = 1 или != 0. Функцию можно расценивать как deterministic, чем похоже у вас оптимизатор и воспользовался. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 12:08 |
|
View и параметры
|
|||
---|---|---|---|
#18+
env SergiiW, Порядок выполнения первых двух запросов поменяйте. Нет никакой разницы будет ли первым = 1 или != 0. Функцию можно расценивать как deterministic, чем похоже у вас оптимизатор и воспользовался. Очень похоже на то, что используется deterministic. Как можно указать не использовать deterministic? Почему для =1 он используется, а для !=0 нет? Постите, но я не понимаю как можно поменять порядок не связанных действий. :( 1. Открываю сессию 2. Выполняю запрос. Много раз. Результат не меняется. 3. Закрываю сессию. Это я проделываю много раз отдельно для запросов =1 и !=0. Самый первый раз был запрос =1. Потом все было по многу раз. Результата не меняется. К стати. Добавил в функцию еще один параметр и передаю в него текущую дату (SYSDATE). Надеялся, что это сбросит кеш. Без изменений. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 12:17 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW, Ещё раз. Постулат SergiiW Почему для =1 он используется, а для 1=0 нет? неверный. Он используется при повторных вызовах. В вашем случае при вызовах сначала идёт выборка и вычисление выражения sys_context, потом применяется фильтр по вызову функции, т.к. он не влияет на получение данных. Поэтому первая выборка даёт null независимо от условия =1 или !=0. В повторных вызовах оптимизатор вычисляет выражение, полученное установкой контекста в первом вызове. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 12:27 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW Добавил в функцию еще один параметр и передаю в него текущую дату (SYSDATE). Надеялся, что это сбросит кеш. Если он не используется, то оптимизатор его с лёгкостью выкинет. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 12:28 |
|
View и параметры
|
|||
---|---|---|---|
#18+
env SergiiW, Ещё раз. Постулат SergiiW Почему для =1 он используется, а для 1=0 нет? неверный. Он используется при повторных вызовах. В вашем случае при вызовах сначала идёт выборка и вычисление выражения sys_context, потом применяется фильтр по вызову функции, т.к. он не влияет на получение данных. Поэтому первая выборка даёт null независимо от условия =1 или !=0. В повторных вызовах оптимизатор вычисляет выражение, полученное установкой контекста в первом вызове. Еще раз. 1. Открываю сессию. sys_context = NULL 2. запускаю запрос !=0. sys_context = 01.12.2020. Не зависимо сколько раз запустил. То есть, функция выполняется. 3. Закрываю сессию. 1. Открываю сессию. sys_context = NULL 2. запускаю запрос =1. sys_context = NULL. Не зависимо сколько раз запустил. То есть, функция НЕ выполняется. По всей видимости, результат функции берется из кеша. Не уверен, но другого предположения нет. 3. Закрываю сессию. Почему для =1 используется кеш, а для !=0 кеш не используется? И почему для запроса =1 изменения параметров функции (ставлю другую дату) все равно используется кеш? Ранее этой даты никогда не было!!! Как убрать кеш для запроса =1? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 12:39 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW 2. запускаю запрос =1. sys_context = NULL . = null или is null? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 13:40 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Stax = null или is null? ..... stax Это значит что результат работы скрипта Код: plsql 1.
строка со значением в поле результата NULL (IS NULL). Но строка есть, условие WHERE выполняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 13:45 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW, Продемонстрируйте независимыми листингами из sqlplus. У меня на всех доступных версиях никаких отличий для = 1 и != 0 нет. Ну и как уже говорили, поведение такого механизма не гарантируется. Используйте pipeline, раз не можете выполнить заполнение контекста и вызов запроса последовательно в одной сессии. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 15:04 |
|
View и параметры
|
|||
---|---|---|---|
#18+
А анонимный кодовый блок типа Код: plsql 1. 2. 3. 4. 5.
через ODBC-драйвер вызвать нельзя так, чтоб результат SELECT'а в датасет вернулся? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2021, 23:52 |
|
View и параметры
|
|||
---|---|---|---|
#18+
SergiiW Возможно кто знает, как одним запросом внести данные в таблицу или установить переменные сессии, пакета и получить результат SELECT? MySql это делается просто (Inset ...; Select ...), а в oracle - даже не представлю. В Oracle тоже можно: https://oracle-base.com/articles/12c/implicit-statement-results-12cr1 т.е просто вместо запроса выполняйте такой блок: Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 01:44 |
|
View и параметры
|
|||
---|---|---|---|
#18+
Правильный Вася А анонимный кодовый блок типа Код: plsql 1. 2. 3. 4. 5.
через ODBC-драйвер вызвать нельзя так, чтоб результат SELECT'а в датасет вернулся? Так нельзя - ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 09:41 |
|
View и параметры
|
|||
---|---|---|---|
#18+
xtender SergiiW Возможно кто знает, как одним запросом внести данные в таблицу или установить переменные сессии, пакета и получить результат SELECT? MySql это делается просто (Inset ...; Select ...), а в oracle - даже не представлю. В Oracle тоже можно: https://oracle-base.com/articles/12c/implicit-statement-results-12cr1 т.е просто вместо запроса выполняйте такой блок: Код: plsql 1. 2. 3. 4. 5. 6. 7.
То что нужно! Спасибо!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.02.2021, 09:49 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880464]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
88ms |
get tp. blocked users: |
1ms |
others: | 264ms |
total: | 463ms |
0 / 0 |