【问题标题】:Return N columns from a table function从表函数返回 N 列
【发布时间】:2013-11-29 08:49:05
【问题描述】:

我需要实现一个表函数,我将提交一个列数未知的请求。它看起来像:

SELECT * from TABLE (function())

where函数,例如'SELECT x, y FROM z。我不知道该怎么做,所以我想听听某种解决方法,只是作为一个想法。

【问题讨论】:

  • 函数必须返回静态数据类型,即函数返回的数据类型不能改变,这意味着这很困难。听起来好像您是在告诉我们您针对问题提出的解决方案,然后寻求帮助,而不是针对您的实际问题寻求帮助,这可能有一个简单的解决方案。你的实际问题是什么?
  • 看看DBMS_SQL 包。请描述您的实际问题,在您的情况下使用 DBSM_SQL 可能是矫枉过正。
  • 实际问题只是表函数可能是any,我们不知道从中选择了多少列。我没有更具体的例子。我想要一个笼统的问题的近似解决方案。
  • 好吧。实际问题是解决如何将未知(类型和数字列)行从表函数返回到外部选择。
  • 是否要返回表的列名或列值?

标签: oracle plsql


【解决方案1】:

我想你要问的是你在使用时在 o/p 中获得了多行

select 语句中的函数。

如果我创建一个函数如下:

create or replace function get1job

(id in varchar2)

return varchar2 is

tittle jobs.JOB_TITLE%type;

begin

select job_title  into tittle from jobs where job_id=id;

return tittle;

end get1job;

并在 select 语句中使用它。

我会写:

select get_job('AD_PRES') from dual;

我只会得到一行

如果我写:

select get_job('AD_PRES') from jobs;

显示的行数将等于表作业中的行数。

【讨论】:

  • 我需要表格功能。
【解决方案2】:

这是一个完全动态的 SQL 示例,您可以插入任何 SELECT 语句并打印出相应的 HTML:

CREATE OR REPLACE PROCEDURE HtmlTable(sqlStr IN VARCHAR2) IS

    cur INTEGER := DBMS_SQL.OPEN_CURSOR;
    columnCount INTEGER;
    describeColumns DBMS_SQL.DESC_TAB;
    res INTEGER;
    c INTEGER;
    aCell  VARCHAR2(4000);

BEGIN

    DBMS_OUTPUT.PUT_LINE('<table>');

    DBMS_SQL.PARSE(cur, sqlStr, DBMS_SQL.NATIVE);
    DBMS_SQL.DESCRIBE_COLUMNS(cur, columnCount, describeColumns);

    DBMS_OUTPUT.PUT_LINE('<thead><tr>');
    FOR i IN 1..columnCount LOOP
        DBMS_OUTPUT.PUT_LINE('  <td>'||describeColumns(i).COL_NAME||'</td>');
        DBMS_SQL.DEFINE_COLUMN(cur, i, aCell, 4000);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('</tr></thead>');

    res := DBMS_SQL.EXECUTE(cur);

    DBMS_OUTPUT.PUT_LINE('<tbody>');
    WHILE (DBMS_SQL.FETCH_ROWS(cur) > 0) LOOP
        DBMS_OUTPUT.PUT_LINE('<tr>');
        c := 1;
        WHILE (c <= columnCount) LOOP
            DBMS_SQL.COLUMN_VALUE(cur, c, aCell);
            DBMS_OUTPUT.PUT_LINE('  <td>'||aCell||'</td>');
            c := c + 1;
        END LOOP;       
        DBMS_OUTPUT.PUT_LINE('</tr>');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('</tbody>');
    DBMS_OUTPUT.PUT_LINE('</table>');
    DBMS_SQL.CLOSE_CURSOR(cur);

END HtmlTable;

将此用作您的应用程序的基础。然后你可以像这样执行它:

BEGIN
    HtmlTable('SELECT x, y FROM z');
END;

【讨论】:

  • 这不会返回数据,而是打印它。
  • 您应该能够将打印输出转换为 RETURN 子句。除非我们不知道返回值的数据类型,否则我们无法提供任何示例
  • 您打印多次...您只能返回一次。如果您无法提供回答问题的示例,那么为什么这是对问题的回答?
  • 我写了“使用它作为你的应用程序的基础”。如果没有确切的问题,我们无法准确回答,但我认为这个例子足以解决问题,除非我们知道更多细节。
猜你喜欢
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多