这是我关于堆栈溢出的第一篇文章,所以如果我的问题被错误地询问,请说明。
我正在尝试在plsql(我过去几周只使用它)中创建一个过程,该过程传递两个参数:列名及其关联表。然后在Oracle APEX中调用此过程,该过程依次创建DataTable,其列名称为具有填充行的表的标题。
我已经让这个过程静态地使用列名和表名的预定义值,但是我希望它是动态的,因为这个过程将在其他地方使用。这是我目前的尝试:
procedure dataTable(column_name VARCHAR2, table_name VARCHAR2) as
select_sql varchar2(1024);
--this should be a record or cursor i think, but I'm not sure how to do either
result_sql varchar2(1024);
begin
htp.p('<table width="100%" class="table table-striped table-bordered" id="some_id"String cellspacing="0"String><thead><tr>');
htp.p('<th>'||column_name||'</th>');
htp.p('</tr></thead><tbody>');
select_sql := 'SELECT ' ||column_name||' FROM '||table_name;
--error occurs on line below
EXECUTE IMMEDIATE select_sql into result_sql;
for i in result_sql LOOP
htp.p('<tr><td>'||i.(something here to access row data)||'</td></tr>');
end loop;
end;
这给出了错误:
编译失败,第40行(13:52:44) PLS-00456:item&#39; RESULT_SQL&#39;不是游标编译失败,第40行(13:52:44) PL / SQL:忽略语句
我查看了oracle docs关于动态plsql和记录/游标的内容,并尝试了这些示例无效。
有关该怎么做的任何建议?感谢。
编辑:修正了小错误
答案 0 :(得分:0)
您需要一个PLSQL表来使用 EXECUTE IMMEDIATE
BULK COLLECT
结果的值
procedure dataTable(column_name VARCHAR2, table_name VARCHAR2) as
select_sql varchar2(1024);
type sometype IS TABLE OF VARCHAR(1024) index by PLS_INTEGER;
result sometype;
begin
htp.p('<table width="100%" class="table table-striped table-bordered" id="some_id"String cellspacing="0"String><thead><tr>');
htp.p('<th>'||column_name||'</th>');
htp.p('</tr></thead><tbody>');
select_sql := 'SELECT ' ||column_name||' FROM '||table_name;
EXECUTE IMMEDIATE select_sql into result;
IF result.count > 0 THEN
FOR i IN result.first .. result.last LOOP
htp.p('<tr><td>'||result(i)||'</td></tr>');
END LOOP;
END IF;
END;
/