powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / View и параметры
25 сообщений из 50, страница 2 из 2
View и параметры
    #40041852
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
?
...
Рейтинг: 0 / 0
View и параметры
    #40041853
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
va_kochnev,
Еще раз спасибо! Все получилось.
Но остался вопрос, уже ради любопытства.
Можно ли в оракле одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT?
...
Рейтинг: 0 / 0
View и параметры
    #40041879
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
Можно ли в оракле одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT?

Так и не увидел ответа на вопрос: откуда взялось ограничение на ОДИН ЗАПРОС?
Что мешает открыть транзакцию, выполнить в ней пачку запросов и закрыть транзакцию?
Или понятие транзакции не знакомо?
...
Рейтинг: 0 / 0
View и параметры
    #40041906
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
va_kochnev
SergiiW
Возможно кто знает, как одним запросом внести данные в таблицу или установить переменные сессии, пакета и получить результат SELECT?
MySql это делается просто (Inset ...; Select ...), а в oracle - даже не представлю.

Я создавал функцию вида
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
function set_param (p_param1 varchar2, p_param2 number, p_param3 date) return varchar2
is
begin
 переменная_сессии1:=p_param1;
 переменная_пакета2:=p_param2;
 переменная_пакета3:=p_param3;
return null;
end set_param;



И потом выполнял запрос
Код: plsql
1.
select * from view where set_param('параметр1',999,sysdate) is null;



Работало.
если внутри вьюхи есть предикаты с этими переменная_сессии1,переменная_пакета2, то это не очень надежное решение, зависящее от того будет ли предикат " set_param('параметр1',999,sysdate) is null " вынесен на самый верхний фильтр (отдельная операция FILTER в плане) и, что в случае, если там таких будет несколько, то он выполнится первым - чего, естественно, никто не гарантирует.
...
Рейтинг: 0 / 0
View и параметры
    #40041923
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный Вася
SergiiW
Можно ли в оракле одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT?

Так и не увидел ответа на вопрос: откуда взялось ограничение на ОДИН ЗАПРОС?
Вы невнимательно читаете 22275134
Правильный Вася

Что мешает открыть транзакцию, выполнить в ней пачку запросов и закрыть транзакцию?
Или понятие транзакции не знакомо?
Занимаясь более 25 лет SQL, впервые услышал от Вас, что существуют транзакции. Спасибо - теперь буду знать.
...
Рейтинг: 0 / 0
View и параметры
    #40041925
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xtender
если внутри вьюхи есть предикаты с этими переменная_сессии1,переменная_пакета2, то это не очень надежное решение, зависящее от того будет ли предикат " set_param('параметр1',999,sysdate) is null " вынесен на самый верхний фильтр (отдельная операция FILTER в плане) и, что в случае, если там таких будет несколько, то он выполнится первым - чего, естественно, никто не гарантирует.
Похоже я не понял Ваших сомнений. Да будет вынесен на самый верх.
Код: plsql
1.
select * from view join ... where set_param('параметр1',999,sysdate) is null and ...;

Только такое использование и планируется. Что именно тут может пойти не так?
Если это решение не очень надежное (почему?), то что можете предложить лучше?
...
Рейтинг: 0 / 0
View и параметры
    #40041934
va_kochnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
va_kochnev,
Еще раз спасибо! Все получилось.
Но остался вопрос, уже ради любопытства.
Можно ли в оракле одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT?

Наверное, можно в предложенную функцию добавить автономную транзакцию и в ней порезвиться от всей души.
Но эти решения, с использованием в запросе функции инициализации, от безысходности, т.к. неизвестно, что придет в голову оптимизатору в каждом конкретном случае.

Если есть малейшая возможность вынести подготовительную часть отдельно перед выполнением запроса, как коллеги и советуют, то лучше так и делать.
...
Рейтинг: 0 / 0
View и параметры
    #40041948
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
Да будет вынесен на самый верх.

Речь не о синтаксисе вызова. За
SergiiW
более 25 лет SQL

можно было бы освоить планы запросов и понять, что речь идёт о порядке применения предикатов. Подумайте, что вернёт вью, если этот предикат отработает последним (верхним элементом плана).

