Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / заполнение коллекции по DBLINK / 17 сообщений из 17, страница 1 из 1
23.11.2017, 08:39
    #39558010
wellvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
Здравствуйте!
Столкнулся с интересным фактом, просьба помочь разобраться! Вкратце, читаю данные из удаленной БД(Oracle 11g) по dbllink, данные помещаю в коллекцию(Nested table), но данные из таблицы считываются не полностью, всегда не больше 100 если использовать LIMIT, без него все хорошо...
В таблице test_r 1000 rows, после заливки данных в коллекцию, с использованием LIMIT - T_COL.count= 60, без использования - T_COL.count=1000)
Обзорно, последовательность действий такова:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
type CA_SE is record
(
id   test.ID%TYPE,
name test.name%TYPE,
key  test.key%TYPE  
);
TYPE NL_CA_SE  IS TABLE OF CA_SE ;
T_COL NL_CA_SE :=NL_CA_SE ();
loop --not all data
  open  v_cur for select * from test_r@dblink;
  fetch v_cur bulk collect into T_COL limit 100;
  exit when v_cur%notfound;
end loop;

 fetch v_cur bulk collect into T_COL  ;--all data from remote table
...
Рейтинг: 0 / 0
23.11.2017, 08:50
    #39558014
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
wellvkпоследовательностьпоменять, loop и open - не?
...
Рейтинг: 0 / 0
23.11.2017, 08:50
    #39558015
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
wellvkпросьба помочь разобраться!Руки/голова.
wellvkОбзорно, последовательность действий такова:
Код: plsql
1.
2.
loop --not all data
  open  v_cur

Врёшь.
wellvk
Код: plsql
1.
:=NL_CA_SE ();

Бесполезняк.
wellvk
Код: plsql
1.
  exit when v_cur%notfound;

Условие выхода неправильное.
...
Рейтинг: 0 / 0
23.11.2017, 08:55
    #39558017
wellvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
ma1tus, опечатка, делал без проверки, естественно, с начало open, затем цикл...
...
Рейтинг: 0 / 0
23.11.2017, 09:02
    #39558019
wellvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
Врёшь.
wellvk
Код: plsql
1.
:=NL_CA_SE ();


что не так?
wellvk
Код: plsql
1.
  exit when v_cur%notfound;

Условие выхода неправильное.
T_COL.count<100 результат тот же.
Что упустил?
...
Рейтинг: 0 / 0
23.11.2017, 09:06
    #39558024
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
wellvkрезультат тот же.Таки голова. Каждую порцию данных нужно обрабатывать внутри цикла, а не последнюю за ним.
...
Рейтинг: 0 / 0
23.11.2017, 09:08
    #39558025
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
wellvkчто не так?удали и сравни.
...
Рейтинг: 0 / 0
23.11.2017, 09:49
    #39558043
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
wellvk[/src]
что не так?
wellvk
Код: plsql
1.
  exit when v_cur%notfound;

Условие выхода неправильное.
T_COL.count<100 результат тот же.
Что упустил?[/quot]

http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html

Код: 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.
PROCEDURE process_all_rows (limit_in IN PLS_INTEGER DEFAULT 100)
IS
    CURSOR employees_cur 
    IS 
        SELECT * FROM employees;

    TYPE employees_aat IS TABLE OF employees_cur%ROWTYPE
        INDEX BY PLS_INTEGER;

    l_employees employees_aat;
BEGIN   
    OPEN employees_cur;
    LOOP
        FETCH employees_cur 
            BULK COLLECT INTO l_employees LIMIT limit_in;

        FOR indx IN 1 .. l_employees.COUNT 
        LOOP
            analyze_compensation (l_employees(indx));
        END LOOP;

        EXIT WHEN l_employees.COUNT < limit_in;

   END LOOP;

   CLOSE employees_cur;
END process_all_rows;



авторSo, to make sure that your query processes all 227 rows, replace this statement:


EXIT WHEN
table_with_227_rows_cur%NOTFOUND;

with

EXIT WHEN
l_table_with_227_rows.COUNT = 0;



.....
stax
...
Рейтинг: 0 / 0
23.11.2017, 10:09
    #39558051
wellvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
Elicwellvkчто не так?удали и сравни.
Удалил, сравнил...
Что говорит по этому вопросу ман Nested Tables
в частности:
An uninitialized nested table variable is a null collection. You must initialize it, either by making it empty or by assigning a non-NULL value to it
...
Рейтинг: 0 / 0
23.11.2017, 10:13
    #39558054
заполнение коллекции по DBLINK
Stax http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html Ферштейн ламер. В приведенном тобой примере employees_cur%notfound сработает точно так же, как l_employees.COUNT < limit_in.
Хотя, может в 9i оно работало по другому...
...
Рейтинг: 0 / 0
23.11.2017, 10:14
    #39558055
wellvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
Elicwellvkрезультат тот же.Таки голова. Каждую порцию данных нужно обрабатывать внутри цикла, а не последнюю за ним.
Зачем мне обрабатывать внутри цикла- я заполняю просто коллекцию...Bulk collect на то и дан)
...
Рейтинг: 0 / 0
23.11.2017, 10:25
    #39558063
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
тогда ты чайникStax http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html Ферштейн ламер. В приведенном тобой примере employees_cur%notfound сработает точно так же, как l_employees.COUNT < limit_in.
Хотя, может в 9i оно работало по другому...
авторThe collection is always filled sequentially, starting from index value 1.
It is always safe (that is, you will never raise a NO_DATA_FOUND exception) to iterate through a collection from 1 to collection .COUNT when it has been filled with BULK COLLECT.
The collection is empty when no rows are fetched.
Always check the contents of the collection (with the COUNT method) to see if there are more rows to process.
Ignore the values returned by the cursor attributes, especially %NOTFOUND.




google
авторКолекція завжди заповнюється послідовно, починаючи з значення індексу 1.
Це завжди безпечно (тобто ви ніколи не піднімете виключення NO_DATA_FOUND), щоб ітерації через колекцію від 1 до колекції .COUNT, коли вона була заповнена BULK COLLECT.
Колекція порожня, коли не знайдено жодного рядка.
Завжди перевіряйте вміст колекції (за допомогою методу COUNT), щоб перевірити, чи для обробки є більше рядків.
Ігнорувати значення, що повертаються атрибутами курсору, особливо% NOTFOUND.



ps
exit when v_cur%notfound;
имеет право на жизнь, зависит как/где обрабытывается результат bulk
wellvk не показал как он ето делает
pss
в старой доке был баг

....
stax
...
Рейтинг: 0 / 0
23.11.2017, 10:42
    #39558080
wellvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
Staxтогда ты чайникпропущено...
Ферштейн ламер. В приведенном тобой примере employees_cur%notfound сработает точно так же, как l_employees.COUNT < limit_in.
Хотя, может в 9i оно работало по другому...
авторThe collection is always filled sequentially, starting from index value 1.
It is always safe (that is, you will never raise a NO_DATA_FOUND exception) to iterate through a collection from 1 to collection .COUNT when it has been filled with BULK COLLECT.
The collection is empty when no rows are fetched.
Always check the contents of the collection (with the COUNT method) to see if there are more rows to process.
Ignore the values returned by the cursor attributes, especially %NOTFOUND.




google
авторКолекція завжди заповнюється послідовно, починаючи з значення індексу 1.
Це завжди безпечно (тобто ви ніколи не піднімете виключення NO_DATA_FOUND), щоб ітерації через колекцію від 1 до колекції .COUNT, коли вона була заповнена BULK COLLECT.
Колекція порожня, коли не знайдено жодного рядка.
Завжди перевіряйте вміст колекції (за допомогою методу COUNT), щоб перевірити, чи для обробки є більше рядків.
Ігнорувати значення, що повертаються атрибутами курсору, особливо% NOTFOUND.



ps
exit when v_cur%notfound;
имеет право на жизнь, зависит как/где обрабытывается результат bulk
wellvk не показал как он ето делает
pss
в старой доке был баг

....
stax

Шановний, прочитайте умова, як використовується колекція, в принципі, не важливо.
...
Рейтинг: 0 / 0
23.11.2017, 10:56
    #39558092
ma1tus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
wellvkBulk collect wellvkя заполняюфетчите, и теряете прежний набор, с каждым следующим...
...
Рейтинг: 0 / 0
23.11.2017, 11:12
    #39558107
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
wellvkЗачем мне обрабатывать внутри цикла- я заполняю просто коллекцию...Bulk collect на то и дан)Ты ламер, не понимающий, для чего нужен LIMIT.
...
Рейтинг: 0 / 0
23.11.2017, 11:36
    #39558127
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
wellvkШановний, прочитайте умова, як використовується колекція, в принципі, не важливо.

не понял,
что значит не важно

Как используется? вернее в каком месте обзорного кода?

....
stax
...
Рейтинг: 0 / 0
24.11.2017, 06:35
    #39558712
wellvk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заполнение коллекции по DBLINK
ElicwellvkЗачем мне обрабатывать внутри цикла- я заполняю просто коллекцию...Bulk collect на то и дан)Ты ламер, не понимающий, для чего нужен LIMIT.
Скорее не LIMIT а концепт BULK COLLECT...сам себя в трех соснах запутал...все спасибо за помощь)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / заполнение коллекции по DBLINK / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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