Как правильно ссылаться на имя ссылки на базу данных в приведенной ниже процедуре - PullRequest
0 голосов
/ 01 февраля 2019

Я задал похожий вопрос на другом форуме, но не совсем понял контекст, поэтому создал лучший пример.Кто-нибудь знает, как я могу правильно ссылаться на ссылку здесь?Код отправляет файл .csv в соответствующий каталог, если вы жестко закодировали ссылку на базу данных, но я хочу передать ее в переменную.

CREATE OR REPLACE PROCEDURE WRITE_EST_SIZE
IS
   file_handle   UTL_FILE.file_type;
   v_link_name   VARCHAR2 (10);
   v_csv_name    VARCHAR2 (40);
BEGIN
   v_csv_name := 'file_name';

   --Table contains the name of the database link
   SELECT link_name INTO v_link_name FROM link_name;

   file_handle :=
      UTL_FILE.fopen ('ESTIMATES_CSV',
                      v_csv_name || '.csv',
                      'w',
                      32767);
   UTL_FILE.put_line (file_handle,
                      'OWNER,SEGMENT_NAME,SEGMENT_TYPE,SUM_BYTES');

   FOR rws
      IN (  SELECT s.owner,
                   s.segment_name,
                   'T' AS FLAG,
                   SUM (s.bytes) / 1024 / 1024 AS SUM_BYTES
              FROM DBA_SEGMENTS@LINK_TO_DEV s
             --Actually, I want THIS below to work
             --from DBA_SEGMENTS@v_link_name s
             WHERE     s.owner =
                          (SELECT DISTINCT schema_name FROM target_schema)
                   AND s.segment_name IN (SELECT table_name FROM ref_table)
                   AND s.segment_type LIKE '%TABLE%'
          GROUP BY s.owner, s.segment_name)
   LOOP
      UTL_FILE.put_line (
         file_handle,
            rws.OWNER
         || ','
         || rws.SEGMENT_NAME
         || ','
         || rws.FLAG
         || ','
         || rws.SUM_BYTES);
   END LOOP;

   UTL_FILE.fclose (file_handle);
END WRITE_EST_SIZE;
/

1 Ответ

0 голосов
/ 01 февраля 2019

Один из вариантов - использовать динамический SQL.Если бы это было что-то простое , никаких проблем, но - цикл динамический курсор FOR?Нет, спасибо.

Другой вариант - создать представление как UNION для выбора по всем ссылкам базы данных, которые вы можете использовать, например,

create or replace view v_dba_segments as
  select 'db_link_1' link, s.owner, s.segment_name, ...
  from dba_segments@db_link_1
  union all
  select 'db_link_2' link, s.owner, s.segment_name, ...
  from dba_segments@db_link_2
  union all 
  ...

Затем вы будете ссылаться на него ввышеуказанная процедура как

for rws in (select owner, segment_name, ...
            from v_dba_segments             --> view
            where link = v_link_name        --> this is where your variable comes into the game
              and ...
           )
loop
   ...
end loop;
...