Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос с параметрами 
:(
    Опции темы
MasterOfCode
Дата 7.4.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: нет
Всего: 27



Добрый день всем.
Хочу увидеть результат в виде таблицы. Делаю так:

Код

DECLARE
start_period date;
end_period date;
begin
start_period := '01.03.2010';
end_period := '01.04.2010';
select *  
from table1 t1
where t1.registerdate between start_period and end_period; 
end;


Ругается, просит into вставить, а мне незачем однострочный ответ. Вопрос, как делать правильно?


--------------------
user posted image
PM ICQ   Вверх
azesmcar
Дата 7.4.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



создай процедуру и возвращай в курсор.
PM   Вверх
MasterOfCode
Дата 7.4.2010, 13:15 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: нет
Всего: 27



Цитата(azesmcar @  7.4.2010,  15:13 Найти цитируемый пост)
создай процедуру и возвращай в курсор. 

И что, приходится всегда так извращаться с курсорами? В MS SQL  с этим намного проще.


--------------------
user posted image
PM ICQ   Вверх
azesmcar
Дата 7.4.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(MasterOfCode @  7.4.2010,  13:15 Найти цитируемый пост)
И что, приходится всегда так извращаться с курсорами?

Почему извращаться? Это так и делается.

Это сообщение отредактировал(а) azesmcar - 7.4.2010, 13:19
PM   Вверх
MasterOfCode
Дата 7.4.2010, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: нет
Всего: 27



Цитата(azesmcar @  7.4.2010,  15:16 Найти цитируемый пост)
почему извращаться? 

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


--------------------
user posted image
PM ICQ   Вверх
azesmcar
Дата 7.4.2010, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



я просто не понимаю чего тут сложного, написание open cursor как-то усложняет работу? По мне так нормально.

Это сообщение отредактировал(а) azesmcar - 7.4.2010, 13:22
PM   Вверх
MasterOfCode
Дата 7.4.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: нет
Всего: 27



Цитата(azesmcar @  7.4.2010,  15:21 Найти цитируемый пост)
я просто не понимаю чего тут сложного, написание open cursor как-то усложняет работу? По мне так нормально.

К примеру как это выглядит в MS SQL
Код

DECLARE @start_period date;
DECLARE  @end_period date ;
SET @start_period = '2010-03-01';
SET @end_period = '2010-04-01';
select * from table1 where t.registerdate between @start_period and @end_period; 


А в оракл нужно еще какие sys_refcursor использовать.


--------------------
user posted image
PM ICQ   Вверх
azesmcar
Дата 7.4.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Код

create or replace procedure(data out sys_refcursor)
declare
   start_period date := to_date('2010-03-01');
   end_period date := to_date('2010-03-01');
begin
   open data for select * from table1 where t.registerdate between @start_period and @end_period;
end;

ну и что тут сложного?

код может быть не рабочим, писал тут и на память, нет оракла под рукой.
PM   Вверх
DimW
Дата 7.4.2010, 15:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



MasterOfCode, для того что бы написать запрос с параметрами не требуется писать процедурный код:
Код

select *
  from table1
 where t.registerdate between :start_period and :end_period


обратите внимание на двоеточие.
соответственно передавать значения в эти параметры будете средствами вашего инструмента или библиотек котрые используете для работы с оракл.
PM MAIL ICQ   Вверх
azesmcar
Дата 7.4.2010, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



DimW

Да конечно, но я думаю запросы в любом случае лучше писать в процедурах и возвращать через курсор так как

1. В случае вызова запроса извне он становится динамическим, а значит тратится дополнительное время на компиляцию.
2. Так нагляднее выглядит - передал аргументы и получил результат.
3. Код становится чище и аккуратнее, если в нем вместо огромных запросов стоит вызов процедуры.
4. Код легче отлаживать и проверять, запустил процедуру в PL/SQL, проверил результат и не надо запускать саму программу и делать dump запроса, чтобы посмотреть что там получилось.

Я так думаю © smile

PM   Вверх
DimW
Дата 7.4.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(azesmcar @  7.4.2010,  15:39 Найти цитируемый пост)
1. В случае вызова запроса извне он становится динамическим, а значит тратится дополнительное время на компиляцию.

утверждение не верно.

полный разбор:
- синтаксический разбор;
- морфологический разбор;
- определение наиболее оптимального плана выполнения запроса; (самая дорогая операция при разборе запроса)

частичный разбор:
- синтаксический разбор;
- морфологический разбор;

если морфология идентична при повторном выполнении запроса, то подбор плана сервер не делает т.к. он уже для него есть.

если ты действительно значения в запрос добавляешь динамически(не используя переменные привязки), то оракл всегда будет выполнять полный разбор.


Цитата(azesmcar @  7.4.2010,  15:39 Найти цитируемый пост)
2. Так нагляднее выглядит - передал аргументы и получил результат.
3. Код становится чище и аккуратнее, если в нем вместо огромных запросов стоит вызов процедуры.
4. Код легче отлаживать и проверять, запустил процедуру в PL/SQL, проверил результат и не надо запускать саму программу и делать dump запроса, чтобы посмотреть что там получилось.

спорить не буду дело вкуса smile
просто новечку в оракл лучше знать о простом способе.

Добавлено @ 16:32
к стати при таком варианте:
Код

create or replace procedure(data out sys_refcursor)
declare
   start_period date := to_date('2010-03-01');
   end_period date := to_date('2010-03-01');
begin
   open data for select * from table1 where t.registerdate between start_period and end_period;
end;


в действительности запрос керируемый ораклом будет выглядеть примерно так:
Код

select * from table1 
where t.registerdate between :1 and :2;


делается это для того что бы избежать ситуаци когда используя этот же запрос, программист использует другие переменные (к примеру start_date, end_date), тем самым избежать полного разбора.

Это сообщение отредактировал(а) DimW - 7.4.2010, 16:33
PM MAIL ICQ   Вверх
azesmcar
Дата 7.4.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(DimW @  7.4.2010,  16:27 Найти цитируемый пост)
если морфология идентична при повторном выполнении запроса, то подбор плана сервер не делает т.к. он уже для него есть.

Не знал что он кеширует..раньше вроде не делал.

Цитата(DimW @  7.4.2010,  16:27 Найти цитируемый пост)
просто новечку в оракл лучше знать о простом способе.

 smile 
PM   Вверх
DimW
Дата 7.4.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(azesmcar @  7.4.2010,  16:33 Найти цитируемый пост)

Не знал что он кеширует..раньше вроде не делал.


я оракл начал изучать с 8 версии, там уже все было в порядке.
если интересно можете посмотреть вьюху v$sql.
PM MAIL ICQ   Вверх
azesmcar
Дата 7.4.2010, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата(DimW @  7.4.2010,  16:38 Найти цитируемый пост)
я оракл начал изучать с 8 версии, там уже все было в порядке.

я тоже начал работу с 8-ки..тогда прочел о предпочтительности процедур обычным запросам в какой-то книге..давно это было, может книга старая была а может просто книга по базам данных а это было написано в виде общей рекомендации..не помню уже, 8 лет назад было.
PM   Вверх
DimW
Дата 7.4.2010, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(azesmcar @  7.4.2010,  16:40 Найти цитируемый пост)
8 лет назад было

да, давненько.
сам уже почти год не шерстил концепт по новым версиям, по этому сейчас на 11G R2 пишу так же как и под 9i, в принципе необламываюсь, но понимаю что не хорошо это  smile 
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.