Oracle сохранить результат запроса в переменную

Обновлено: 18.05.2024

Ниже приведен пример использования переменных в SQL Server 2000.

Я хочу сделать то же самое в Oracle с помощью SQL Developer без дополнительной сложности. Это кажется очень простой задачей, но я не могу найти простого решения. Как я могу это сделать?

Я использую SQL-Developer в Версии 3.2. Другой материал не работал у меня, но это произошло:

Кроме того, это еще и самый гладкий способ.

В SQL-plus есть два типа переменных: подстановка и связывание.

Это подстановка (переменные подстановки могут заменить параметры команды SQL * Plus или другой жестко заданный текст):

Это связывание (переменные связывания хранят значения данных для операторов SQL и PL/SQL, выполняемых в СУБД; они могут содержать отдельные значения или полные наборы результатов):

SQL Developer поддерживает переменные подстановки, но когда вы выполняете запрос с синтаксисом bind :var вас запрашивается привязка (в диалоговом окне).

Заменить переменные UPDATE немного сложно, смотрите:

В SQL * Plus вы можете сделать что-то очень похожее

Однако вы можете добиться чего-то подобного, выполнив следующую версию с использованием переменных привязки:

После запуска запроса выше в SQL Developer вам будет предложено ввести значение для переменной bind EmployeeID.

Хорошо, я знаю, что это немного хак, но это способ использовать переменную в простом запросе, а не в скрипте:

Вы можете запустить его везде.

Вы можете читать в другом месте по переменным замещения; они довольно удобны в SQL Developer. Но я стараюсь использовать переменные связывания в SQL Developer. Это то, что я делаю:

SET SERVEROUTPUT ON делает так, чтобы текст мог быть напечатан на выходной консоли script.

Я считаю, что мы здесь официально называем PL/SQL. Мы оставили чистую землю SQL и используем другой движок в Oracle. Вы видите SELECT выше? В PL/SQL у вас всегда есть SELECT . INTO переменная или refcursor. Вы не можете просто SELECT и вернуть результат в PL/SQL.

Используйте следующий запрос:

Попробуйте, это сработает, лучше создать процедуру, если процедура невозможна, вы можете использовать этот script.

set define on; define batchNo='123'; update TABLE_NAME SET IND1 = 'Y', IND2 = 'Y' WHERE BATCH_NO = '&batchNo';

Я хочу написать повторно используемый код, и мне нужно объявить некоторые переменные в начале и повторно использовать их в скрипте, например:

Как я могу объявить переменную и повторно использовать ее в следующих инструкциях, таких как SQLDeveloper.

попытки

  • Используйте раздел DECLARE и вставьте следующий оператор SELECT в BEGIN и END; . Доступ к переменной с помощью &stupidvar .
  • Используйте ключевое слово DEFINE и получите доступ к переменной.
  • Использование ключевого слова VARIABLE и доступ к переменной.

Но во время попыток я получаю всевозможные ошибки (несвязанная переменная, синтаксическая ошибка, ожидаемая SELECT INTO . ).

Обратите внимание, что подход в принятом ответе @APC может использоваться без PL / SQL, например, в рабочем листе разработчика SQL в соответствии с вашим вопросом. Просто объявите переменную в одной строке (без точки с запятой), затем в строке exec, чтобы установить ее значение (заканчивая точкой с запятой), затем свой оператор select. Наконец, запустите его как сценарий (F5), а не как инструкцию (F9).

Есть несколько способов объявления переменных в скриптах SQL * Plus.

Первый - использовать VAR для объявления переменной привязки. Механизм присвоения значений переменной - это вызов EXEC:

VAR особенно полезен, когда мы хотим вызвать хранимую процедуру, которая имеет параметры OUT или функцию.

В качестве альтернативы мы можем использовать подстановочные переменные. Это хорошо для интерактивного режима:

Когда мы пишем сценарий, который вызывает другие сценарии, может быть полезно заранее определить переменные. Этот фрагмент кода запускается без запроса ввода значения:

