从表函数返回N列

时间:2013-11-29 08:49:05

标签: oracle plsql

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

SELECT * from TABLE (function())

其中function,例如'SELECT x, y FROM z。我不知道这是怎么做的,所以我想听一些解决方法,就像一个想法一样。

2 个答案:

答案 0 :(得分:0)

我认为你要问的是当你使用

时你在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;

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

答案 1 :(得分:0)

以下是完全动态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;