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

时间:2012-12-26 17:00:34

标签: oracle function plsql multiple-records

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

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

我也很困惑,在调用此函数时如何提取多行。如何使用循环来处理这些结果?

先谢谢了。

1 个答案:

答案 0 :(得分:3)

您需要一个返回嵌套表的函数。在我的函数版本中,我使用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查询就足够了的场景,它是完全过度设计的。