|
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?fid=52&gotonew=1&tid=1880464]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
10ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 186ms |
0 / 0 |