Oracle 从表函数返回N列

Oracle 从表函数返回N列,oracle,plsql,Oracle,Plsql,我需要实现一个表函数,我将提交一个列数未知的请求。它看起来像: SELECT * from TABLE (function()) 其中函数,例如'从z选择x,y。我不知道如何解决这个问题,所以我想听听一些解决方法,作为一个想法。我想你要问的是,当你使用 select语句中的函数 如果我创建一个函数,如下所示: create or replace function get1job (id in varchar2) return varchar2 is tittle jobs.JOB_TIT

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

SELECT * from TABLE (function())

其中函数,例如
'从z选择x,y
。我不知道如何解决这个问题,所以我想听听一些解决方法,作为一个想法。

我想你要问的是,当你使用

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;

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

这是一个完全动态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;

函数必须返回静态数据类型,即函数返回的数据类型不能更改,这意味着这非常困难。听起来好像你是在告诉我们你对一个问题提出的解决方案,然后在这个问题上寻求帮助,而不是在实际问题上寻求帮助,因为可能有一个简单的解决方案。你的实际问题是什么?看看包装。请描述您的实际问题,在您的情况下,使用DBSM_SQL可能会有点过头。实际问题是表函数可能是任意的,我们不知道从中选择了多少列。我没有更具体的例子。我想要一个一般问题的近似解。好的。实际问题是如何将未知(类型和列数)行从表函数返回到外部select的解决方案。是否要返回表的列名或列值?我需要表函数。它不返回数据,而是打印数据。您应该能够将打印输出转换为return子句。除非我们不知道返回值的数据类型,否则我们无法提供任何示例,您可以多次打印。。。你只能回来一次。如果你不能提供一个例子来回答这个问题,那么为什么这是对这个问题的回答呢?我写了“使用它作为你的应用程序的基础”。如果没有一个确切的问题,我们无法很好地回答,但我假设这个例子足以解决这个问题,除非我们知道更多细节。
BEGIN
    HtmlTable('SELECT x, y FROM z');
END;