Подтвердить что ты не робот

Объявление переменной и установка ее значения из запроса 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

4b9b3361

Ответ 1

SELECT INTO

DECLARE
   the_variable NUMBER;

BEGIN
   SELECT my_column INTO the_variable FROM my_table;
END;

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

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

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

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

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

Ответ 2

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

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

Олли.

Ответ 3

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

При преобразовании с tsql в plsql вам нужно беспокоиться о no_data_found exception

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

Ответ 4

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

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

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

Ответ 5

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

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

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


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

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

Ответ 6

тупой PLSQL не позволяет использовать переменные непосредственно в SQL-выражении. SQL очень прямолинеен и может использоваться в любом операторе select после его объявления и установки значения.

Я сыт по горло ограничением в PL SQL.