Не все переменные привязаны oracle

Обновлено: 04.07.2024

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

Как я могу объявить переменную и повторно использовать ее в следующих инструкциях, таких как 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 утверждает, что не все переменные связаны?

спросил(а) 2020-03-15T15:49:09+03:00 1 год, 8 месяцев назад

Я нашел, как запустить запрос без ошибок, но я не решаюсь назвать это "решением", не понимая при этом основной причины.

Это более похоже на начало моего фактического запроса:

Второй набор комментариев выше, в начале подзапроса, был проблемой. После удаления запрос выполняется. Другие комментарии в порядке.
Это не вопрос какой-либо изгоев или отсутствующей новой строки, заставляя прокомментировать следующую строку, потому что следующая строка - это SELECT. Отсутствующий выбор приведет к другой ошибке, чем "не все связанные переменные".

Я спросил и нашел одного сотрудника, который столкнулся с этим - комментарии, вызывающие ошибки запроса - несколько раз.
Кто-нибудь знает, как это может быть причиной? Я понимаю, что самое первое, что СУБД будет делать с комментариями, это увидеть, содержат ли они подсказки, а если нет, удалите их во время разбора. Как обычный комментарий, не содержащий необычных символов (только буквы и период), вызывает ошибку? Bizarre.

ответил(а) 2020-03-15T16:00:25.903248+03:00 1 год, 8 месяцев назад

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

Рассмотрение каждой копии как другой переменной и ее значение несколько раз является обходным решением и болью, как упомянуто furman87, и может привести к ошибкам, если вы пытаетесь переписать запрос и перемещать вещи.

Правильный способ - установить для свойства BindByName свойства OracleCommand значение true:

ответил(а) 2020-03-15T15:49:09+03:00 1 год, 8 месяцев назад

У вас есть две ссылки на переменную привязки: lot_priprc - в то время как она должна требовать только установить значение переменной один раз и связать ее в обоих местах, у меня были проблемы, когда это не сработало и пришлось обрабатывать каждый копировать как другую переменную. Боль, но это сработало.

ответил(а) 2020-03-30T16:06:26.791415+03:00 1 год, 7 месяцев назад

В вопросе комментариев Чарльза: чтобы ухудшить ситуацию, пусть

с помощью параметра команды, затем выполните

и при изменении строковой строки от === до ---

Оба оператора отлично работают в SQL Developer. Укороченный код:

ответил(а) 2020-03-15T15:49:09+03:00 1 год, 8 месяцев назад ответил(а) 2020-03-15T15:49:09+03:00 1 год, 8 месяцев назад

Пришел сюда для поиска справки, так как получил ту же ошибку, что и оператор, указанный ниже, проходя через курс Udemy:

Раньше я мог запускать операторы с переменными замещения. Комментарий Чарльза Бернса о возможности достижения сервером некоторого порога при воссоздании переменных заставил меня выйти из системы и перезапустить SQL Developer. Заявление прошло успешно после входа в систему.

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

ответил(а) 2020-03-15T15:49:09+03:00 1 год, 8 месяцев назад

У меня была бы аналогичная проблема в устаревшем приложении, но параметр "-" был строковым.

Изменение значения параметра адреса '-' до '00' или другое. Работает.

ответил(а) 2020-03-15T15:49:09+03:00 1 год, 8 месяцев назад

Решение в моей ситуации было похоже на Чарльза Бернса; и проблема была связана с комментариями кодов SQL.

ORA-01008: не все переменные связаны

Запрос и код следуют. Имена переменных были изменены, чтобы защитить невинных:

Почему Oracle утверждает, что не все переменные связаны?

Я нашел, как выполнить запрос без ошибок, но я не решаюсь назвать его «решением», не понимая основную причину.

Это больше похоже на начало моего фактического запроса:

Второй набор комментариев выше, в начале подзапроса, был проблемой. После удаления запрос выполняется. Другие комментарии хороши . Это не вопрос какого-то мошенничества или отсутствия новой строки, приводящей к тому, что следующая строка комментируется, потому что следующая строка является SELECT. Отсутствие выбора приведет к ошибке, отличной от «не все переменные связаны».

