Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамическая обработка записей курсора / 15 сообщений из 15, страница 1 из 1
28.11.2017, 15:01
    #39560601
DINSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
Добрый день! Не могу разобраться с динамической обработкой записей курсора. Задача довольно простая для профи - вывести в цикле значения полей записи динамического курсора, но я что-то не пойму как именно. Помогите, пожалуйста.

Код: 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.
create or replace package rcur as
    -- type tcur sys_refcursor;
    
    function rcur(p_sql varchar2) return sys_refcursor;
    procedure call_me;
    procedure catch_me(scur in sys_refcursor);    
end;
/
create or replace package body rcur as

        function rcur(p_sql varchar2) return sys_refcursor is
            v_ref_cur sys_refcursor;
        begin
            open v_ref_cur for p_sql;
            return v_ref_cur;
        end;
        
         -- Формирует выборку через rcur
        procedure call_me is
        begin
            catch_me(rcur('SELECT 1 v1, 2 v2, 3 v3 FROM dual union all SELECT 1 v1, 2 v2, 3 v3 FROM dual union all SELECT 1 v1, 2 v2, 3 v3 FROM dual'));
        end;
        
        -- Принимает и выводит в цикле
        procedure catch_me(scur in sys_refcursor) is 
            v_string_tx scur%rowtype; -- НУЖНО КАК-ТО ПРИРАВНЯТЬ К ПОЛЯМ КУОСОРА
       begin
           LOOP
              FETCH scur INTO v_string_tx;
              EXIT WHEN scur%NOTFOUND;
              dbms_output.put_line(v_string_tx.v2); -- И ВЫВОДИТЬ ЗДЕСЬ (Названия полей, некоторых, известны, их и надо вывести)
           END LOOP;
        end;

end;        
------------------------------
set serveroutput on size unlimited;
begin
    rcur.call_me;
end;



Буду крайне благодарен за помощь...
...
Рейтинг: 0 / 0
28.11.2017, 15:04
    #39560603
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
Динамическое и извлекать ну;но динамически. RTFM DBM_SQL
...
Рейтинг: 0 / 0
28.11.2017, 15:05
    #39560604
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
ElicDBM_SQLDBMS_SQL
...
Рейтинг: 0 / 0
28.11.2017, 15:10
    #39560609
DINSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
ElicElicDBM_SQLDBMS_SQL

Не могли бы вы на приведенном коде показать как?
...
Рейтинг: 0 / 0
28.11.2017, 15:11
    #39560612
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
DINSQL
Код: plsql
1.
            dbms_output.put_line(v_string_tx.v2); -- И ВЫВОДИТЬ ЗДЕСЬ (Названия полей, некоторых, известны, их и надо вывести)



Для зачем их присваивать записи и выводить в dbms_output?
Есть мнение, что либо задачу следует переформулировать, либо одно из двух.
...
Рейтинг: 0 / 0
28.11.2017, 15:25
    #39560630
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
DINSQLНе могли бы вы на приведенном коде показать как?А ключ от квартиры?
STFF
...
Рейтинг: 0 / 0
28.11.2017, 15:39
    #39560643
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
DINSQLElicпропущено...
DBMS_SQL

Не могли бы вы на приведенном коде показать как?

DBMS_SQL.TO_CURSOR_NUMBER + Кайт стр 1231
авторТеперь мы готовы рассмотреть всю подпрограмму, которая может принять практи-
чески любой запрос и сбросить результаты его выполнения в файл операционной сис-
темы (предполагается, что пакет UTL_FILE настроен; эта настройка подробно описана
в приложении А):
....


.....
stax
...
Рейтинг: 0 / 0
28.11.2017, 15:52
    #39560657
DINSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
andrey_anonymousDINSQL
Код: plsql
1.
            dbms_output.put_line(v_string_tx.v2); -- И ВЫВОДИТЬ ЗДЕСЬ (Названия полей, некоторых, известны, их и надо вывести)



Для зачем их присваивать записи и выводить в dbms_output?
Есть мнение, что либо задачу следует переформулировать, либо одно из двух.

