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

Поиск:

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


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.2.2007

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



Помогите!!!!
Есть запрос под MSSQL, примерно такой:
Код
DECLARE @STATUS INT
SELECT @STATUS = A_ID FROM TABLE_A WHERE TABLE_A.A_STATUSCODE = 'act'

IF (@STATUS = 1) BEGIN
SELECT ......
END
ELSE BEGIN
SELECT ....
END

Т.е. в запросе должны динамически определяться значения переменных и возвращаться в ResultSet(Запрос вызывается из java)

Заранее спасибо!
PM MAIL   Вверх
Sqlninja
Дата 13.2.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

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



версия oracle какая? для 9ки и выше примерно так:
Код

DECLARE
   status   INT;
   r        INT;

   CURSOR c
   IS
      SELECT a_id
      FROM   table_a
      WHERE  table_a.a_statuscode = 'act';
BEGIN
   OPEN c;

   FETCH c
   INTO  status;

   CASE status
      WHEN 1
      THEN
         SELECT 1
         INTO   r
         FROM   DUAL;
      WHEN 2
      THEN
         SELECT 1
         INTO   r
         FROM   DUAL;
      ELSE
         NULL;
   END CASE;

   CLOSE c;
END;
/


Это сообщение отредактировал(а) Sqlninja - 13.2.2007, 11:54


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
AndySphinx
Дата 13.2.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 20.1.2007
Где: Харьков

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



А по-моему лучше так:
Код

DECLARE
   status   INT;
   r        table_b%ROWTYPE;
BEGIN
   SELECT a_id
     INTO status
     FROM table_a
    WHERE table_a.a_statuscode = 'act';

   IF status = 1
   THEN
      SELECT *
        INTO r
        FROM table_b
       WHERE ...;
   ELSE
      SELECT *
        INTO r
        FROM table_b
       WHERE ...;
   END IF;
END;
/

PM MAIL   Вверх
dsakantsev
Дата 13.2.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.2.2007

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



Спасибо, но это не окончательное решение:
1. Переменная r принимает только 1 строчку
2. Разве при использовании данного скрипта, что -нибудь вернется в ResultSet? Другими словами, как заставить Oracle вернуть переменную r в вызывающее приложение.
PM MAIL   Вверх
Hidrag
Дата 13.2.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

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



объявляешь скрипт процедурой и делаей в конце RESULT того что нужно


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


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.2.2007

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



Цитата(Hidrag @ 13.2.2007,  13:32)
объявляешь скрипт процедурой и делаей в конце RESULT того что нужно

Вы не могли бы привести скелет кода?
PM MAIL   Вверх
Hidrag
Дата 13.2.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

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



Я там "описАлся", не процедурой а функцией smile процедура значения не возвращает...

Вот тебе скелет:
Код

[CREATE  [OR REPLACE ] ] 
FUNCTION function_name [ ( parameter [ , parameter ]... ) ] RETURN 
datatype 
   [ AUTHID { DEFINER  | CURRENT_USER } ] 
   [ PARALLEL_ENABLE 
    [ { [CLUSTER parameter BY (column_name [, column_name ]... ) ] | 
     [ORDER parameter BY (column_name [ , column_name ]... ) ] } ] 
     [ ( PARTITION parameter BY
       { [ {RANGE | HASH } (column_name [, column_name]...)] | ANY } 
) ] 
   ] 
   [DETERMINISTIC]    [ PIPELINED  [ USING implementation_type ] ] 
   [ AGGREGATE  [UPDATE VALUE]  [WITH EXTERNAL CONTEXT] 
USING  implementation_type ]  {IS | AS} 
   [ PRAGMA AUTONOMOUS_TRANSACTION; ] 
   [ local declarations ] 
BEGIN 
   executable statements 
[ EXCEPTION 
   exception handlers ] 
END [ name ]; 



Вот тебе пример:
Код

FUNCTION sal_ok (salary REAL, title VARCHAR2) RETURN BOOLEAN IS
   min_sal REAL;
   max_sal REAL;
BEGIN
   SELECT losal, hisal INTO min_sal, max_sal FROM sals
      WHERE job = title;
   RETURN (salary >= min_sal) AND (salary <= max_sal);
END sal_ok;



Взято из документации Oracle 9i


Цитата(dsakantsev @  13.2.2007,  13:40 Найти цитируемый пост)
Вы
 я единственный экземпляр smile


Это сообщение отредактировал(а) Hidrag - 13.2.2007, 13:56


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 353
Регистрация: 15.5.2006
Где: San Francisco, CA

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



Цитата(AndySphinx @  13.2.2007,  12:58 Найти цитируемый пост)
А по-моему лучше так:


так не лучше. хотя бы по той причине, что если ваш
Код

  SELECT a_id
     INTO status
     FROM table_a
    WHERE table_a.a_statuscode = 'act';

не вернет ничего, то скрипт свалится с ошибкой "no data found".


Цитата(Hidrag @  13.2.2007,  13:54 Найти цитируемый пост)
Я там "описАлся", не процедурой а функцией  процедура значения не возвращает...


если постараться, то вернет.  smile 

Цитата(dsakantsev @  13.2.2007,  11:21 Найти цитируемый пост)
Т.е. в запросе должны динамически определяться значения переменных и возвращаться в ResultSet(Запрос вызывается из java)


если вернуть надо в хост среду, то пиши функцию. если надо вернуть некий НД, то пусть она возвращает коллекцию.


Это сообщение отредактировал(а) Sqlninja - 13.2.2007, 17:21


--------------------
It's better to burn out than to fade away.
PM MAIL WWW ICQ   Вверх
dsakantsev
Дата 14.2.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.2.2007

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



Всем огромное спасибо, разобрался. тему можно закрывать
PM MAIL   Вверх
Hidrag
Дата 14.2.2007, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

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



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


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

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



Цитата(Sqlninja @  13.2.2007,  17:18 Найти цитируемый пост)
если постараться, то вернет
  smile 



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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(Hidrag @ 15.2.2007,  11:20)
Цитата(Sqlninja @  13.2.2007,  17:18 Найти цитируемый пост)
если постараться, то вернет
  smile

Процедура может возвращать значения через IN/OUT или OUT параметры.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Shnur
Дата 25.10.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.10.2006

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



Помогите.
Есть запрос MS SQL

Код

SELECT * FROM data_base
WHERE sector1 = @perem


откуда переменная @perem передаеться из другого интерфейса, как данный запрос должен выглядить в ORACLE?
PM MAIL   Вверх
DimW
Дата 25.10.2007, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Hidrag.

Код

create or replace procedure test_out_par (p_value in out number) is
begin
  p_value := p_value * 2;
end test_out_par;


Код

declare 
  n number := 10;
begin
  dbms_output.put_line('до выполнения процедуры = ' || n);
  test_out_par(n);
  dbms_output.put_line('после выполнения процедуры = ' || n);  
end;


Это сообщение отредактировал(а) DimW - 25.10.2007, 07:47
PM MAIL ICQ   Вверх
LSD
Дата 25.10.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Цитата(Shnur @  25.10.2007,  01:55 Найти цитируемый пост)
переменная @perem передаеться из другого интерфейса

Какого "другого"?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

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

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

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

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

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


 




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


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

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