Я расспросил и нашел одного коллегу, который сталкивался с этим - комментарии, вызывающие сбои запросов - несколько раз .. Кто-нибудь знает, как это может быть причиной? Насколько я понимаю, самое первое, что СУБД будет делать с комментариями, это посмотреть, содержат ли они подсказки, а если нет, удалить их во время анализа. Как обычный комментарий, не содержащий необычных символов (только буквы и точка), может вызвать ошибку? Bizarre.

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

Обработка каждой копии как отдельной переменной и установка ее значения несколько раз - это обходной путь и боль, как упомянул furman87, и может привести к ошибкам, если вы попытаетесь переписать запрос и переместить вещи.

Правильный способ - установить для свойства BindByName OracleCommand значение true, как показано ниже:

Вы также можете создать новый класс для инкапсуляции OracleCommand, установив для BindByName значение true при создании экземпляра, чтобы вам не приходилось каждый раз устанавливать значение. Это обсуждается в это пост

У вас есть две ссылки на переменную привязки: lot_priprc - хотя она должна требует, чтобы вы устанавливали значение переменной только один раз и связывали его в обоих местах, у меня были проблемы, когда это не сработало, и пришлось лечить каждая копия как отдельная переменная. Боль, но это сработало.

Пришел сюда в поисках помощи, так как получил ту же ошибку, выполнив оператор, указанный ниже, проходя курс Удеми:

Я был в состоянии выполнять операторы с переменными подстановки раньше. Комментарий Чарльза Бернса о возможности достижения сервером некоторого порога при воссоздании переменных побудил меня выйти из системы и перезапустить SQL Developer. Оператор работает нормально после входа в систему.

Мысль, которой я поделюсь для всех, кто рискует здесь с проблемой ограниченного масштаба, как моя.

Решение в моей ситуации было аналогичным ответом Чарльзу Бернсу; и проблема была связана с комментариями кода SQL.

«ORA-01008: не все переменные связаны»

SQL с ошибкой: «ORA-01008: не все переменные связаны» .

Я только что начал с PL/SQL и написал простой фундаментальный код. Я не собираюсь выяснять, что не так с кодом.

Я получаю ORA-01008: not all variables bound .

Раньше я пытался:

Это обновило все строки таблицы. Что ж, это было вполне оправданно. Но что делать, если я хочу использовать то же имя переменной, что и в таблице? Я тоже пытался:

Но та же ошибка ORA-01008

4 ответа

