Вопрос

Я думаю, что, возможно, я здесь чего-то не понимаю.Вот соответствующая часть триггера:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top