Ошибка PLS-00306 при вызове курсора
Вопрос
Я думаю, что, возможно, я здесь чего-то не понимаю.Вот соответствующая часть триггера:
CURSOR columnNames (inTableName IN VARCHAR2) IS
SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName;
/* Removed for brevity */
OPEN columnNames('TEMP');
И вот сообщение об ошибке, которое я получаю обратно,
27/20 PLS-00306: wrong number or types of arguments in call to 'COLUMNNAMES' 27/2 PL/SQL: Statement ignored
Если я правильно понимаю документацию, это должно сработать, но поскольку это не так, я, должно быть, делаю что-то не так.Есть какие-нибудь идеи?
@Мэтью - Я ценю помощь, но причина, по которой я в замешательстве, заключается в том, что этот фрагмент кода у меня не работает и вызывает ошибки, на которые ссылаются.У нас есть другие триггеры в базе данных с кодом, почти точно таким же, как этот, поэтому я не уверен, что это что-то, что я сделал неправильно, или что-то с тем, как я пытаюсь сохранить триггер, и т.д.
@Мэтью - Ну, теперь я начинаю чувствовать себя неловко.Я скопировал / вставил код, который вы предоставили, в новый триггер, и он сработал нормально.Итак, я вернулся к исходному триггеру, попробовал его и снова получил сообщение об ошибке, за исключением того, что на этот раз я начал удалять содержимое из триггера, а после избавился от этой строки,
FOR columnName IN columnNames LOOP
Все сохранилось нормально.Таким образом, оказывается, что там, где я думал, была ошибка, на самом деле ее не было.
Решение
@Роб
Если вы вырезаете / вставляете код, который у меня здесь есть, это работает?
Как / куда вы вызываете свой код?это в триггере, не так ли?
Запрос, который вы написали здесь, - это фактически код, выдающий ошибку, или просто пример (например, можете ли вы воспроизвести ошибку с помощью приведенного выше запроса)
Другие советы
Чтобы прояснить причину проблемы.Как вы заявляете
ОТКРЫТЬ имена столбцов ('TEMP');
работал, пока
ДЛЯ имени столбца В ЦИКЛЕ ColumnNames
этого не произошло.Оператор FOR работал бы нормально, если бы он также включал параметр, подобный этому:
ДЛЯ имени столбца В ЦИКЛЕ ColumnNames('TEMP')
Вы не показываете код, в котором вы извлекаете строки, поэтому я не могу сказать вашу цель, но where I work OPEN обычно используется для извлечения первой строки (в данном случае имени первого столбца данной таблицы), в то время как FOR используется для перебора всех возвращаемых строк.
Комментарий @Роба.Мне не разрешено комментировать, поэтому я обновляю здесь вместо этого.Отсутствующий параметр - это то, что я описал выше.Вы добавили ответ, в котором говорится, что вы просто удалили цикл FOR.Не похоже, что в то время вы понимали, почему его удаление имело значение.Именно поэтому я попытался объяснить, поскольку, в зависимости от ваших потребностей, цикл FOR может быть лучшим решением.
У меня это прекрасно работает.
create or replace procedure so_test_procedure as
CURSOR columnNames (inTableName IN VARCHAR2) IS
SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName;
BEGIN
OPEN columnNames('TEMP');
CLOSE columnNames;
END;
procedure so_test_procedure Compiled.
execute so_test_procedure();
anonymous block completed