Выберите значение одного столбца и сохраните его в переменной Oracle SQL - PullRequest
3 голосов
/ 30 марта 2012

Я хочу получить конкретное значение столбца a.id и сохранить его в переменной v_id.Затем используйте это значение для передачи в хранимую процедуру.

DECLARE v_id a.id%TYPE;
BEGIN
SELECT id  into v_id from a where a.name='test' and rownum <2 order by id desc;
Print v_id;
doSomething(v_id);
END;
/

Я получаю эту ошибку в Oracle SQL Developer:

Отчет об ошибке: ORA-06550: строка 3,столбец 7: PLS-00103: Обнаружен символ "V_ID" при ожидании одного из следующих действий:

: =.(@%; Символ «: =» был заменен на «V_ID» для продолжения. 06550. 00000 - «строка% s, столбец% s: \ n% s» * Причина: обычно ошибка компиляции PL / SQL. * Действие:

Ответы [ 3 ]

10 голосов
/ 30 марта 2012

Если вы хотите использовать rownum и order by, у вас есть для размещения заказа в подзапросе.Нет другого способа гарантировать, что вы получите правильное значение.

Хорошей практикой также является вероятность того, что не может быть id, который соответствует вашему запросу.Я добавил дополнительный блок begin... end;, чтобы справиться с этим.

declare
   v_id a.id%type;
begin

   begin
      select id into v_id 
        from ( select id
                 from a 
                 where name = 'test' 
                 order by id desc )
       where rownum < 2 
             ;
    exception when no_data_found then
      v_id := null;
    end;

   dbms_output.put_line(v_id);
   doSomething(v_id);

end;
/

Как заметил @raukh (пока я писал это!), Проблема заключается в print, который должен быть dbms_output.put_line()

4 голосов
/ 30 марта 2012

Это:

Print v_id;

недопустимо.Возможно, вы имели в виду:

dbms_output.put_line(v_id);

?(Обратите внимание, что вам может потребоваться запустить

set serveroutput on;

заранее, чтобы вышеописанный эффект имел эффект.)

2 голосов
/ 30 марта 2012

PRINT не является допустимой командой PL / SQL, поэтому возникнет проблема. Возможно, вы хотели

DECLARE 
  v_id a.id%TYPE;
BEGIN
  SELECT id  
    into v_id 
    from (SELECT id 
            FROM a 
           where a.name='test' 
           order by id desc)
    where rownum < 2;
  dbms_output.put_line( v_id );
  doSomething(v_id);
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...