Наконец, есть анонимный блок PL / SQL. Как видите, мы все еще можем назначать значения объявленным переменным в интерактивном режиме:

Все хорошо, за исключением того, что вы использовали термин «связываемая переменная». Объявление VAR создает переменную связывания, а ACCEPT или DEFINE создает переменную подстановки. @Ecropolis - да, в период использования SQL Plus по умолчанию. Используйте SET CONCAT, чтобы определить символ, который отделяет имя подстановочной переменной от буквенно-цифровых символов, следующих сразу за именем переменной. В PL / SQL или SQL используйте двойной канал || объединить. Если SQL является стандартным языком, то почему так трудно найти каноническую ссылку, которая работает везде? WTF . @jww - SQL - это стандарт, но он не всегда определяет точный синтаксис, поэтому разные продукты RDBMS могут реализовывать вещи по-разному; арифметика дат является хорошим примером. Кроме того, более старые продукты баз данных, такие как Oracle, часто вводили функции до того, как их охватывал Стандарт: например, иерархический синтаксис CONNECT BY. Но в этом случае мы обсуждаем SQL * Plus, который является клиентским инструментом и в любом случае не охвачен стандартом ANSI.

Попробуйте использовать двойные кавычки, если это переменная типа char:

Спасибо за ваш ответ, но если я добавлю переменную в двойные кавычки, я получу ORA-01008: not all variables bound . Конечно! DEFINE num = 1; SELECT &num FROM dual; ведет к: ORA-01008: not all variables bound @ bl4ckb0l7 - Держу пари, вы пытаетесь сделать это не в SQL * Plus.

ключевое слово объявлять используется для объявления переменной

чтобы присвоить значение, вы можете установить его, когда вы объявляете

или чтобы выбрать что-то в эту переменную, которую вы используете INTO оператор, однако вам нужно обернуть оператор в, BEGIN а END также вы должны убедиться, что возвращается только одно значение, и не забывайте точки с запятой.

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

Ваша переменная может использоваться только в пределах BEGIN и END поэтому , если вы хотите использовать более чем один , вам придется сделать несколько BEGIN END оберток

Надеюсь, это сэкономит вам время

Если вы хотите объявить дату, а затем использовать ее в SQL Developer.

Просто хочу добавить ответ Мэйтаса . Может быть, это очевидно, но я долго искал, чтобы выяснить, что переменная доступна только внутри конструкции BEGIN-END , поэтому, если вам понадобится использовать ее в каком-то коде позже, вам нужно поместить этот код в BEGIN -END блок .

Обратите внимание, что эти блоки могут быть вложенными :

Вопрос в том, чтобы использовать переменную в скрипте, значит, для меня она будет использоваться в SQL * Plus.

Проблема в том, что вы пропустили кавычки, и Oracle не может преобразовать значение в число.

Этот образец отлично работает благодаря автоматическому преобразованию типов (или как он там называется).

Если вы проверите, набрав DEFINE в SQL * Plus, он покажет, что переменная num имеет значение CHAR.

В этом случае это не проблема, потому что Oracle может разбирать строку на число, если это будет действительное число.

С цитатой, поэтому не заставляйте Oracle выполнять синтаксический анализ до числа, все будет в порядке:

Итак, чтобы ответить на исходный вопрос, это должно быть похоже на этот образец:

Есть другой способ сохранить переменную в SQL * Plus, используя значение столбца запроса .

COL [УМН] имеет new_value параметр в значение магазина из запроса по имени поля.

