Объявление переменной и установка ее значения из запроса SELECT в Oracle - PullRequest
35 голосов
/ 26 сентября 2011

В 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

Ответы [ 5 ]

66 голосов
/ 26 сентября 2011

ВЫБРАТЬ В

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.

5 голосов
/ 26 сентября 2011

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

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

Олли.

1 голос
/ 07 августа 2015

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

Когда вы конвертируете из 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

0 голосов
/ 07 августа 2015

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

объявить v_username varchare (20); ВЫБЕРИТЕ имя пользователя в v_username ОТ пользователя WHERE user_id = '7';

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


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

Вы должны использовать функцию listagg. listagg объединяет результирующие строки столбца в один столбец, а также для их дифференцирования вы можете использовать специальный символ. используйте запрос как ниже ВЫБЕРИТЕ listagg (имя пользователя || ',') в группе (порядок по имени пользователя) в v_username ОТ пользователей;

0 голосов
/ 19 февраля 2014

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

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

DECLARE
     ID NUMBER;
BEGIN
     select eid into id from employee where salary=26500;
     DBMS_OUTPUT.PUT_LINE(ID);
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...