Return select 的值在 function/procedure 中
Return values of select in function/procedure
我有一个 SQL 句子,其中我减去两个表以搜索差异。由于我经常使用,我想创建一个函数或过程来制作这些并通过屏幕获得输出。有人可以向我解释制作这些的最佳方法是什么,你能给我举个例子吗?
如果您经常使用MINUS查询,那么最好创建一个视图 查询。要获取结果集,您只需要从视图中 select。
例如,
CREATE OR REPLACE VIEW my_view AS
SELECT column_list FROM table1
MINUS
SELECT column_list FROM table2
并获取结果,
SELECT * FROM my_view;
阅读文档以了解有关 CREATE VIEW
的更多详细信息
如果您使用的是 Oracle 11g 第 2 版,也许这就是您要找的:
create or replace procedure prnt_my_view(my_view in varchar2, separator in varchar2 default ',') is
type myrefcur is ref cursor;
type rowtext is table of varchar2(256);
rowdef varchar2(256);
rows_cv myrefcur;
text rowtext;
begin
select listagg(column_name,'||'''||separator||'''||') within group (order by column_id) into rowdef from user_tab_columns where lower(table_name) = lower(my_view);
open rows_cv for 'select '||rowdef||' from '||my_view;
fetch rows_cv bulk collect into text;
for i in text.first..text.last loop
dbms_output.put_line(text(i));
end loop;
close rows_cv;
exception when others then
dbms_output.put_line('something is wrong:'||sqlerrm);
end;
编辑:
如果您不能使用 listagg,请查看其他解决方案,例如:alternative to listagg in Oracle?
我有一个 SQL 句子,其中我减去两个表以搜索差异。由于我经常使用,我想创建一个函数或过程来制作这些并通过屏幕获得输出。有人可以向我解释制作这些的最佳方法是什么,你能给我举个例子吗?
如果您经常使用MINUS查询,那么最好创建一个视图 查询。要获取结果集,您只需要从视图中 select。
例如,
CREATE OR REPLACE VIEW my_view AS
SELECT column_list FROM table1
MINUS
SELECT column_list FROM table2
并获取结果,
SELECT * FROM my_view;
阅读文档以了解有关 CREATE VIEW
的更多详细信息如果您使用的是 Oracle 11g 第 2 版,也许这就是您要找的:
create or replace procedure prnt_my_view(my_view in varchar2, separator in varchar2 default ',') is
type myrefcur is ref cursor;
type rowtext is table of varchar2(256);
rowdef varchar2(256);
rows_cv myrefcur;
text rowtext;
begin
select listagg(column_name,'||'''||separator||'''||') within group (order by column_id) into rowdef from user_tab_columns where lower(table_name) = lower(my_view);
open rows_cv for 'select '||rowdef||' from '||my_view;
fetch rows_cv bulk collect into text;
for i in text.first..text.last loop
dbms_output.put_line(text(i));
end loop;
close rows_cv;
exception when others then
dbms_output.put_line('something is wrong:'||sqlerrm);
end;
编辑: 如果您不能使用 listagg,请查看其他解决方案,例如:alternative to listagg in Oracle?