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(表名称),因此您将获得一行非空整数大于或等于零的数据。