powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g)
3 сообщений из 3, страница 1 из 1
Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g)
    #40008201
romkaromkka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте господа инженеры.
Подскажите пожалуйста как реализовать следующее через 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
Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g)
    #40008237
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g)
    #40008276
romkaromkka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, Благодарю вас!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка данных с использованием DBMS_SQL и Анонимного блока (Oracle 11g)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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