在 PL/SQL Oracle 中需要此 T-Sql 函数的等效函数。如果有其他解决方案,那么流水线

Posted

技术标签:

【中文标题】在 PL/SQL Oracle 中需要此 T-Sql 函数的等效函数。如果有其他解决方案,那么流水线【英文标题】:Need an equivalent function for this T-Sql function in PL/SQL Oracle. If there is other solution then Pipelining 【发布时间】:2013-12-15 17:39:53 【问题描述】:
 ALTER  FUNCTION [dbo].[MyFun]()
 RETURNS  TABLE 
 AS
 RETURN 
 (
 WITH addd(CITY_NAME,CITY_ID)
 AS
 (
    select CITY_NAME,CITY_ID from city
 )
  select * from addd
 )

不需要流水线,因为我想直接调用它,例如在 T-SQL 中调用的那样

Select * from myfun();

【问题讨论】:

你是问如何让函数返回Oracle中的表? 是的,它应该通过直接调用函数返回一个表,而不是像***.com/questions/2829880/… 看“表”函数 如果您的方法是选择一次并多次访问结果,那么我建议插入到全局临时表中。为什么不更具体地解释一下为什么要避免使用流水线函数? 为什么不创建视图?从函数中检索记录比从视图中慢得多。 【参考方案1】:

您可以使用 Oracle 流水线函数功能:

第1步:创建一个代表一行结果的对象:

CREATE OR REPLACE TYPE city_type 
AS OBJECT
(
    city_id VARCHAR(6),
    city_name VARCHAR(60)    
);

第2步:创建第1步中创建的对象类型的集合(表类型)

CREATE OR REPLACE TYPE city_table_type 

AS TABLE OF city_type;

第 3 步:创建一个返回第 3 步中的表类型的函数

CREATE OR REPLACE FUNCTION fnc_Get_Cities_Pipelined
  RETURN city_table_type
  PIPELINED
AS
BEGIN

    FOR v_Rec IN (SELECT * FROM city) LOOP

        PIPE ROW (city_type(v_Rec.City_Id, v_Rec.City_Name));

    END LOOP;

    RETURN;
END;

第 4 步:像使用“表”或“视图”一样使用函数

SELECT city_id, city_name
FROM TABLE(fnc_Get_Cities_Pipelined());

【讨论】:

以上是关于在 PL/SQL Oracle 中需要此 T-Sql 函数的等效函数。如果有其他解决方案,那么流水线的主要内容,如果未能解决你的问题,请参考以下文章

过程中的 Pl/Sql Oracle 函数

如何在 Oracle PL/SQL 中编写此数据库比较?

Oracle:使用 SQL 或 PL/SQL 提取文件扩展名的最快方法

关于 Oracle PL SQL 循环

如何在 oracle pl/sql 语句中声明查询?

Oracle CREATE TYPE 和 PL/SQL