Oracle сохранить результат запроса в переменную
Введение в Oracle (14.4) с использованием переменных в PL / SQL
1. Использование переменных
(1) Назначьте значения в исполняемом разделе
пример 1
В этом примере значение John присваивается переменной в исполняемом разделе. Значение и строка этой переменной Меня зовут :.
Результат:
My name is:
My name is: John
В этом блоке переменная v_myname объявляется и инициализируется в разделе объявления. После инициализации v_myname содержит значение John. Это значение обрабатывается в исполняемой части блока.
(1) Причины использования переменных
(2) Обработка переменных в PL / SQL
Переменные:
• Объявить и инициализировать в разделе объявлений
• Используйте и присваивайте новые значения в исполняемом разделе
Переменные могут быть:
• Передается как параметр в подпрограмму PL / SQL.
• Назначить для сохранения вывода подпрограммы PL / SQL
Oracle Sqlplus: операции редактирования, сохранения, запуска и запроса результатов
Обычно для работы мы используем plsqldev. В некоторых особых случаях мы будем использовать sqlplus. Эта статья объясняет общие операции sqlplus на простых примерах. Я надеюсь, что это может вам помочь.
Войдите в окно командной строки
APPEND : APPEND TEXT;
После выполнения вышеуказанного оператора, если мы хотим отсортировать DEPTNO, мы можем использовать APPEND Метод добавления операторов SQL. обращать внимание, APPEND За ними следуют два пробела, например:
Следующие другие методы использования такие же APPEND То же, поэтому конкретных примеров приводить не будем.
CHANGE : CHANGE/ OLD_TEXT/ NEW_TEXT;
DEL : DEL N; означает удаление первого n Строка кода.
LIST : Отображать содержимое буфера, sqlplus обычно сохраняет его в буфере после выполнения оператора. Если вы хотите запросить содержимое буфера, вы можете использовать LIST Метод запроса. Как показано ниже:
Если быть точным, это должно быть результатом сохранения текущего кеша.
метод первый: ED : Метод использования показан на рисунке выше, просто введите его прямо в окно командной строки.
Метод 2: SAVE :SAVE FILE_NAME;
использовать SPOOL Метод может сохранять результаты запроса, обратите особое внимание, после использования спула его нужно выполнить spool off Только тогда можно будет сохранить результаты.
EG:
Как показано ниже:
Иногда нам не нужно отображать результаты запроса, мы можем использовать SET Такие команды как:
SET : SET TERM ON/ OFF
Сохраните его локально с именем sql_ste.sql
2. Выполните sql-файл, созданный на предыдущем шаге, в sqlplus вы можете использовать @ Для выполнения файлов, таких как: @filename
К конкретным операциям относятся следующие:
Как показано:
На этом завершается. Если у вас есть вопросы, обсудите
Как я могу сделать то же самое в Oracle? В настоящее время я пытаюсь сделать следующее:
почему это не работающего?
убедитесь, что запрос возвращает только одну строку:
по умолчанию инструкция SELECT INTO должна возвращать только одну строку. В противном случае PL/SQL вызывает предопределенное исключение TOO_MANY_ROWS, а значения переменных в предложении INTO не определены. Убедитесь, что ваше предложение WHERE достаточно специфично, чтобы соответствовать только одной строке
Если строки не возвращаются, PL / SQL вызывает NO_DATA_FOUND. Вы можете охранять против этого исключения, выбрав результат агрегатной функции, такой как COUNT(*) или AVG (), где это практично. Эти функции гарантированно возвращают одно значение, даже если строки не соответствуют условию.
A ВЫБРАТЬ . Оператор BULK COLLECT INTO может возвращать несколько строк. Для хранения результатов необходимо настроить переменные коллекции. Можно объявить ассоциативные массивы или вложенные таблицы, которые растут по мере необходимости для хранения всего результирующего набора.
неявное курсор SQL и его атрибуты %NOTFOUND, %FOUND, %ROWCOUNT и %ISOPEN предоставляют сведения о выполнении инструкции SELECT INTO.
не совсем уверен, что вы после, но в PL / SQL вы просто
один дополнительный пункт:
при конвертации из tsql to plsql вы должны беспокоиться о no_data_found исключение
на tsql если no data found тогда переменная будет null а не exception
ORA-01422: точная выборка возвращает больше запрошенного количества строк
Если вы не укажете точную запись, используя условие where, вы получите вышеуказанное исключение
для хранения вывода одной строки в переменную из запроса select into:
объявить v_username varchare(20); Выберите имя пользователя в v_username от пользователей, где user_id = '7';
это сохранит значение одной записи в переменной v_username.
для хранения нескольких строк, выводимых в переменную из запроса select into:
вы должны использовать функцию listagg. listagg объединяет результирующие строки a столб в один столб, а также, чтобы различать их, вы можете использовать специальный символ. использовать запрос, как показано ниже Выберите listagg (username || ',' ) в группе (order by username) в v_username от пользователей;
Я вызываю хранимую процедуру, передающую запрос для выполнения в качестве входного параметра. Запрос примерно такой:
где A, B и TABLE не фиксированы (определяются во время выполнения во время выполнения java-программы), поэтому я не знаю их значений заранее.
Как я могу получить/сохранить каждую возвращенную строку в моей структуре?
Насколько я понял из вашего вопроса, вам придется прибегнуть к динамическому sql. Плохая новость заключается в том, что вы не сможете использовать Native Dynamic SQL (через EXECUTE IMMEDIATE), вам придется прибегнуть к методу 4, используя пакет DBMS_SQL (исследование). Если это действительно так, то это будет непростая задача. Удачи
«где A, B и TABLE не фиксированы». Исправлено ли, что всегда будет два столбца, целое число и число? Или в проекции может быть больше или меньше столбцов?
Это один из способов обработки динамически сгенерированного запроса в определенный пользователем тип. Обратите внимание, что для того, чтобы это работало, структура вашего запроса (столбцы) должна соответствовать структуре типа данных вашего типа (атрибуты), иначе у вас возникнут проблемы.
Я заметил, что изначально вы указали CURSOR_ выходной параметр в своей хранимой процедуре, если это все еще ваша цель, вы можете создать свою процедуру как:
В этом случае просто следите за правильным обращением с курсором и всегда закрывайте его, когда закончите с ним.
Я попробовал ваш код, и это то, что я искал. Просто вопрос: SELECT * FROM TABLE (processed) дает мне последнюю запись equals null . Должен ли я добавить if статус курсора перед выполнением processed.EXTEND и processed. := . ?
Приятно слышать, что это сработало для вас. Что касается кондиционирования EXTEND , будет трудно понять, когда прекратить расширение коллекции, поскольку единственный способ узнать это - дождаться FETCH достижения EOF для CURSOR_ , но поскольку коллекцию необходимо расширить/создать для получения извлеченных значений ( в противном случае вы бы вызвали Reference to Uninitialized Composite исключение) это было бы проблемой, я скорее рекомендую выдать processed.TRIM или processed.DELETE(processed.count) инструкцию после конца цикла, чтобы удалить последний элемент коллекции. Я обновил свой ответ, чтобы продемонстрировать
Конечно, другим способом узнать, сколько элементов вы ожидаете от запроса, может быть итерация по нему с локальными переменными (не коллекцией), извлечение счетчика либо по rowcount атрибуту курсора, либо по локальному счетчику, а затем, как вы сказали, условие коллекция распространяется внутри цикла извлечения в коллекцию. Удачи.
Я хочу сохранить результат выбора / вставки / удаления / обновления или любой набор результатов в локальную временную таблицу в базе данных oracle. Как я могу это сделать?
Я выполняю следующий запрос в моем инструменте разработчика Oracle sql:
В Oracle глобальная временная таблица - это постоянная таблица. Единственное, что в них временно, - это данные. Только сеанс, который вставляет в них данные, может их видеть, и данные автоматически удаляются по окончании сеанса.
Обычно вам не нужны временные таблицы в Oracle так, как они нужны в SQL Server. Просто используйте производную таблицу или подвыборку.
I want to store the result of select/insert/delete/update or any result set into a local temporary table in oracle database,How I can Do This?
Вы не можете. Oracle не имеет локальных временных таблиц, он так не работает. Но в этом нет необходимости. Oracle имеет внутреннюю модель, сильно отличающуюся от SQL Server, что означает, что многие методы SQL Server не нужны в Oracle. (Честно говоря, в SQL Server есть изящные вещи, которых нет в Oracle, например ANSI 92 Joins для DML.)
Ключевой вывод: вы не хотите сохранять результат выбора / вставки / удаления / обновления или какой-либо набор результатов в локальную временную таблицу . Это то, что вам нужно было сделать в T-SQL для достижения конечной цели - реализации некоторой бизнес-логики. Но то, что вы действительно хотели сделать в SQL Server и что вы хотите сделать в Oracle, - это написать код, который принесет пользу вашей организации .
Итак, с таким мышлением, что вам нужно делать?
Если вы хотите обойти набор результатов, возможно, вам нужен Cursor Loop ?
Если вы хотите поработать с некоторыми данными перед их вставкой в данные, возможно, вам следует использовать коллекцию PL / SQL :
Но, возможно, вам просто нужно понять модель Oracle Transaction Management . В чистом SQL можно многое сделать без какой-либо процедурной основы.
(3) Объявить переменные
Прежде чем все переменные PL / SQL будут указаны в блоке PL / SQL, они должны быть объявлены в разделе объявления.
• Цель объявления - выделить место для хранения значения, указать его тип данных и указать место хранения, чтобы на него можно было ссылаться.
• Вы можете объявлять переменные в разделе объявлений любого блока, подпрограммы или пакета PL / SQL.
(4) Инициализировать переменные
Переменной выделяется место в памяти в разделе DECLARE. Переменным можно одновременно присвоить значение. Этот процесс называется инициализацией.
Во-вторых, назначьте значения в исполняемой части
После объявления переменной ее можно использовать в исполняемой части блока PL / SQL. Например, в блоке ниже переменная v_myname объявлена в разделе объявления блока. Вы можете получить доступ к этой переменной в исполняемой части того же блока. Как вы думаете, что будет печатать этот блок?
(5) Объявление и инициализация переменных, пример 1
(6) Объявление и инициализация переменных, пример 2
(2) Передайте переменную в качестве параметра подпрограмме PL / SQL.
Параметры - это значения, переданные программе пользователем или другой программой для настройки программы. В PL / SQL подпрограммы могут принимать параметры. Вы можете передавать переменные в качестве параметров процедурам и функциям. В следующем примере параметр v_date передается в процедуру PUT_LINE, которая является частью пакета DBMS_OUTPUT.
(3) Назначьте переменные для вывода подпрограммы PL / SQL.
Вы можете использовать переменные для сохранения значения, возвращаемого функцией.
Читайте также: