PL/SQL 函数:从函数中提取多行

Posted

技术标签:

【中文标题】PL/SQL 函数:从函数中提取多行【英文标题】:PL/SQL function: Extract multiple rows from function 【发布时间】:2012-12-26 17:00:34 【问题描述】:

我的数据库中有多个表。我必须找出这些表的名称。所以 我编写了以下程序:

CREATE OR REPLACE FUNCTION fun_tablefinder( keyword VARCHAR2 )
RETURN NUMBER
IS
 v_query VARCHAR2(200);tablename VARCHAR2(20);
 tablename NUMBER;

 BEGIN

v_query:='SELECT count(TABLE_NAME) FROM USER_TAB_COLUMNS WHERE TABLE_NAME LIKE ''%'||upper(keyword)||'%''';
EXECUTE IMMEDIATE v_query INTO tablename;
RETURN tablename;
END;

但是我的查询中有错误,我无法修复:

tablename:= fun_tablefinder('ubl'); is not working

而且我对如何在调用此函数时提取多行感到困惑。如何使用循环来处理这些结果?

提前致谢。

【问题讨论】:

“不工作”是什么意思?请始终提供准确的错误消息。为什么要将 count(*) 放入 VARCHAR2 中?这是一个数字,所以使用一个!当您说“我很困惑如何在调用此函数时提取多行”时,我也不明白您的意思。 究竟你想达到什么目的? 你不会从那个查询中得到多行——它只是返回 count(table_name),所以你会得到一个非空整数大于或等于零的行。 【参考方案1】:

您需要一个返回嵌套表的函数。在我的函数版本中,我使用 dbms_debug.vc2coll 数据类型,这是 Oracle 内置的集合类型。

注意使用 BULK COLLECT 来填充具有多行的集合。

create or replace function     fun_tablefinder( keyword VARCHAR2 )
    RETURN dbms_debug.vc2coll
IS
   tablenames dbms_debug.vc2coll;

BEGIN

    SELECT TABLE_NAME
    bulk collect into tablenames
    FROM USER_TABLES 
    WHERE TABLE_NAME LIKE upper(keyword)||'%';
    RETURN tablenames;
END;

不确定为什么要使用动态 SQL,这完全没有必要。此外,您可能希望查询 USER_TABLES,它返回每个表一行,而不是从 USER_TAB_COULMNS 获得的多个命中。

要使用这个查询,只需像这样部署 TABLE() 函数即可:

select * 
from table ( fun_tablefinder('UBL') );

显然,这是对 SQL 函数的微不足道的使用,对于直接 SQL 查询就足够的场景来说,这完全是过度设计。

【讨论】:

以上是关于PL/SQL 函数:从函数中提取多行的主要内容,如果未能解决你的问题,请参考以下文章

PL/sql 函数返回多行错误

用于遍历多行的 Oracle PL/SQL 函数

PL/SQL自定义函数

PL/SQL - 精确提取返回超过请求的行数

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

PL/SQL 编程游标存储过程函数