Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Использование параметров в секции WHERE  [new]
MblW
Member

Откуда:
Сообщений: 3
Доброе время суток!

Есть табличка:
id name
1 Иванов
2 Петров
3 Сидоров



Подскажите, как можно создать вьюху с параметром, чтоб при указании :id = 0 он возвращал всю таблицу, а при значении :id = 1 только строку "Иванов"?


Заранее спасибо!
9 авг 12, 10:41    [12986023]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
where (id = :id or :id = 0)


where decode(':id',0,0,id) = :id


...
9 авг 12, 10:45    [12986066]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
where (id = :id or :id = 0)


where decode(:id,0,0,id) = :id
9 авг 12, 10:46    [12986069]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
Corner
Member

Откуда:
Сообщений: 1270
with t(id,
name) as
 (select 1, 'Иванов'
    from dual
  union
  select 2, 'Петров'
    from dual
  union
  select 3, 'Сидоров' from dual)
select * from t where decode(:id, 0, id, :id) = id
9 авг 12, 10:47    [12986083]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
123йй
Guest
Ramin,

автор
как можно создать вьюху с параметром
9 авг 12, 10:50    [12986119]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
-2-
Member

Откуда:
Сообщений: 15330
123йй
автор
как можно создать вьюху с параметром
а параметр это только то, что в круглых скобках после имени view или можно между ними вставить where?
9 авг 12, 10:53    [12986148]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
ТС пока не в курсе представлении...
9 авг 12, 10:56    [12986173]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
123йй
Guest
-2-,
судя по двоеточию перед id
автор
:id = 0

это биндовая переменная
9 авг 12, 11:00    [12986200]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
MblW
Member

Откуда:
Сообщений: 3
[quot Ramin]
where (id = :id or :id = 0)


Спасибо большое! :) То, что нужно :)
9 авг 12, 11:06    [12986240]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
[quot MblW]
Ramin
where (id = :id or :id = 0)


Спасибо большое! :) То, что нужно :)

я же говорил )))
9 авг 12, 11:08    [12986254]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
MblW
Member

Откуда:
Сообщений: 3
Не ожидал, что решение окажется таким простым :)
9 авг 12, 11:08    [12986260]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
MblW
Не ожидал, что решение окажется таким простым :)


автор
Objects in mirror are closer than they appear
9 авг 12, 11:11    [12986277]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
AmKad
Member

Откуда:
Сообщений: 5222
MblW,

Переписать OR через UNION ALL.
9 авг 12, 11:47    [12986542]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
AmKad
Member

Откуда:
Сообщений: 5222
create table accounts as select level account_id, dbms_random.string('p', 100) name from dual connect by level <= 1e4;

Таблица создана.

Затрач.время: 00:00:01.20
alter table accounts add constraint accounts#pk primary key(account_id);

Таблица изменена.

Затрач.время: 00:00:00.35
explain plan for
select *
from accounts
where (account_id = :id or :id = 0);

Объяснено.

Затрач.время: 00:00:00.01
select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------
Plan hash value: 3950934772

------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |   189 |   371K|     7   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| ACCOUNTS |   189 |   371K|     7   (0)| 00:00:01 |
------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("ACCOUNT_ID"=TO_NUMBER(:ID) OR TO_NUMBER(:ID)=0)

Note
-----
   - dynamic sampling used for this statement (level=2)
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold

18 строк выбрано.

Затрач.время: 00:00:00.06
explain plan for
select *
from accounts
where (account_id = :id and :id <> 0)
union all
select *
from accounts
where :id = 0;

Объяснено.

Затрач.время: 00:00:00.01
select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------
Plan hash value: 2084546383

---------------------------------------------------------------------------------------------
| Id  | Operation                     | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |             |  9522 |    18M|     9  (78)| 00:00:01 |
|   1 |  UNION-ALL                    |             |       |       |            |          |
|*  2 |   FILTER                      |             |       |       |            |          |
|   3 |    TABLE ACCESS BY INDEX ROWID| ACCOUNTS    |     1 |  2015 |     2   (0)| 00:00:01 |
|*  4 |     INDEX UNIQUE SCAN         | ACCOUNTS#PK |     1 |       |     1   (0)| 00:00:01 |
|*  5 |   FILTER                      |             |       |       |            |          |
|   6 |    TABLE ACCESS FULL          | ACCOUNTS    |  9521 |    18M|     7   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(TO_NUMBER(:ID)<>0)
   4 - access("ACCOUNT_ID"=TO_NUMBER(:ID))
   5 - filter(TO_NUMBER(:ID)=0)

Note
-----
   - dynamic sampling used for this statement (level=2)
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold

25 строк выбрано.

Затрач.время: 00:00:00.05
9 авг 12, 12:13    [12986756]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
AmKad,
Так будет проще выглядеть
decode(:id,0,id,:id) = id
9 авг 12, 12:28    [12986885]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
AmKad
Member

Откуда:
Сообщений: 5222
AlexFF__|
AmKad,
Так будет проще выглядеть
decode(:id,0,id,:id) = id
Несколько раз натыкался на bug с concatenation, но не смог вопроизвести.
9 авг 12, 12:32    [12986923]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
AmKad
AlexFF__|
AmKad,
Так будет проще выглядеть
decode(:id,0,id,:id) = id
Несколько раз натыкался на bug с concatenation, но не смог вопроизвести.

Ни разу не встречал.
А ссылкой можешь поделиться?
9 авг 12, 12:34    [12986950]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
AmKad
Member

Откуда:
Сообщений: 5222
AlexFF__|,

Натыкался у себя в боевом коде. Запросы были правда посложнее. А воспросизвести на табличах t1 и t2, чтобы показать sql.ru-сообществу, не удалось. Переписывал через union all.
9 авг 12, 12:38    [12986998]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
AmKad
AlexFF__|,

Натыкался у себя в боевом коде. Запросы были правда посложнее. А воспросизвести на табличах t1 и t2, чтобы показать sql.ru-сообществу, не удалось. Переписывал через union all.

согласен с union all при очень больших обьемах , но про баг не слыхал...
9 авг 12, 12:42    [12987036]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
автор
как можно создать вьюху с параметром
Надо создать две вьюхи
9 авг 12, 12:43    [12987055]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Ramin,

Запрос AlexFF__| делает то же, что и мой, но только через query_transformation.
9 авг 12, 12:46    [12987080]     Ответить | Цитировать Сообщить модератору
 Re: Использование параметров в секции WHERE  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
AmKad
Ramin,

Запрос AlexFF__| делает то же, что и мой, но только через query_transformation.

я ничего другого и не говорю... я про усложнение запроса.
9 авг 12, 12:47    [12987101]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить