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