ЗА тип IN на хранимых процедурах оракула - PullRequest
1 голос
/ 02 марта 2011

У меня есть тип с именем fatorial_type и таблица фаториалов, созданная из этого типа, при выполнении этого кода ниже я получил ошибку «PLS-00302: должен быть объявлен компонент« SET_NUM_FATORIAL », и да, эта процедура была объявлена.

SET serveroutput ON format wraped;
DECLARE
    fat fatorial_type;
BEGIN  
    FOR fat IN
        (SELECT value(f) FROM fatorial f)
    LOOP
        fat.SET_NUM_FATORIAL(5);
    END LOOP;
END;

Если я делаю

SELECT value(f) into fat FROM fatorial f

это работает, возможно, проблема связана с FOR IN, который не работает как в

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Существует несколько слегка отличающихся синтаксисов для циклического прохождения наборов результатов в PL / SQL.Они дают нам разные уровни контроля над выборкой.Самое простое решение - не объявлять переменную курсора и не разрешать Oracle решать проблемы.Но вам нужно наложить псевдоним возвращаемого значения в проекции.

Итак, вот простой тип с методом ...

create or replace type test_t as object
  ( n number
    , member procedure do_something(x number)
   );
/

create or replace type body test_t as 
  member procedure do_something (x number)
  is
  begin
    dbms_output.put_line(self.n + x);
  end;    
end;
/

Мы создаем таблицу для этого типа..

create table t23 of test_t
/

insert into t23 values (41)
/
insert into t23 values (68)
/
insert into t23 values (71)
/

Теперь поехали:

SQL>
SQL> set serveroutput on
SQL>
SQL> begin
  2      for r in ( select value(f) as whatever
  3                 from t23 f )
  4      loop
  5          r.whatever.do_something(1);
  6      end loop;
  7  end;
  8  /
42
69
72

PL/SQL procedure successfully completed.

SQL>
0 голосов
/ 02 марта 2011

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

попробуйте изменить переменную курсора на "r" НАЧАТЬ
Для г IN (ВЫБЕРИТЕ значение (f) ОТ Fatorial f) LOOP fat.SET_NUM_FATORIAL (5); / * что вы хотите сделать с выбранным вами значением? * / КОНЕЦ ЦИКЛА; END;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...