select object_name,object_type from dba_objects
where object_name like '%xxx%';要实现传入xxx作为参数,编写一函数实现select同样功能并返回结果集
可用select * from yyy(xxx);-----查询结果,这里xxx是参数,yyy是函数名
where object_name like '%xxx%';要实现传入xxx作为参数,编写一函数实现select同样功能并返回结果集
可用select * from yyy(xxx);-----查询结果,这里xxx是参数,yyy是函数名
where object_name like '%xxx%'; 这两个一样的...这样的函数有何用?
1、如果外部程序来使用,没有必要写一个存储过程或者函数来返回一个结果集,外部程序直接写一个函数利用游标把符合要求的数据检索回来就行了;
2、如果是存储过程中使用这个结果集,那么在存储过程中直接写select语句可以啊,也或者,写一个函数,每次返回一个结果,而不是结果集,更为实用。CREATE OR REPLACE FUNCTION get_type(p_name dba_objects.object_name%TYPE) RETURN dba_objects.object_name%type AS
v_type dba_objects.object_type%TYPE;
BEGIN
select dba_objects.object_type into v_type
from dba_objects
where dba_objects.object_name=p_name;
return v_type;
EXCEPTION
WHEN OTHERS THEN
return NULL;
END get_type;
为什么一定要这么调 ,你想让函数返回什么
在sqlplus中用
我试试
至于调用的语句则要稍微修改一下。
select * from table(yyy(xxx));
create or replace package PKG_PIPE_TEST is TYPE T_REC IS RECORD(
TNAME VARCHAR2(30),
TABTYPE VARCHAR2(10)
);
TYPE T_REC_ARR IS TABLE OF T_REC;
FUNCTION F_TEST_PIPE(PNAME IN VARCHAR2) RETURN T_REC_ARR PIPELINED;end PKG_PIPE_TEST;
create or replace package body PKG_PIPE_TEST isFUNCTION F_TEST_PIPE(PNAME IN VARCHAR2) RETURN T_REC_ARR PIPELINED
IS
VREC T_REC;
R SYS_REFCURSOR;
BEGIN
open r for select tab.tname,tab.tabtype from tab where tname like '%'||upper(Pname)||'%';
fetch r into VREC;
while r%found loop
pipe row (VREC);
fetch r into VREC;
end loop;
close r;
return;
END;end PKG_PIPE_TEST;
select * from table(pkg_pipe_test.F_TEST_PIPE('DeadOrLive'));需要注意的是,这种函数不应该使用在具有大量返回结果的查询,否则oracle内存压力大。
不是生产库用,自己收集的小库用
你的代码,我试试