Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вернуть массив sys.ODCIObjectList по dblink. Можно? / 9 сообщений из 9, страница 1 из 1
11.12.2021, 12:40
    #40119183
stil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
Есть процедура в одной базе:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
    PROCEDURE CLEANUP_TABLES(p_results OUT sys.ODCIObjectList)
    IS
      BEGIN
        --некая очистка

        --логирование
        p_results.EXTEND;
        p_results(p_results.COUNT) := sys.ODCIObject (r_list_report_dates.report_date, 'Успешно очищено');
      END;



Есть ее вызов по dblink в другой

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
   DECLARE
      v_results sys.ODCIObjectList;
    BEGIN
       PG_CLEANUP.CLEANUP_TABLES@DBLINK(v_results);
       FOR r_results IN (SELECT cast(objectschema AS DATE) AS DT,
                                 objectname AS RETURN_MESSAGE
                        FROM TABLE(v_results)
                        ORDER BY DT
                        )
        LOOP        
          dbms_output.put_line('Дата: '||to_char(r_results.DT,'DD.MM.YYYY') || '. Результат: ' || r_results.RETURN_MESSAGE);
        END LOOP;
     END;



Без DBLINK процедура прекрасно работает. Массив результатов выводится, а вот

при запуске с другой базы - получаю

Код: plsql
1.
2.
3.
4.
ORA-06550: line 4, column 8:
PLS-00306: wrong number or types of arguments in call to 'CLEANUP_TABLE'
ORA-06550: line 4, column 8:
PL/SQL: Statement ignored



Если убрать v_results из процедуры (не передавать в OUT параметре) процедура тоже прекрасно отрабатывает и по dblink

То есть проблема именно в этом параметре. Варианты, что я чтото не туда комплилирую я исключил. Похоже удаленная база почему то не хочет понимать такой параметр - массив

Это ограничение оракла? Или я чтото не так сделал?



v12
...
Рейтинг: 0 / 0
11.12.2021, 16:05
    #40119257
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
stil

Это ограничение оракла? Или я что то не так сделал?


Restriction on Using User-Defined Types with a Remote Database

User-defined types (specifically, types declared with a SQL CREATE TYPE statement, as opposed to types declared within a PL/SQL package) are currently useful only within a single database. You cannot use a database link to do any of the following*:

Connect to a remote database to query, insert, or update a user-defined type or an object REF on a remote table
Use database links within PL/SQL code to declare a local variable of a remote user-defined type
Convey a user-defined type argument or return value in a PL/SQL remote procedure call.

SY.
...
Рейтинг: 0 / 0
12.12.2021, 09:38
    #40119386
stil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
SY,

Чегото я запутался. Как сделать в процедуре cleanup заполнение переменной коллекционного типа, а с вызывающей стороны ее прочитать по dblink? Не передавая в параметрах?
...
Рейтинг: 0 / 0
12.12.2021, 15:48
    #40119427
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
stil

а с вызывающей стороны ее прочитать по dblink? Не передавая в параметрах?


Только через ж... с использованием типов с одинаковым OID, двух таблиц (local и remote) и двух db links (db1 --> db2 и db2 --> db1)

SY.
...
Рейтинг: 0 / 0
12.12.2021, 17:07
    #40119439
stil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
SY,

Похоже проще не заморачиваться коллекцией, а просто передать длинную строку в варчаре с разделителями
...
Рейтинг: 0 / 0
12.12.2021, 19:29
    #40119462
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
stil
Код: plsql
1.
2.
3.
4.
5.
6.
   v_results sys.ODCIObjectList;
    BEGIN
       PG_CLEANUP.CLEANUP_TABLES@DBLINK(v_results);
       FOR r_results IN (SELECT cast(objectschema AS DATE) AS DT,
                                 objectname AS RETURN_MESSAGE
                        FROM TABLE(v_results)

Поскольку объектный тип извращённо и nls-зависимо притянут за уши, то проще будет передать несколько ассоциативных массивов, которые прекрасно пролазят через link.
...
Рейтинг: 0 / 0
13.12.2021, 09:36
    #40119561
stil
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
Elic
stil
Код: plsql
1.
2.
3.
4.
5.
6.
   v_results sys.ODCIObjectList;
    BEGIN
       PG_CLEANUP.CLEANUP_TABLES@DBLINK(v_results);
       FOR r_results IN (SELECT cast(objectschema AS DATE) AS DT,
                                 objectname AS RETURN_MESSAGE
                        FROM TABLE(v_results)

Поскольку объектный тип извращённо и nls-зависимо притянут за уши, то проще будет передать несколько ассоциативных массивов, которые прекрасно пролазят через link.


Ну мне не обязательно притягивать чтото за уши. Просто надо вернуть список почищеных сейций таблицы, секционированной по дате с результатом по каждой

Но стационарные типы сделать нет возможности. Поэтому попытался прикрутить sys.ODCIObjectList (раньше его не использовал). Понятно что он не для этого, но вроде многие используют в качестве двумерного массива (в интернетах попадаются примеры)

Можно попытаться сделать хеш INDEX BY DATE. Попробую сейчас

Но в идеале конечно и трехмерную бы конструкцию - чтобы например еще передать кол-во строк (ну и ждля понимания что можно, а что нельзя)
...
Рейтинг: 0 / 0
13.12.2021, 18:54
    #40119720
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
stil
Ну мне не обязательно притягивать чтото за уши.
Но зачем-то притянул.
stil
Можно попытаться сделать хеш INDEX BY DATE. Попробую сейчас
Ты не читаешь, что написано, или не в состоянии понять, что такое "несколько ассоциативных массивов".
...
Рейтинг: 0 / 0
13.12.2021, 19:52
    #40119730
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть массив sys.ODCIObjectList по dblink. Можно?
stil,

Elic намекает коллекция объектов = набор ассоциативных массивов на атрибуты объекта связанных по индексу.

SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вернуть массив sys.ODCIObjectList по dblink. Можно? / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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