【问题标题】:PL/SQL - read external tablePL/SQL - 读取外部表
【发布时间】:2020-10-11 17:12:13
【问题描述】:

我已经动态创建了一个表并从 .csv 文件中写入了一个数据。我已经在传递创建的表名作为参数的过程中完成了它。现在,我想从该表中读取数据,或者理想情况下,我想在同一过程中将该表中的整个数据写入游标或数组,因为我需要将它们与存储在 DB 中的数据进行比较。我试图创建动态游标和数组,但没有奏效。有什么方法可以实现吗?

    CREATE OR REPLACE PROCEDURE My_procedure (p_ext_table_name   VARCHAR2,
                                                    p_file_name        VARCHAR2)
    AS
        v_ext_create   VARCHAR2 (10000);
        v_ext_table_name varchar2(100);
        --emp_refcur   SYS_REFCURSOR;
        --type ext_tab is table of EXT_table%rowtype;
        --emp_tab ext_tab;
    BEGIN
     
     v_ext_table_name := p_ext_table_name;
     v_ext_create :=
     'CREATE TABLE ' || p_ext_table_name || q'! ( 
      CUSTOMER_ID                      NUMBER,
      CUSTOMER_MAILING  CHAR(2 BYTE))
      ORGANIZATION EXTERNAL
      (  TYPE ORACLE_LOADER
         DEFAULT DIRECTORY  MY_DIRECTORY
            ACCESS PARAMETERS 
           ( RECORDS DELIMITED BY NEWLINE
        FIELDS TERMINATED BY ','
        MISSING FIELD VALUES ARE NULL
        ( Customer_ID,
          New_Customer_Mailing ))
        LOCATION (MY_DIRECTORY:'!' || p_file_name || q'!')
      )
    REJECT LIMIT UNLIMITED
    PARALLEL ( DEGREE 5 INSTANCES 1 )!';
    
    EXECUTE IMMEDIATE v_ext_create;
    
    
    
    END;

我的想法:

    /*open emp_refcur 'select CUSTOMER_ID from' || v_ext_table_name|| USING CUSTOMER_ID;
    LOOP
        FETCH EMP_REFCUR INTO CUSTOMER_ID;
        EXIT WHEN EMP_REFCUR%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(CUSTOMER_ID);
    END LOOP;
    CLOSE EMP_REFCUR;*/ didn't work 

【问题讨论】:

    标签: oracle plsql dynamic-sql external-tables


    【解决方案1】:

    在 PL/SQL 中动态创建表通常是不好的做法。它会产生各种各样的问题:SQL 是一种强类型语言,并且 - 正如您所发现的那样 - 很难编写代码来编译和运行仅在运行时存在的对象。

    您尚未解释您的总体业务需求,但您似乎不需要动态创建表。可能您只需要更改表格指向的文件。如果是这样的话:

    1. 创建表一次
    2. 当您需要加载某些表时,请更改文件。这是一个可以做到这一点的程序:
    create or replace procedure change_ext_table_file (p_file_name in varchar2) ) is
    begin
      execute immediate 'ALTER TABLE your_ext_table LOCATION (''' || p_file_name || ''')';
    end;
    
    1. 现在您可以使用静态 SQL 查询 your_ext_table 并将其连接到其他表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 2020-09-21
      • 2013-10-28
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多