【问题标题】:how to pass table names and columns as arguments plsql如何将表名和列作为参数传递plsql
【发布时间】:2017-01-11 03:28:31
【问题描述】:

这是我关于堆栈溢出的第一篇文章,如果我的问题被问错了,请 lmk。

我正在尝试在 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:项目 'RESULT_SQL' 不是游标编译失败,第 40 行 (13:52:44) PL/SQL:语句被忽略

我查看了oracle docs 关于动态 plsql 和记录/游标的信息,并尝试了这些示例但无济于事。

有什么建议吗?谢谢。

编辑:修复小错误

【问题讨论】:

  • 错误对应的是哪一行?目前,我们看不到第 40 行。
  • 另外,尝试将EXECUTE 行更改为:EXECUTE IMMEDIATE '' || select_sql || ' into ' || result_sql; 并告诉我们会发生什么。
  • 仅使用@GurV 下面的答案我得到了另一个错误,并补充说我没有更多错误。 +1

标签: oracle stored-procedures plsql


【解决方案1】:

您需要一个 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;
/

【讨论】:

  • 解决了这个问题,现在可以在 sql 研讨会中编译,但是我现在在网页上的 APEX 中遇到编译错误,在@Mooz ORA-00933: SQL command not properly ended建议的新执行立即语句行处
  • 是的,我想通了,在更改了几件事后现在一切正常
猜你喜欢
  • 2015-02-19
  • 2017-07-22
  • 1970-01-01
  • 2017-05-20
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
相关资源
最近更新 更多