Надёжнее сделать, как уже советовали, pipeline функцию и обращаться к ней вместо вью.

SergiiW
одним запросом, не используя функции, процедуры сделать INSERT, UPDATE или DELETE и вывести данные SELECT

Не возникает такой необходимости.
...
Рейтинг: 0 / 0
View и параметры
    #40041953
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
можно было бы освоить планы запросов и понять, что речь идёт о порядке применения предикатов. Подумайте, что вернёт вью, если этот предикат отработает последним (верхним элементом плана).

Теперь понял о чем речь. ок.
Да, такая вероятность есть, но, предположу, что если при отладке все будет нормально, то вероятность, что что-то дальше пойдет не так - очень мала. Хотя, наверно, согласен, что это не совсем надежно. pipeline, пока, не хочу применять.
...
Рейтинг: 0 / 0
View и параметры
    #40041955
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
если при отладке все будет нормально, то вероятность, что что-то дальше пойдет не так - очень мала

Не зная ваше распределение данных, период актуализации статистики, характер изменения данных в исходных таблицах - сложно согласиться или опровергнуть
...
Рейтинг: 0 / 0
View и параметры
    #40042017
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
Не зная ваше распределение данных, период актуализации статистики, характер изменения данных в исходных таблицах - сложно согласиться или опровергнуть
Похоже Вы правы, но ситуация немного другая.
Функция не выполняется. Но почему она может не выполнятся?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE FUNCTION PERIOD_SET(DPERIOD DATE)
  RETURN NUMBER
AS

BEGIN
  DBMS_SESSION.SET_CONTEXT ( 'CLIENTCONTEXT', 'PERIOD', TRUNC(DPERIOD, 'MM') );
  RETURN(1);
END;
/


Притом поведение очень странное, как по мне.
Код: plsql
1.
SELECT CAST(SYS_CONTEXT('CLIENTCONTEXT', 'PERIOD') AS DATE) FROM View WHERE PERIOD_SET(date'2020-12-01') = 1

Не выполняется. Результат NULL

Код: plsql
1.
SELECT CAST(SYS_CONTEXT('CLIENTCONTEXT', 'PERIOD') AS DATE) FROM View WHERE PERIOD_SET(date'2020-12-01') != 0

Выполняется. Результат 01.12.2020 00:00:00

Код: plsql
1.
SELECT CAST(SYS_CONTEXT('CLIENTCONTEXT', 'PERIOD') AS DATE) FROM DUAL WHERE PERIOD_SET(date'2020-12-01') = 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
...
Рейтинг: 0 / 0
View и параметры
    #40042022
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
подряд

От кеширования результата поcле первого вызова, до применения на разных шагах плана. С fast dual вообще много забавного можно получить. В плане на каком уровне фильтр оказывается, смотрели?

упд. поменяйте местами вызовы с = 1 и != 0 и выполните в новой сессии. Думаю, эффект будет тот же.
...
Рейтинг: 0 / 0
View и параметры
    #40042032
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
SergiiW
подряд

От кеширования результата поле первого вызова, до применения на разных шагах плана. С fast dual вообще много забавного можно получить. В плане на каком уровне фильтр оказывается, смотрели?

упд. поменяйте местами вызовы с = 1 и != 0 и выполните в новой сессии. Думаю, эффект будет тот же.

