У меня есть предложение SQL, в котором я делаю минус двух таблиц для поиска различий. Поскольку я часто использую, я хотел бы создать функцию или процедуру, чтобы сделать их и получить выход по экрану. Кто-то может объяснить мне, как это лучший способ сделать это, не могли бы вы привести мне пример?Возвращаемые значения выбора в функции/процедуре
ответ
Может быть, это то, что вы ищете, если вы используете Oracle 11g Release 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?
Если вы часто использовать МИНУС запрос, то лучше создать вид на запросе. Чтобы получить набор результатов, вам просто нужно выбрать из представления.
Например,
CREATE OR REPLACE VIEW my_view AS
SELECT column_list FROM table1
MINUS
SELECT column_list FROM table2
И получить результат,
SELECT * FROM my_view;
Прочитайте документацию для получения более подробной информации о CREATE VIEW
Спасибо. Я собираюсь использовать представления для вывода минус sql. Но я хотел бы создать функцию или процедуру, чтобы видеть эти выходы с помощью dbms_output. Холодный ты предлагаешь мне, как я могу это сделать? Спасибо – user650034
@ user104906 Если вы действительно хотите это сделать в PL/SQL, просто используйте 'OPEN CURSOR FOR your_query' и верните курсор. Например, см. Этот http://stackoverflow.com/a/27812983/3989608 –
Есть ли причина не ставя этот вопрос в [зрения] (http://docs.oracle.com/ кд/B28359_01/server.111/b28286/statements_8004.htm # SQLRF01504)? –