Да, Андрей, вы правы. Мне нужно каждую строку произвольного курсора передавать в процедуру как параметр. В этой процедуре обрабатывать определенные поля этой строки - изменять их.

Я пока дошел до передачи курсора произвольного запроса в catch_me. Теперь внутри надо выбрать строки из курсора (на этом месте запнулся) и построчно "пропустить" через обрабатывающую процедуру (пока не дошел).
...
Рейтинг: 0 / 0
28.11.2017, 15:59
    #39560664
Этератор
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select *
from xmltable('/ROWSET/ROW/*'
   passing xmltype(dbms_xmlgen.getxml('SELECT 1 v1, 2 v2, 3 v3 FROM dual union all SELECT 1 v1, 2 v2, 3 v3 FROM dual union all SELECT 1 v1, 2 v2, 3 v3 FROM dual'))
   columns row_num number path 'count(preceding::ROW)',
           fie_num number path 'count(preceding-sibling::*)',
           nam varchar2(5) path 'name()',
           val varchar2(10) path 'text()'
);

   ROW_NUM    FIE_NUM NAM   VAL     
---------- ---------- ----- ----------
         0          0 V1    1         
         0          1 V2    2         
         0          2 V3    3         
         1          0 V1    1         
         1          1 V2    2         
         1          2 V3    3         
         2          0 V1    1         
         2          1 V2    2         
         2          2 V3    3         
...
Рейтинг: 0 / 0
28.11.2017, 16:19
    #39560677
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
DINSQL Мне нужно каждую строку произвольного курсора передавать в процедуру как параметр. В этой процедуре обрабатывать определенные поля этой строки - изменять их.
Изменять - в курсоре и выдавать наружу в другом курсоре?
Или изменять какие-то данные в БД на основе данных курсора?
Общее количество полей курсора стабильно или может меняться?
Возможно ли применение strong ref cursor?
...
Рейтинг: 0 / 0
28.11.2017, 16:23
    #39560680
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
DINSQLвы правы. Мне нужноО, типичный XYZ
...
Рейтинг: 0 / 0
28.11.2017, 16:30
    #39560689
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
Короче, если все совсем плохо - то сюда:
2105585
...
Рейтинг: 0 / 0
28.11.2017, 16:52
    #39560705
DINSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
andrey_anonymousDINSQL Мне нужно каждую строку произвольного курсора передавать в процедуру как параметр. В этой процедуре обрабатывать определенные поля этой строки - изменять их.
Изменять - в курсоре и выдавать наружу в другом курсоре?
Или изменять какие-то данные в БД на основе данных курсора?
Общее количество полей курсора стабильно или может меняться?
Возможно ли применение strong ref cursor?

Изменить значения полей записи и добавлять в таблицу (другую, есть 2 таблицы - источник и целевая (после обработки))
...
Рейтинг: 0 / 0
28.11.2017, 16:53
    #39560706
DINSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
ElicDINSQLвы правы. Мне нужноО, типичный XYZ

Слушайте, перестаньте флудить. Нечего сказать по делу, промолчите.
...
Рейтинг: 0 / 0
28.11.2017, 17:10
    #39560728
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическая обработка записей курсора
DINSQLElicпропущено...
О, типичный XYZ
Слушайте, перестаньте флудить. Нечего сказать по делу, промолчите.
Вообще-то коллега Elic по делу говорит.
И его предложение воспользоваться DBMS_SQL вполне в духе вопроса.
PL/SQL сам по себе не особо приспособлен для обработки неструктурированных наборов.
Потому я пытался вывести Вас на другие варианты - отказаться от weak RC вообще или в пользу strong RC; Перенести обработку на клиента или выполнить в серверной jvm.
В некоторых случаях уместно будет воспользоваться XML или JSON.

Но это можно сделать только если видеть ~всю задачу ~целиком, а не маленький кусочек, для которого, вероятно, выбрано не самое удачное технологическое решение.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамическая обработка записей курсора / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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