如何将表名和列作为参数plsql传递

时间:2017-01-11 03:28:31

标签: oracle stored-procedures plsql

这是我关于堆栈溢出的第一篇文章,所以如果我的问题被错误地询问,请说明。

我正在尝试在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和记录/游标的内容,并尝试了这些示例无效。

有关该怎么做的任何建议?感谢。

编辑:修正了小错误

1 个答案:

答案 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;
/