2015-04-07 3 views
0

У меня есть предложение SQL, в котором я делаю минус двух таблиц для поиска различий. Поскольку я часто использую, я хотел бы создать функцию или процедуру, чтобы сделать их и получить выход по экрану. Кто-то может объяснить мне, как это лучший способ сделать это, не могли бы вы привести мне пример?Возвращаемые значения выбора в функции/процедуре

+0

Есть ли причина не ставя этот вопрос в [зрения] (http://docs.oracle.com/ кд/B28359_01/server.111/b28286/statements_8004.htm # SQLRF01504)? –

ответ

0

Может быть, это то, что вы ищете, если вы используете 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?

1

Если вы часто использовать МИНУС запрос, то лучше создать вид на запросе. Чтобы получить набор результатов, вам просто нужно выбрать из представления.

Например,

CREATE OR REPLACE VIEW my_view AS 
    SELECT column_list FROM table1 
    MINUS 
    SELECT column_list FROM table2 

И получить результат,

SELECT * FROM my_view; 

Прочитайте документацию для получения более подробной информации о CREATE VIEW

+0

Спасибо. Я собираюсь использовать представления для вывода минус sql. Но я хотел бы создать функцию или процедуру, чтобы видеть эти выходы с помощью dbms_output. Холодный ты предлагаешь мне, как я могу это сделать? Спасибо – user650034

+0

@ user104906 Если вы действительно хотите это сделать в PL/SQL, просто используйте 'OPEN CURSOR FOR your_query' и верните курсор. Например, см. Этот http://stackoverflow.com/a/27812983/3989608 –