Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何在下面的过程中正确引用数据库链接名称_Oracle_Plsql_Procedure_Dblink - Fatal编程技术网

Oracle 如何在下面的过程中正确引用数据库链接名称

Oracle 如何在下面的过程中正确引用数据库链接名称,oracle,plsql,procedure,dblink,Oracle,Plsql,Procedure,Dblink,我在另一个论坛上问了一个类似的问题,但我没有完全理解上下文,所以我创建了一个更好的例子。有人知道我如何正确引用这里的链接吗?如果您硬编码数据库链接,代码会将一个.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)

我在另一个论坛上问了一个类似的问题,但我没有完全理解上下文,所以我创建了一个更好的例子。有人知道我如何正确引用这里的链接吗?如果您硬编码数据库链接,代码会将一个.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;
/

一种选择是使用动态SQL。如果它很简单,没问题,但是-循环的动态游标?不,谢谢

另一个选项是创建一个视图,作为您可能正在使用的所有数据库链接上的选择的联合,例如

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;

我接受了您对视图的建议,并从主SQL创建了一个视图。v_link:=“从link_name中选择link_name”;对于“select*from”| v|u链接循环utl|U文件.put|U线文件|U句柄,rws.OWNER | |',“| | rws.SEGMENT|u NAME | |”,“| rws.SUM|字节;端环;utl_file.fclosefile_句柄;结束写入大小;我很难解释,因为stackoverflow不允许在注释中包含足够的字符。begin v_link:=“从pdu中选择链接名称。link_name';后来:对于“选择*自”|| v|u link中的rws,你错了。创建一个视图。然后直接使用我写的代码,然后你会引用它…-你不应该有任何动态后。v_link_name是它的别名,即v_dba_segments视图中的链接列值。