Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g) / 3 сообщений из 3, страница 1 из 1
13.10.2020, 20:13
    #40008201
romkaromkka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g)
Здравствуйте господа инженеры.
Подскажите пожалуйста как реализовать следующее через dbms_SQL
В существующем проекте используются разные процедуры которые возвращаю REF_CURSOR
с разными количествами полей, но у всех этих процедур есть несколько полей с общим названием:
к примеру ID, Price, Quantity.

Вопрос: Как мне получить значения необходимых полей, провести с ними какие либо действия и вывести результат в виде числа используя
в качестве запроса вызов другой процедуры и курсор который она возвращает используя АНОНИМНЫЙ БЛОК

begin
get_production(sysdate, cur);
end;


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
     type r_cur is ref cursor;
     curOut r_cur;
     tab DBMS_SQL.desc_tab;
   cur INTEGER;
   rows_processed INTEGER;

BEGIN
   cur := dbms_sql.open_cursor;
   DBMS_SQL.PARSE(cur, 'declare type r_cur is ref cursor; cur r_cur; begin get_product(sysdate, cur); end;',DBMS_SQL.NATIVE);
   rows_processed := DBMS_SQL.EXECUTE(cur);
   DBMS_SQL.CLOSE_CURSOR(cur);
END;
...
Рейтинг: 0 / 0
13.10.2020, 21:26
    #40008237
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g)
romkaromkka,

Если производительность не принципиальна:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
declare
     v_refcur sys_refcursor;
     cursor v_cur
       is
         select  id,
                 price,
                 quantity
           from  xmltable(
                          '/ROWSET/ROW'
                          passing xmltype(v_refcur)
                          columns
                            id number path 'ID',
                            price number path 'PRICE',
                            quantity number path 'QUANTITY'
                         );
begin
    get_product(sysdate,v_refcur);
    for v_rec in v_cur loop
      dbms_output.put_line('id = ' || v_rec.id);
      dbms_output.put_line('price = ' || v_rec.price);
      dbms_output.put_line('quantity = ' || v_rec.quantity);
    end loop;
end;
/



А так через dbms_sql.to_cursor_number если знаешь позиции полей ID, PRICE, QUANTITY или в SELECTe есть (явные/неявные) алиасы ID, PRICE, QUANTITY:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
declare
     v_refcur sys_refcursor;
     v_dbms_sql_cur number;
     v_column_count number;
     l_column_tbl   dbms_sql.desc_tab;
     v_id           number;
     v_price        number;
     v_quantity     number;
     v_id_pos       number;
     v_price_pos    number;
     v_quantity_pos number;
begin
    get_product(sysdate,v_refcur);
    v_dbms_sql_cur := dbms_sql.to_cursor_number(v_refcur);
    dbms_sql.describe_columns(v_dbms_sql_cur,v_column_count,l_column_tbl);
    for v_i in 1..v_column_count loop  
      if l_column_tbl(v_i).col_name = 'ID'
        then
          v_id_pos := v_i;
          dbms_sql.define_column(v_dbms_sql_cur,v_i,v_id);
      elsif l_column_tbl(v_i).col_name = 'PRICE'
        then
          v_price_pos := v_i;
          dbms_sql.define_column(v_dbms_sql_cur,v_i,v_price);
      elsif l_column_tbl(v_i).col_name = 'QUANTITY'
        then
          v_quantity_pos := v_i;
          dbms_sql.define_column(v_dbms_sql_cur,v_i,v_quantity);
      end if;
    end loop;
    while dbms_sql.fetch_rows(v_dbms_sql_cur) > 0 loop
      dbms_sql.column_value(v_dbms_sql_cur,v_id_pos,v_id);
      dbms_sql.column_value(v_dbms_sql_cur,v_price_pos,v_price);
      dbms_sql.column_value(v_dbms_sql_cur,v_quantity_pos,v_quantity);
      dbms_output.put_line('id = ' || v_id);
      dbms_output.put_line('price = ' || v_price);
      dbms_output.put_line('quantity = ' || v_quantity);
    end loop;
end;
/



А если просто вывести на экран (зависит от tool - не все хавают):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
declare
     v_refcur sys_refcursor;
begin
    get_product(sysdate,v_refcur);
    dbms_sql.return_result(v_refcur);
end;
/



SY.
...
Рейтинг: 0 / 0
13.10.2020, 22:35
    #40008276
romkaromkka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g)
SY, Благодарю вас!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g) / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]