Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL函数:从函数中提取多行_Oracle_Function_Plsql_Multiple Records - Fatal编程技术网

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

Oracle PL/SQL函数:从函数中提取多行,oracle,function,plsql,multiple-records,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 WH

我的数据库中有多个表。我得找出那些桌子的名字。所以 我编写了以下程序:

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
同时,我也对调用此函数时如何提取多行感到困惑。如何使用循环来处理这些结果


提前谢谢

您需要一个返回嵌套表的函数。在我的函数版本中,我使用了
dbms\u 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\u表,而不是从USER\u TAB\u COULMNS获得的多次点击

要使用此查询,只需像下面这样部署TABLE()函数:

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


显然,这是对SQL函数的一种简单使用,对于一个简单的SQL查询就足够了的场景来说,这完全超出了工程设计的范围。

什么是“不工作”呢?请始终提供准确的错误消息。为什么要将
计数(*)
放入VARCHAR2?这是一个数字,所以使用1!我也不明白你说“我弄糊涂了,怎么能在调用这个函数时提取多行”是什么意思。您到底想要实现什么?您不会从该查询中获得多行——它只返回count(表名称),因此您将获得一行非空整数大于或等于零的数据。