Oracle/PLSQL оператор EXECUTE IMMEDIATE подготавливает (анализирует) и немедленно выполняет динамический SQL-запрос или анонимный PL/SQL блок.
Основным аргументом EXECUTE IMMEDIATE является строка, содержащая SQL-запрос для выполнения. Вы можете создать строку, используя конкатенацию, или использовать предопределенную строку.
Динамическая строка может содержать любой оператор SQL (без последней точки с запятой), за исключением многострочных запросов или любой PL/SQL блок (с последней точкой с запятой).
Строка dynamic_string также может содержать заполнители, произвольные имена, которым предшествует двоеточие, для аргументов связывания bind_argument . В этом случае вы указываете, какие переменные PL/SQL соответствуют заполнителям, с помощью операторов INTO, USING и RETURNING INTO. Во время выполнения аргументы связывания заменяют соответствующие заполнители в динамической строке. Каждый заполнитель должен быть связан с аргументом связывания в предложении USING и/или предложении RETURNING INTO.

Синтаксис

Синтаксис Oracle/PLSQL оператора EXECUTE IMMEDIATE для передачи значения в переменную или строку:

EXECUTE IMMEDIATE dynamic_string
[ INTO <[define_variable[, define_variable] . | record_name>]
[USING [IN | OUT | IN OUT] bind_argument ]
returning_clause;

или синтаксис Oracle/PLSQL оператора EXECUTE IMMEDIATE для передачи значения в коллекцию

EXECUTE IMMEDIATE dynamic_string
[[ BULK COLLECT] INTO ]
[USING [IN | OUT | IN OUT] bind_argument]
returning_clause;

Параметры или аргументы

dynamic_string Строковый литерал, переменная или выражение, представляющее один оператор SQL или блок PL/SQL. Он должен иметь тип CHAR или VARCHAR2, а не NCHAR или NVARCHAR2. BULK COLLECT Сохраняет значения результатов в одной или нескольких коллекциях для более быстрых запросов, чем циклы с операторами FETCH. INTO Используется только для однострочных запросов, в этом разделе указываются переменные или записи, в которые извлекаются значения столбцов. Для каждого значения, полученного запросом, в предложении INTO должна быть соответствующая тип-совместимая переменная или поле. define_variable Переменная, в которой сохраняется значение выбранного столбца. record_name Пользовательская запись или запись %ROWTYPE, в которой сохраняется выбранная строка. bind_argument Выражение, значение которого передается в динамический оператор SQL, или переменная, в которой сохраняется значение, возвращаемое динамическим оператором SQL. collection_name Объявленная коллекция, в которую извлекаются значения select_item из dynamic_string . Для каждого select_item должна быть соответствующая, совместимая с типом коллекция в списке. host_array_name Массив (объявленный в хост-среде PL/SQL и переданный PL/SQL как переменная связывания), в который извлекаются значения select_item. Для каждого select_item должен быть соответствующий, совместимый с типом массив в списке. Массивы хоста должны начинаться с двоеточия. USING По умолчанию - IN. Определяет список входных и/или выходных аргументов привязки. returning_clause Возвращает значения из вставленных строк, устраняя необходимость SELECT строки после. Вы можете извлечь значения столбца в переменные или в коллекции. Вы не можете использовать предложение RETURNING для удаленной или параллельной вставки. Если инструкция не влияет ни на какие строки, значения переменных, указанных в предложении RETURNING, не определены.

Примеры:

Некоторые примеры динамического SQL

Рассмотрим несколько примеров использования Oracle/PLSQL оператора EXECUTE IMMEDIATE, чтобы понять как использовать EXECUTE IMMEDIATE в Oracle/PLSQL.
Описание команд в комментариях (--).

Все строки или некоторые строки другой таблицы также могут быть вставлены в таблицу с помощью оператора INSERT INTO. Строки другой таблицы будут выбираться на основе одного или нескольких критериев с помощью оператора SQL SELECT.

Пример:

Пример таблицы: агенты

Пример таблицы: агентбангалор

Добавить записи таблицы «агенты» в таблицу «agentbangalore» со следующим условием -

1. «рабочая_область» таблицы «агенты» должна быть «Бангалор»,

можно использовать следующий оператор SQL:

Код SQL:

Вставка результата запроса в другую таблицу с порядком

Упорядоченный порядок строк (восходящий или нисходящий) одной таблицы также можно вставить в другую таблицу с помощью оператора SQL SELECT вместе с предложением ORDER BY.

Пример:

Пример таблицы: агентбангалор

Пример таблицы: агенты

Чтобы добавить записи таблицы «агенты» в таблицу «agentbangalore» при следующих условиях:

1. строки таблицы «агенты» должны быть расположены в порядке убывания столбца «имя_агента»,

2. «рабочая_область» таблицы «агенты» должна быть «Бангалор»,

можно использовать следующий оператор SQL:

Код SQL:

Вставка результата запроса в другую таблицу с группировкой по

Группу строк одной таблицы также можно вставить в другую таблицу с помощью оператора SQL SELECT вместе с предложением GROUP BY.

Пример:

Пример таблицы: заказы

Образец таблицы: дни заказа

Добавить записи в таблицу daysorder для столбцов ord_date, ord_amount и advance_amount из тех же столбцов таблицы заказов при следующих условиях:

3. сделать сумму «advance_amount» для каждой группы,

4. данные каждой группы в таблице «заказы» должны быть вставлены в таблицу «порядок дней»,

можно использовать следующий оператор SQL:

Код SQL:

Вставка записей с помощью выбора с группировкой и упорядочить по

Далее мы обсудим, как можно вставлять записи другой таблицы с помощью оператора SQL SELECT вместе с ORDER BY и GROUP BY в операторе INSERT INTO.

Пример:

Пример таблицы: заказы

Образец таблицы: дни заказа

Для вставки записей в таблицу daysorder для столбцов ord_date, ord_amount и advance_amount из тех же столбцов таблицы заказов при следующих условиях:

4. сделать сумму «advance_amount» для каждой группы,

5. данные каждой группы в таблице «заказы» следует вставить в таблицу «порядок дней»,

можно использовать следующий оператор SQL:

Код SQL:

Вот новый документ, который представляет собой набор вопросов с короткими и простыми ответами, полезными для изучения SQL, а также для интервью.

Упражнения по SQL

  • Упражнения по SQL, практика, решение
  • SQL Получить данные из таблиц [33 Упражнения]
  • Булевы и реляционные операторы SQL [12 упражнений]
  • Подстановочные знаки SQL и специальные операторы [22 упражнения]
  • Агрегатные функции SQL [25 упражнений]
  • Вывод запроса форматирования SQL [10 упражнений]
  • SQL-запросы к нескольким таблицам [7 упражнений]
  • ФИЛЬТРАЦИЯ И СОРТИРОВКА в базе данных персонала [38 упражнений]
  • SQL СОЕДИНЯЕТ
    • SQL СОЕДИНЯЕТСЯ [29 упражнений]
    • SQL присоединяется к базе данных HR [27 упражнений]
    • ПОДПИСИ SQL [39 упражнений]
    • SQL ПОДПИСИ по базе данных HR [55 упражнений]
    • ОСНОВНЫЕ запросы к базе данных фильмов [10 упражнений]
    • ПОДПИСКИ на фильм База данных [16 упражнений]
    • ПРИСОЕДИНЯЕТСЯ к базе данных фильма [24 упражнения]
    • Вступление
    • ОСНОВНЫЕ запросы по футболу базы данных [29 упражнений]
    • ПОДПИСКИ по футбольной базе данных [33 упражнения]
    • ПРИСОЕДИНЯЕТСЯ к запросам по футбольной базе данных [61 упражнений]
    • Вступление
    • ОСНОВНЫЕ, ПОДПИСИ И СОЕДИНЕНИЯ [39 упражнений]
    • ОСНОВНЫЕ запросы к базе данных сотрудников [115 упражнений]
    • БРОНИРОВАНИЕ на сотрудника База данных [77 Упражнения]

    Хотите улучшить вышеуказанную статью? Вносите свои заметки / комментарии / примеры через Disqus.

    Читайте также: