Вопрос: Объявление переменной и установка ее значения из запроса SELECT в Oracle


В SQL Server мы можем использовать это:

DECLARE @variable INT;
SELECT @variable= mycolumn from myTable;

Как я могу сделать то же самое в Oracle? В настоящее время я делаю следующее:

DECLARE COMPID VARCHAR2(20);
SELECT companyid INTO COMPID from app where appid='90' and rownum=1;

Почему это не за работой ?

enter image description here


27


источник


Ответы:


ВЫБЕРИТЕ В

DECLARE
   the_variable NUMBER;

BEGIN
   SELECT my_column INTO the_variable FROM my_table;
END;

Убедитесь, что запрос возвращает только одну строку:

По умолчанию оператор SELECT INTO должен возвращать только одну строку. В противном случае PL / SQL вызывает предопределенное исключение TOO_MANY_ROWS, а значения переменных в предложении INTO не определены. Убедитесь, что предложение WHERE достаточно конкретное, чтобы соответствовать только одной строке

Если строки не возвращаются, PL / SQL вызывает NO_DATA_FOUND. Вы можете защитить это исключение, выбрав результат совокупной функции, такой как COUNT (*) или AVG (), где это практически возможно. Эти функции гарантированно возвращают одно значение, даже если никакие строки не соответствуют условию.

Оператор SELECT ... BULK COLLECT INTO может возвращать несколько строк. Вы должны настроить переменные коллекции для хранения результатов. Вы можете объявить ассоциативные массивы или вложенные таблицы, которые растут по мере необходимости для хранения всего набора результатов.

Неявный курсор SQL и его атрибуты% NOTFOUND,% FOUND,% ROWCOUNT и% ISOPEN предоставляют информацию о выполнении инструкции SELECT INTO.


58



Не совсем уверен, что вам нужно, но в PL / SQL вы просто

DECLARE
  v_variable INTEGER;
BEGIN
  SELECT mycolumn
    INTO v_variable
    FROM myTable;
END;

Олли.


4



Один дополнительный пункт:

Когда вы переходите от tsql в plsql вы должны беспокоиться о no_data_found исключение

DECLARE
   v_var NUMBER;
BEGIN
   SELECT clmn INTO v_var FROM tbl;
Exception when no_data_found then v_var := null; --what ever handle the exception.
END;

В tsql если no data found то переменная будет null но нет exception


1



ORA-01422: точная выборка возвращает больше запрошенного количества строк

если вы не укажете точную запись, используя условие where, вы получите указанное выше исключение

DECLARE
     ID NUMBER;
BEGIN
     select eid into id from employee where salary=26500;
     DBMS_OUTPUT.PUT_LINE(ID);
END;

0



Для хранения вывода одной строки в переменной из запроса select:

объявить v_username varchare (20); SELECT имя пользователя в v_username FROM users WHERE user_id = '7';

это сохранит значение одной записи в переменной v_username.


Для хранения нескольких строк, выводимых в переменную из запроса select:

вы должны использовать функцию listagg. listagg объединяет результирующие строки coloumn в один coloumn, а также для их дифференциации вы можете использовать специальный символ. используйте запрос, как показано ниже. SELECT listagg (имя пользователя || ',') в группе (по имени пользователя) в v_username FROM users;


0