Oracle в индексе отсутствует параметр in или out
У меня возникли проблемы с тестированием этой простой хранимой процедуры в Oracle Sql Developer. Хранимая процедура выполняет простой выбор и возвращает курсор.
Чтобы проверить эту процедуру, я использовал следующий сценарий:
Поскольку я новичок как в Oracle, так и в инструменте Sql Developer, я изо всех сил пытаюсь понять, в чем здесь ошибка. Я не могу проверить это в Sql * Plus, потому что у меня нет для этого пароля. Я использую Oracle Sql Developer 1.1.2.25 и Oracle 10g.
Кто-нибудь может мне помочь, пожалуйста? Заранее спасибо.
задан 21 сен '10, 13:09
Я не понимаю комментария о невозможности использования SQL * Plus. Разве пароль не будет таким же, как пароль, используемый с SQL Developer? - Shannon Severance
Я предполагаю, что пароль, вероятно, находится в одном из файлов конфигурации для Sql Developer. Обычно я никогда не набираю пароль, когда использую Sql Developer. - sammy
Вы пытались вместо этого использовать "установить автопечать" перед exec и запускать его как скрипт? (F5) - Rajesh Chamarthi
Пробовал сейчас. Он по-прежнему ошибается. Почему должно быть написано «Отсутствует параметр…». Здесь всего два параметра, и я указываю их оба. Поскольку второй параметр - это ВЫХОД, я просто объявил его и использовал. Я что-то упускаю? - sammy
5 ответы
У меня была аналогичная ошибка, когда я использовал JDBC в Java-коде.
Согласно информации это веб-сайт (второй awnser) он предполагает, что вы пытаетесь выполнить запрос с отсутствующим параметром.
Вы пытаетесь выполнить запрос без последнего параметра.
Может быть в SQLPlus у него нет таких же требований, так что, возможно, это было удачей, что он там сработал.
Основываясь на комментариях, оставленных выше, я запустил это под sqlplus вместо SQL Developer, и оператор UPDATE работал отлично, что заставило меня поверить, что это проблема в SQL Developer, особенно потому, что не возвращался номер ошибки ORA. Спасибо, что направили меня в правильном направлении.
Это не проблема с SQL Developer. В variable L_kSite number; это особая конструкция SQL plus. - Рене Ниффенеггер
Я думаю, это связано с jdbc.
У меня аналогичная проблема (отсутствует параметр), когда у меня есть такое условие:
Ничего страшного, когда у меня вот так:
Так что проблема с именованными параметрами. Я думаю, что есть ошибка с обработкой именованных параметров, похоже, если только первый параметр получает правильное значение, второй не устанавливается классами драйверов. Может быть, это не ошибка, только я чего-то не знаю, но в любом случае я думаю, что это причина разницы между SQL dev и sqlplus, запущенными для вас, потому что, насколько мне известно, разработчик SQL использует драйвер jdbc.
ответ дан 29 окт '12, 11:10
Я получил ту же ошибку и обнаружил, что причина неправильная или отсутствует внешний ключ. (Используя JDBC)
ответ дан 15 авг.
У меня возникла эта ошибка из-за опечатки в псевдониме столбца, содержащего вопросительный знак (например, contract.reference as contract? Ref)
ответ дан 31 окт '16, 13:10
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками oracle oracle-sqldeveloper or задайте свой вопрос.
// вставляем 1-ю строку
// вставляем 2-ю строку
Разве это не должно быть INSERT INTO employee(emp_name, emp_address). а затем установить параметры? - markus
3 ответы
Объявление переменной должно быть рефкурсор вместо sys_refcursor. Кроме того, когда вы распечатываете результаты, вы печатаете саму переменную, поэтому нет необходимости в : (который используется, чтобы указать, что это связанная переменная).
Мне удалось успешно запустить следующий сценарий в SQL Developer (и, конечно, в sql plus). Для SQL Developer запустите его как сценарий с помощью F5.
А затем сценарий, вызывающий эту процедуру. (выполнить как скрипт с помощью F5).
Спасибо за ответ. Я внес изменения, как вы посоветовали, но все равно не повезло :-( - Сэмми
Я действительно запустил этот код в sql-разработчике и смог увидеть результаты. Не уверен, что у вас не так. Вы пробовали предоставленные мной фрагменты кода? (Вы можете запускать их, не создавая никакой таблицы). - Раджеш Чамарти
Мне тоже удалось запустить ваш точный код .. "переменная результатов refcursor; exec get_project_drf_history (3345,: results); print results;" Работал - Раджеш Чамарти
вот рабочий пример, объявите рефкурсор, а затем назначьте значение, вызвав вас proc в анонимном блоке. затем вы распечатываете это
на основе комментария: теперь, используя ваш комментарий, у вас проблема с параметрами IN / OUT, а не с печатью (не читал заголовок, только вопрос и другой ответ)
это работает: (на основе вашего кода)
Вы также можете отлаживать пакеты и процедуры непосредственно из SQL Developer (это может спасти жизнь), если вы хотите отлаживать в SQL Developer, это действительно просто:
в соединениях -> ваша схема -> процедуры -> GET_PROJECT_DRF_HISTORY щелкните правой кнопкой мыши и выберите «Скомпилировать для отладки». Затем в процедуре поместите в нее точку останова, затем щелкните правой кнопкой мыши и выполните отладку (это создаст анонимный блок - см. Ниже - где вы можете ввести свои значения и т.д.)
в противном случае ошибка не будет выглядеть так, как должна появиться, если вы все это делаете из разработчика.
Но я действительно думаю, что ваш VAR неверен и, следовательно, не существует!
Итак, исходя из моего первоначального примера "var x REFCURSOR;" должно сработать
I have an Oracle script that looks like the following:
Supposedly the last statement is a valid use of a bind variable but when I try to run the script I get this on the last line:
I'm not sure how to proceed here as I'm not especially proficient in Oracle.
Do your run this in sqlplus? Is the errorcode you catched ORA-17041? Could you provide signature for both procedures? Are there triggers on table?
The format of the error message suggests you are using SQL Developer to run this script. Is this the case? If so, what version of the tool? Also, what version of the database?
@APC: SQL Developer 1.5.5, Oracle Express 10.2.0.1.0. @Christian: No; there's no ORA error code at all; I could but the error is definitely occurring on the UPDATE statement; no.
5 ответы
Это не то, как работает SQL:
Ценности (hans,germany) следует использовать имена столбцов (emp_name, emp_address) . Значения предоставляются вашей программой с помощью Statement.setString(pos,value) методы. Он жалуется, потому что вы сказали, что есть два параметра (вопросительные знаки), но не указали значения.
Вы должны создать PreparedStatement, а затем установить значения параметров, как показано ниже:
Вы должны использовать имена столбцов, а затем установить значения для вставки (оба знака ?):
ответ дан 08 авг.
В ваших операторах INSERT:
У вас есть значения, которым принадлежат ваши имена полей. Измените его на:
Если бы вы запускали этот оператор из командной строки SQL, он выглядел бы так:
Обратите внимание, что вам нужно будет заключать в одинарные кавычки значения string/varchar.
Кроме того, вы также не добавляете никаких параметров в подготовленный оператор. Это то, что на самом деле вызывает ошибку, которую вы видите. Попробуй это:
Также (согласно Oracle), вы можете использовать «выполнить» для любого оператора SQL. Использование «executeUpdate» также будет допустимым в этой ситуации, которое вернет целое число, указывающее количество затронутых строк.
ответ дан 08 авг.
Первая проблема заключается в том, что ваша строка запроса неверна:
Я думаю, что это: "INSERT INTO employee(hans,germany) values(. )" должно быть так: "INSERT INTO employee(name,country) values(. )"
Другая проблема заключается в том, что у вас есть параметризованный PreparedStatement, и вы не устанавливаете параметры перед его запуском.
Вы должны добавить их в свой код:
См. ссылку ниже для получения информации о том, как использовать PreparedStatement. Я тоже процитировал по ссылке.
Вы должны указать значения вместо заполнителей вопросительного знака (если они есть), прежде чем вы сможете выполнить объект PreparedStatement. Сделайте это, вызвав один из методов установки, определенных в классе PreparedStatement. Следующие операторы задают два заполнителя вопросительных знаков в PreparedStatement с именем updateSales:
updateSales.setInt(1, e.getValue().intValue()); updateSales.setString(2, e.getKey());
6 Answers 6
I had a similar error on my side when I was using JDBC in Java code.
According to this website (the second awnser) it suggest that you are trying to execute the query with a missing parameter.
You are trying to execute the query without the last parameter.
Maybe in SQLPlus it doesn't have the same requirements, so it might have been a luck that it worked there.
Based on the comments left above I ran this under sqlplus instead of SQL Developer and the UPDATE statement ran perfectly, leaving me to believe this is an issue in SQL Developer particularly as there was no ORA error number being returned. Thank you for leading me in the right direction.
I think its related with jdbc.
I have a similar problem (missing param) when I have a where condition like this:
It's ok, When I have like this:
So it's a problem with named parameters. I think there is a bug around named parameter handling, it looks like if only the first parameter get the right value, the second is not set by driver classes. Maybe its not a bug, only I don't know something, but anyway I guess that's the reason for the difference between the SQL dev and the sqlplus running for you, because as far as I know SQL developer uses jdbc driver.
//вставить 1-ю строку
//вставить 2-й ряд
это не так работает SQL:
значения (hans,germany) должны использовать имена столбцов (emp_name, emp_address) . Значения предоставляются вашей программой с помощью Statement.setString(pos,value) методы. Он жалуется, потому что вы сказали, что есть два параметра (вопросительные знаки), но не предоставили значения.
вы должны создать PreparedStatement, а затем установить значения параметров, как в:
вы должны использовать имена столбцов, а затем задайте значения для вставки (как ? Маркс):
первая проблема заключается в том, что ваша строка запроса неверна:
Я думаю, что это: "INSERT INTO employee(hans,germany) values(. )" должно быть так: "INSERT INTO employee(name,country) values(. )"
другая проблема заключается в том, что у вас есть параметризованное PreparedStatement и вы не устанавливаете параметры перед его запуском.
вы должны добавить их в свой код:
в ваших инструкциях INSERT:
у вас есть свои значения, где ваши имена полей принадлежат. Измените его на:
если бы вы должны были запустить этот оператор из приглашения SQL, это выглядело бы так:
обратите внимание, что вам нужно будет поместить одинарные кавычки вокруг значений string/varchar.
кроме того, вы также не добавляете никаких параметров в подготовленный оператор. Вот что на самом деле вызывает ошибку вы видение. Попробуйте это:
и (по данным Oracle), вы можете использовать "execute" для любого оператора SQL. Использование "executeUpdate" также будет допустимым в этой ситуации, который вернет целое число, чтобы указать количество затронутых строк.
см. ссылку ниже для получения информации о том, как использовать PreparedStatement. Я также процитировал ссылку.
необходимо указать значения вместо заполнителей вопросительного знака (если есть любые), прежде чем вы сможете выполнить объект PreparedStatement. Делать это путем вызова одного из методов setter, определенных в Класс объект PreparedStatement. Следующий оператор поставьте два вопросительный знак заполнители в PreparedStatement с именем updateSales:
updateSales.setInt(1, e.getValue ().сертификата от его закодированной формы()); updateSales.setString(2, e.getKey ());
У меня есть сценарий Oracle, который выглядит следующим образом:
Предположительно последний оператор является допустимым использованием переменной связывания, но когда я пытаюсь запустить скрипт, я получаю это в последней строке:
Я не уверен, что делать дальше, поскольку я не особо разбираюсь в Oracle.
Вы запускаете это в sqlplus? Вы поймали код ошибки ORA-17041? Не могли бы вы подписать обе процедуры? Есть ли на столе триггеры? - Christian13467
@APC: SQL Developer 1.5.5, Oracle Express 10.2.0.1.0. @Christian: Нет; вообще нет кода ошибки ORA; Я мог бы, но ошибка определенно возникает в операторе UPDATE; нет. - Otis
Читайте также: