Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Выполнение запроса с переменными


Автор: dsakantsev 13.2.2007, 11:21
Помогите!!!!
Есть запрос под 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)

Заранее спасибо!

Автор: Sqlninja 13.2.2007, 11:51
версия 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;
/

Автор: AndySphinx 13.2.2007, 12:58
А по-моему лучше так:
Код

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;
/

Автор: dsakantsev 13.2.2007, 13:30
Спасибо, но это не окончательное решение:
1. Переменная r принимает только 1 строчку
2. Разве при использовании данного скрипта, что -нибудь вернется в ResultSet? Другими словами, как заставить Oracle вернуть переменную r в вызывающее приложение.

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

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

Вы не могли бы привести скелет кода?

Автор: Hidrag 13.2.2007, 13:54
Я там "описАлся", не процедурой а функцией 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

Автор: Sqlninja 13.2.2007, 17:18
Цитата(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)


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

Автор: dsakantsev 14.2.2007, 10:08
Всем огромное спасибо, разобрался. тему можно закрывать

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

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

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

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

Автор: Shnur 25.10.2007, 00:55
Помогите.
Есть запрос MS SQL

Код

SELECT * FROM data_base
WHERE sector1 = @perem


откуда переменная @perem передаеться из другого интерфейса, как данный запрос должен выглядить в ORACLE?

Автор: DimW 25.10.2007, 07:45
2 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;

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

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

Автор: Shnur 25.10.2007, 19:39
Вопрос явно немного не допонят, мне нужно из другого преложения задать параметры фильтра, т.е.

я в преложении ввожу какието данные а запрос их должен подхватить

напишу еще раз мне нужно тоже самое как MS SQL только на ORACLE

Код

SELECT * FROM data_base
WHERE sector1 = @perem

Автор: DimW 26.10.2007, 07:39
Цитата(Shnur @  25.10.2007,  19:39 Найти цитируемый пост)
я в преложении ввожу какието данные а запрос их должен подхватить


предположу что речь идет о переменных привязки:
Код

SELECT * FROM data_base
WHERE sector1 = :perem

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)