Как установить имя поля курсора от другого курсора?оракул - PullRequest
1 голос
/ 21 июля 2011

Мне нужно взять имена полей курсора от другого курсора, как это:

FOR rec1 IN (SELECT * FROM table1) LOOP  
   FOR rec2 IN (SELECT * FROM table2) LOOP  
       IF rec1.[rec2.field_name] <> '*' THEN 
         ...                                          
       END IF;
   END LOOP;
END LOOP;

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Oracle действительно не предназначен для такого поведения. Единственный способ добиться этого - использовать динамический PL / SQL для получения требуемой функциональности:

declare
  v_field_value varchar2(2000);
begin
  FOR rec1 IN (SELECT * FROM table1) LOOP  
     FOR rec2 IN (SELECT * FROM table2) LOOP  
         EXECUTE IMMEDIATE 'begin :value := :rec1.' 
                           || :rec2.field_name || '; end;' 
            USING OUT v_field_value, IN rec1;
         IF v_field_value  <> '*' THEN 
           ...                                          
         END IF;
     END LOOP;
  END LOOP;
end;

Однако, если этот подход может работать, это не значит, что вы должны его использовать. Например, если ваше поле не является строкой, Oracle неявно преобразует значение, что может привести к значению, отличному от ожидаемого. Если бы это был мой код, я бы использовал его только в качестве крайней меры, после рассмотрения возможности реализации той же функциональности вне базы данных и изменения структуры базы данных, чтобы избежать необходимости в коде такого типа.


Исходя из комментария об ошибке, упомянутой в комментарии, я изменил код, чтобы передавать записи с использованием переменных связывания.

0 голосов
/ 21 июля 2011

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

for rec1 in (SELECT * FROM table1) loop
   for rec2 in (SELECT * FROM table2) loop
       if rec1.field = 1 and rec2.field_name <> '*' then
         ...                                          
       end if;
   end loop;
end loop;

вроде как

declare
  i Integer;
begin
  declare 
     x Integer;
  begin
     i := x;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...