1. Почему кеширование используется только для = 1, но не используется для != 0
2. Не понял по поводу поменять? Что с чем? Все проверки я начинаю в новой сессии! Проверяю по несколько раз - результат не меняется.
3. Посмотрел планы запросов - один в один. Ничем не отличаются. :(
...
Рейтинг: 0 / 0
View и параметры
    #40042034
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW,

Порядок выполнения первых двух запросов поменяйте. Нет никакой разницы будет ли первым = 1 или != 0. Функцию можно расценивать как deterministic, чем похоже у вас оптимизатор и воспользовался.
...
Рейтинг: 0 / 0
View и параметры
    #40042038
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env
SergiiW,
Порядок выполнения первых двух запросов поменяйте. Нет никакой разницы будет ли первым = 1 или != 0. Функцию можно расценивать как deterministic, чем похоже у вас оптимизатор и воспользовался.

Очень похоже на то, что используется deterministic. Как можно указать не использовать deterministic? Почему для =1 он используется, а для !=0 нет?
Постите, но я не понимаю как можно поменять порядок не связанных действий. :(
1. Открываю сессию
2. Выполняю запрос. Много раз. Результат не меняется.
3. Закрываю сессию.

Это я проделываю много раз отдельно для запросов =1 и !=0. Самый первый раз был запрос =1. Потом все было по многу раз. Результата не меняется.
К стати. Добавил в функцию еще один параметр и передаю в него текущую дату (SYSDATE). Надеялся, что это сбросит кеш. Без изменений.
...
Рейтинг: 0 / 0
View и параметры
    #40042044
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW,

Ещё раз. Постулат
SergiiW
Почему для =1 он используется, а для 1=0 нет?

неверный.

Он используется при повторных вызовах.

В вашем случае при вызовах сначала идёт выборка и вычисление выражения sys_context, потом применяется фильтр по вызову функции, т.к. он не влияет на получение данных. Поэтому первая выборка даёт null независимо от условия =1 или !=0. В повторных вызовах оптимизатор вычисляет выражение, полученное установкой контекста в первом вызове.
...
Рейтинг: 0 / 0
View и параметры
    #40042045
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW
Добавил в функцию еще один параметр и передаю в него текущую дату (SYSDATE). Надеялся, что это сбросит кеш.

Если он не используется, то оптимизатор его с лёгкостью выкинет.
...
Рейтинг: 0 / 0
View и параметры
    #40042056
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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?
...
Рейтинг: 0 / 0
View и параметры
    #40042096
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW

2. запускаю запрос =1. sys_context = NULL .


= null или is null?

.....
stax
...
Рейтинг: 0 / 0
View и параметры
    #40042101
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax

= null или is null?
.....
stax

Это значит что результат работы скрипта
Код: plsql
1.
SELECT CAST(SYS_CONTEXT('CLIENTCONTEXT', 'PERIOD') AS DATE) FROM View WHERE PERIOD_SET(date'2020-12-01') = 1

строка со значением в поле результата NULL (IS NULL). Но строка есть, условие WHERE выполняется.
...
Рейтинг: 0 / 0
View и параметры
    #40042158
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergiiW,

Продемонстрируйте независимыми листингами из sqlplus.

У меня на всех доступных версиях никаких отличий для = 1 и != 0 нет. Ну и как уже говорили, поведение такого механизма не гарантируется. Используйте pipeline, раз не можете выполнить заполнение контекста и вызов запроса последовательно в одной сессии.
...
Рейтинг: 0 / 0
View и параметры
    #40042423
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А анонимный кодовый блок типа
Код: plsql
1.
2.
3.
4.
5.
BEGIN
  INSERT ...
  UPDATE...
  SELECT...
END;

через ODBC-драйвер вызвать нельзя так, чтоб результат SELECT'а в датасет вернулся?
...
Рейтинг: 0 / 0
View и параметры
    #40042451
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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.
declare
  cur SYS_REFCURSOR;
BEGIN
  ...<заполняете или выполняете что хотите>...
    OPEN cur FOR SELECT * FROM view;
    DBMS_SQL.RETURN_RESULT(cur);
END;
...
Рейтинг: 0 / 0
View и параметры
    #40042487
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный Вася
А анонимный кодовый блок типа
Код: plsql
1.
2.
3.
4.
5.
BEGIN
  INSERT ...
  UPDATE...
  SELECT...
END;

через ODBC-драйвер вызвать нельзя так, чтоб результат SELECT'а в датасет вернулся?

Так нельзя - ошибка.
...
Рейтинг: 0 / 0
View и параметры
    #40042489
SergiiW
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
declare
  cur SYS_REFCURSOR;
BEGIN
  ...<заполняете или выполняете что хотите>...
    OPEN cur FOR SELECT * FROM view;
    DBMS_SQL.RETURN_RESULT(cur);
END;


То что нужно! Спасибо!!!
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / View и параметры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]