Конструкция 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;