PLS-00306 ошибка при вызове курсора - PullRequest
0 голосов
/ 04 сентября 2008

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

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

Вещи сохранены в порядке. Вот и получается, что там, где я думал, что ошибка была, на самом деле это была не ошибка.

Ответы [ 3 ]

1 голос
/ 17 сентября 2008

Для выяснения причины проблемы. Как вы заявляете

OPEN columnNames ('TEMP');

работал, пока

FOR columnName IN columnNames LOOP

нет. Оператор FOR будет работать нормально, если в него будет включен такой параметр:

FOR columnName IN columnNames ('TEMP') LOOP

Вы не показываете код, в котором вы выбираете строки, поэтому я не могу указать вашу цель, но там, где я работаю, OPEN обычно используется для получения первой строки (в данном случае, имя первого столбца данной таблицы ) в то время как FOR используется для перебора всех возвращаемых строк.

@ Комментарий Роба. Я не могу комментировать, поэтому обновляю здесь. Отсутствующий параметр - это то, что я описал выше. Вы добавили ответ о том, что вы просто удалили цикл FOR. В то время это не выглядело так, как будто вы поняли, почему удаление имеет значение. Именно поэтому я попытался объяснить, поскольку, в зависимости от ваших потребностей, цикл FOR может быть лучшим решением.

0 голосов
/ 04 сентября 2008

@ Rob

Если вы вырезаете / вставляете код, который у меня есть, он работает?

Как / где вы вызываете свой код? это в триггере это?

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

0 голосов
/ 04 сентября 2008

У меня отлично работает.

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
...