【问题标题】:Call function from sql clause: returning a variable number of columns从 sql 子句调用函数:返回可变数量的列
【发布时间】:2012-10-16 22:50:18
【问题描述】:

是否可以调用从 SELECT 语句返回 REF 游标的游标?

编辑 我需要可变数量的返回字段,因此流水线表对我的目的没有用处。

IE。

SELECT GetFields('field1, field2', flh_tout_name)
     FROM ENI_FLUSSI_HUB c
    WHERE flh_id_messaggio = '1'

FUNCTION GetFields(fields, vFlhToutName); 查询:= '选择' ||字段 || ' 从 ' || vFlhToutName;

  return EXECUTE IMMEDIATE (vQuery);

结束

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我不这么认为。您可以创建一个可以从选择中调用的流水线表函数。在这里查看我的答案Looping on values, creating dynamic query and adding to result set

    另见http://psoug.org/reference/pipelined.html

    基本上,您需要创建一个类型来表示结果的每一行。然后你创建一个表类型,它是你的行类型的表。

    CREATE TYPE MyRowType AS OBJECT(ID NUMBER, VALUE VARCHAR2(10));
    
    CREATE TYPE MyTableType AS TABLE OF MyRowType;
    

    那么你的函数应该返回 MyTableType:

    CREATE FUNCTION TestTableFunctions (lookup_Value VARCHAR2) 
    RETURNS MytableType
    AS
        TYPE r_cursor IS REF CURSOR;
        query_results r_cursor;
        results_out MyRowType := MyRowType(NULL, NULL);
    BEGIN
    
    OPEN query_results FOR
    SELECT
        ID,
        Value
    FROM
        MyTable
    WHERE
        LookupValue = Lookup_Value;
    
    LOOP
        FETCH query_results INTO 
            results_out.ID,
            results_out.Value;
        EXIT WHEN query_results%NOTFOUND;
    
        PIPE ROW(results_out);
    END LOOP;
    
    CLOSE query_results;
    END TestTableFunctions;
    

    然后你可以调用:

    SELECT * FROM TABLE(TestTableFunctions('abcd'))
    

    【讨论】:

    • 我需要可变数量的返回字段。
    • @Gik25 - 变量号还是动态列表?如在开发过程中您会知道所有可能的列还是可以添加其他列?另外,您使用什么类型的客户端来检索和处理结果?
    • 我使用 Toad 作为客户端。我想从“表”中选择字段 1、字段 2。但是列的名称从一种发展到另一种发展。我可以通过多种方式解析动态查询并在 SELECT 子句中使用它。但我必须知道返回类型?我不能让一个函数返回可变数量的列并在 SELECT 语句中使用它?
    • 您能否编辑您的问题以包含两个示例表和一些关于函数应该做什么以及如何调用它的伪代码。另外,当我说客户端时,我的意思是调用此函数的应用程序是什么?是.net还是什么平台?
    • 是的,当然。我会在几秒钟内完成。任何应用程序都不会使用该查询。我将从蟾蜍中使用它。
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2016-10-02
    • 2021-09-18
    • 2020-12-01
    • 2018-02-03
    • 2015-08-16
    相关资源
    最近更新 更多