Как установить переменную для l oop с oracle pl / sql - PullRequest
0 голосов
/ 25 марта 2020

У меня есть переменная v_table, содержащая значение dynamici c, и я хочу установить значение v_table в l oop:

declare 
   v_table varchar(2000);
begin
   v_table := 'select ven.name from vendors ven ';
   htp.p('<select class="selectlist apex-item-select"  id="fname" name="fname">');
   for i in  v_table
   loop
      htp.p('<option value="'||i.name||'">'||i.name||'</option>');
   end loop;
end;

Я не знаю много об этом. Пожалуйста, помогите мне решить мою проблему.

1 Ответ

1 голос
/ 25 марта 2020

Конструкция for i in ... ожидает курсор, а не строку. Вы можете использовать строковую переменную для курсора, но только с синтаксисом open ... for, что немного сложнее.

Хотя это не обязательно должно быть динамически c, и не нуждается в строке v_table; Вы можете просто сделать:

begin
   htp.p('<select class="selectlist apex-item-select"  id="fname" name="fname">');
   for i in (select ven.name from vendors ven)
   loop
      htp.p('<option value="'||i.name||'">'||i.name||'</option>');
   end loop;
end;

Подробнее о курсор for ... loop операторы в документации.


значение переменной v_table unstable, это могут быть разные операторы

Затем вам нужно явно открыть курсор из оператора и извлечь из l oop:

declare 
   v_table varchar(2000);
   v_cursor sys_refcursor;
   v_name varchar2(30);
begin
   v_table := 'select ven.name from vendors ven ';
   htp.p('<select class="selectlist apex-item-select"  id="fname" name="fname">');

   open v_cursor for v_table;
   loop
      fetch v_cursor into v_name;
      exit when v_cursor%notfound;
      htp.p('<option value="'||v_name||'">'||v_name||'</option>');
   end loop;
   close v_cursor;
end;

См. первую документацию I ссылка на выше, включая примеры.

Это все еще предполагает, что инструкция dynamici c всегда будет генерировать одно значение, которое вы будете использовать для значения параметра и метки. Чуть в общем случае они могут отличаться, и в этом случае ваш динамический запрос c может (всегда) получить оба и извлечь из двух локальных переменных - v_value и v_label, возможно - и затем использовать обе эти переменные в htp.p звонок. В любом случае динамический запрос c всегда должен получать одинаковое количество выражений в своем списке выбора, поэтому он выбирает одинаковое количество переменных. Это кажется разумным здесь. (Иногда это не так, и тогда вы смотрите на dbms_sql, но это слишком для этой ситуации.)

Предположительно, вам нужно завершить выбор после l oop тоже:

...
   end loop;
   close v_cursor;

   htp.p('</select>');
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...