У меня есть следующий код C, который использует хранимую процедуру для вставки 2 строк в базу данных: char query[1024]; memset(query, 0, sizeof(query)); sprintf(query, BEGIN bns_saa_message_insert (:1, :2); END;); /* prepare statement */ if( checkerr(errhp, OCIStmtPrepare(stmthp, errhp, (text *).

Если вы хотите использовать то же имя переменной, что и имя столбца, вы можете попробовать выполнить следующую процедуру,

Вы можете обратиться к v$reserved_words , чтобы определить, можно ли использовать конкретное слово, например ROLE в PL/SQL:

Тот факт, что этот оператор возвращает строку, указывает на то, что действительно ROLE действительно является ключевым словом и, следовательно, пока не может использоваться в PL/SQL., res_attr_ -это N , что указывает на то, что слово может использоваться в таблице для имени атрибута.

Пусть это сработает

Похожие вопросы:

У меня есть некоторые SQL, которые я использую для запроса базы данных oracle. Я пытаюсь создать и ссылаться на связанные переменные,но получаю ошибку ORA-01008: не все переменные связаны. Я.

У меня есть следующий код C, который использует хранимую процедуру для вставки 2 строк в базу данных: char query[1024]; memset(query, 0, sizeof(query)); sprintf(query, BEGIN bns_saa_message_insert.

я пытаюсь получить некоторые записи из пакета DB (ORTAK.MERNIS), используя его функцию (GETMERNISINFO(номер v_var)) в тип пакета PLL (MERNISLIB.MERNIS_USER). Но у меня есть проблема с отправкой.

У меня есть ошибка Oracle ( ORA-01008 ): дело в том, что эта ошибка появляется впервые, без изменения таблицы/схемы (но было обновление базы данных). Я попробовал выполнить немедленно, но все равно.

Здравствуйте, на этот вопрос был дан ответ пару лет назад, но он уже некоторое время не был активен. Когда я запускаю пример с моими значениями, он выдает мне ошибку ORA 01008, но значения therow.

Я пытаюсь вставить данные с php по oracle но у меня есть ошибка oci_execute(): ORA-01008: not all variables bound Примечание: вставьте некоторые данные, не все из которых поданы в таблицу. $sql =.

Я использую VS2013 с Oracle 11g. Я пытаюсь получить данные из Oracle на основе email. Это работает , потому что email жестко закодирован в предложении WHERE . var connection = new.


Переменные связывания - это технический момент, на который стоит обратить внимание в системах OLTP. Хорошая привязка переменных сделает SQL в системной базе данных OLTP очень быстрым, а эффективность использования памяти будет чрезвычайно высокой. Несвязанные переменные могут привести к перегруженности базы данных OLTP, ресурсы потребляются при разборе SQL, и система работает медленно.

Случай этого поста основан на Oracle Database 11g Enterprise Edition Release 11.2.0.4.0


Прежде чем вводить переменные связывания, нам нужно знать, как именно выполняется SQL?

Когда пользователь устанавливает соединение с базой данных, он отправляет в базу данных оператор SQL.После получения этого SQL Oracle сначала выполнит операцию Hash-функции для SQL, чтобы получить значение Hash, а затем перейдет в общий пул, чтобы выяснить, есть ли какие-либо SQL с совпадающим хеш-значением существует.

Если найден, Oracle будет напрямую использовать существующий план выполнения SQL для выполнения текущего SQL, а затем вернет результаты пользователю.

Если не найден, Oracle будет рассматривать это как новый SQL, который будет выполняться в следующем порядке:

1. Грамматический анализ


2. Семантический анализ

После того, как анализ синтаксиса пройден, Oracle проверит некоторые объекты и разрешения для этого SQL, чтобы выяснить, существует ли таблица, работающая на SQL, правильны ли столбцы в таблице и есть ли у пользователя разрешение на управление объектом.


3. Создайте план выполнения

Этот процесс Oracle составляет окончательный план выполнения SQL после ряда операций, таких как просмотр статистической информации об объекте операции, динамическая выборка и так далее.

Для получения подробной информации о том, как создать план выполнения, вы можете обратиться к событию 10053

4. Выполнить SQL

Oracle выполняет SQL в соответствии с планом выполнения, сгенерированным на предыдущем шаге, и возвращает результат пользователю.

Вышеуказанная работа, которую мы обычно называем сложным анализом, фактически потребляет системные ресурсы. SQL с таким же значением Hash уже существует в общем пуле, называется soft parse.

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

Использовать ли переменные связывания для сравнения потребления ресурсов

Давайте посмотрим на потребление ресурсов связанных и несвязанных переменных для одного и того же SQL, выполненного 10000 раз.

Используйте переменные связывания

Открыть SQL_TRACE

Анализ Tkprof и резюме исходного файла трассировки

После получения файла трассировки на сервере Oracle используйте tkprof для анализа, суммирования и просмотра.

Давайте посмотрим на ключевые части после анализа и обобщения



Весь процесс плюс сгенерированный рекурсивный SQL, мы можем увидеть весь оператор:

ALL NON-RECURSIVE STATEMENTS + ALL RECURSIVE STATEMENTS

  • Время выполнения (истекшее): 0,48 + 0,10 = 0,58 (приблизительно только время выхода)
  • Процессорное время (процессор): 0,48 + 0,09 = 0,57
  • Время анализа (разбор): 8 + 2 = 10
  • Время выполнения (выполнить): 9 + 10017 = 10025

Не используйте переменные связывания

Выполнить сводку анализа tkprof


Просмотр ключевых частей xgj_var_unbind.txt


. Десять миллионов слов опущены в середине


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


Информация о том же исполнении под нашей статистикой:

ALL NON-RECURSIVE STATEMENTS + ALL RECURSIVE STATEMENTS

  • Время выполнения (прошедшее): 1,28 + 15,38 = 16,66
  • Процессорное время (процессор): 1,22 + 15,31
  • Время анализа (разбор): 3 + 20000
  • Время выполнения (выполнить): 4 + 20000

Для сравнения мы можем найти, что В системе OLTP Потребление ресурсов SQL с использованием связанных переменных намного меньше, чем у несвязанных переменных SQL. Чем больше выполнений SQL, тем более очевиден разрыв.

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

Представьте себе, что когда база данных имеет десятки тысяч и более пользователей, выполняющих такой SQL одновременно, а ORACLE выполняет только жесткий анализ, тот же SQL будет выполнять только операцию выполнения SQL, что неизбежно уменьшит накладные расходы на ресурсы базы данных.

Это происхождение переменной связывания. Она не таинственная, но вместо того, чтобы использовать переменную для замены константы предиката, пусть ORACLE хеширует SQL, отправляемый пользователем каждый раз, чтобы вычислять одно и то же значение хеша, поэтому Oracle будет смотреть на эти SQL Сделайте ту же обработку SQL.

Если для создания базы данных вы используете графический инструмент Oracle DBCA, у вас должно сложиться впечатление: один шаг - попросить вас выбрать тип базы данных OLTP или OLAP. Фактически это показывает, что базы данных OLTP и OLAP сильно различаются: Oracle необходимо знать архитектуру системы, которую вы выбираете, чтобы можно было установить соответствующие значения параметров в соответствии с архитектурой системы, такой как параметры инициализации.

OLTP каштаны

данные:

сводный анализ tkprof




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

Как видно из файла трассировки, на этапе выборки при полном сканировании таблицы было прочитано более 42093 блоков данных, в то время как индексированные на этапе выборки были прочитаны только 308 блоков данных.

OLAP каштаны

Система OLAP намного сложнее в работе с SQL. Большую часть времени в базе данных OLAP выполняет какой-то отчет SQL. Эти SQL часто используют агрегированные запросы (например, group by), и набор результатов также очень велик. В этом случае Далее, индекс не является неизбежным выбором, и даже иногда производительность полного сканирования таблицы будет зависеть от индекса, даже если один и тот же SQL, если условия предиката отличаются, план выполнения может отличаться

данные

Мы используем следующую команду

Примечание: приведенная выше команда выполняется на клиенте plsql и может поддерживаться, но Команда autotrace, plsql, не очень хорошо поддерживается, поэтому я вошел на хост, где расположен сервер, и выполнил ее, конечно, я также могу работать через клиента sqlplus.




Из результатов видно, что, хотя отличается только предикат, оракул выбрал другой план выполнения, поскольку Oracle считает, что такой план имеет наименьшую стоимость.

в заключении

  1. Системе OLAP вообще не нужно устанавливать переменные привязки, это будет иметь только отрицательные последствия, например, заставит SQL выбрать неправильный план выполнения, позволит Oracle выполнять жесткий анализ для каждого SQL и точно знать значение условия предиката. Это влияет на план выполнения. Выбор имеет решающее значение. Это связано с тем, что в системе OLAP затраты на жесткий анализ SQL незначительны. Ресурсы системы в основном используются для более крупных запросов SQL. По сравнению с запросом ресурсы, потребляемые при разборе SQL, явно незначительны, поэтому оптимальный План реализации становится особенно важным
  2. В системе OLAP дайте Oracle точно знать значение условия предиката, которое напрямую определяет выбор плана выполнения SQL. Способ сделать это - не связывать переменные
  3. В системе OLAP анализ индекса таблицы очень важен, потому что он является источником информации и предложением для Oracle составить правильный план выполнения для SQL.

Когда дело доходит до привязки переменных, мы должны упомянуть новую функцию, введенную в Oracle9i, которая называется bind peaking, как следует из названия, когда сложно выполнить синтаксический анализ оператора SQL, Oracle будет смотреть на значение текущего предиката SQL, чтобы сгенерировать наибольшее количество Хороший план исполнения.

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

Просмотр привязки в конечном итоге не решает проблему разных планов выполнения, вызванных разными предикатами, а может только сделать план выполнения более точным, когда SQL выполняется впервые. OLAP по-прежнему не должен использовать переменные связывания.

Для системы OLTP та же частота повторения SQL очень привлекательна: если оптимизатор Fan Lake анализирует SQL, он неизбежно потребляет ресурсы. Кроме того, результаты пользовательских запросов в системе OLTP, как правило, очень малы, в основном будут учитываться индексы. При проверке привязки был получен правильный план выполнения во время первого жесткого анализа. Последующий SQL выполняется в соответствии с этим планом, что может значительно повысить производительность системы. Это определяется характеристиками системы OLTP.

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