Внешние таблицы.

Алекс-Могилев
Дата: 12.10.2015 11:09:00
Суть задания состоит в создании внешней таблицы. Я создал PL/SQL блок такого вида

DECLARE

N_SID PLS_INTEGER; 
V_SHEMA_NAME VARCHAR2(50);

BEGIN

    SELECT DISTINCT SID 
    INTO N_SID 
    FROM v$mystat;
  
    SELECT VS.SCHEMANAME
    INTO V_SHEMA_NAME
      FROM V$SESSION VS
     WHERE VS.SID = N_SID;
    
    FOR REC_RECORD IN (SELECT DECODE (
                                  COUNT (*),
                                  0, PKG_CONST.NO_VALUE,
                                  PKG_CONST.YES_VALUE) AS TABLE_EXISTS
                         FROM DBA_TABLES U
                        WHERE U.TABLE_NAME = 'STG_PROVIDER_MARGIN_FACTOR'
              AND U.OWNER = V_SHEMA_NAME)
    LOOP			  
        IF REC_RECORD.TABLE_EXISTS = PKG_CONST.NO_VALUE
        THEN
           EXECUTE IMMEDIATE '
               CREATE TABLE STG_PROVIDER_MARGIN_FACTOR
                    (LOCATION_CODE  VARCHAR2(20),
                     MARGIN_FACTOR  VARCHAR2(50),
                     SUBMODALITY    NUMBER(5)
                     )
               ORGANIZATION EXTERNAL
                    (TYPE ORACLE_LOADER
                     DEFAULT DIRECTORY DATA_PUMP_DIR
                     ACCESS PARAMETERS
                    (RECORDS DELIMITED BY ''\n''
                     FIELDS TERMINATED BY '','')                                                     
                LOCATION (''provider_margin_factor.csv''))';
            DBMS_OUTPUT.PUT_LINE ('External table STG_PROVIDER_MARGIN_FACTOR created'); 
        END IF;
    END LOOP;		
EXCEPTION
    WHEN OTHERS
    THEN
        RAISE;
        ROLLBACK;    
    --DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;


Блок отрабатывает хорошо, задачу свою выполняет. Но старший разработчик, задал вопрос. Что , есть еще вьюшка DBA_EXTERNAL_TABLES. Можно ли ее использовать в моем блок. Я переписал свой блок на

DECLARE

N_SID PLS_INTEGER; 
V_SHEMA_NAME VARCHAR2(50);

BEGIN

    SELECT DISTINCT SID 
    INTO N_SID 
    FROM v$mystat;
  
    SELECT VS.SCHEMANAME
      INTO V_SHEMA_NAME
      FROM V$SESSION VS
     WHERE VS.SID = N_SID;
    
    FOR REC_RECORD IN (SELECT DECODE (
                                  COUNT (*),
                                  0, PKG_CONST.NO_VALUE,
                                  PKG_CONST.YES_VALUE) AS TABLE_EXISTS
                         FROM DBA_EXTERNAL_TABLES U
                        WHERE U.TABLE_NAME = 'STG_PROVIDER_MARGIN_FACTOR'
              AND U.OWNER = V_SHEMA_NAME )
    LOOP        
        IF REC_RECORD.TABLE_EXISTS = PKG_CONST.NO_VALUE
        THEN
           EXECUTE IMMEDIATE '
               CREATE TABLE STG_PROVIDER_MARGIN_FACTOR
                    (LOCATION_CODE  VARCHAR2(20),
                     MARGIN_FACTOR  VARCHAR2(50),
                     SUBMODALITY    NUMBER(5)
                     )
               ORGANIZATION EXTERNAL
                    (TYPE ORACLE_LOADER
                     DEFAULT DIRECTORY DATA_PUMP_DIR
                     ACCESS PARAMETERS
                    (RECORDS DELIMITED BY ''\n''
                     FIELDS TERMINATED BY '','')                                                     
                LOCATION (''provider_margin_factor.csv''))';
            DBMS_OUTPUT.PUT_LINE ('External table STG_PROVIDER_MARGIN_FACTOR created'); 
        END IF;
    END LOOP;    
EXCEPTION
    WHEN OTHERS
    THEN
        RAISE;
        ROLLBACK;    
    --DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;


И тут уже выскачило две ошибки

1) ORA - 00955
2) ORA - 06515.

Подскажите возможно ли использовать в моем примере DBA_EXTERNAL_TABLES вместо DBA_TABLES. И если нет то почему ведь по логике вещей они схожи
Грустный админ
Дата: 12.10.2015 11:20:21
Алекс-Могилев,

desc DBA_EXTERNAL_TABLES
hardhouse
Дата: 12.10.2015 11:24:42
    SELECT DISTINCT SID 
    INTO N_SID 
    FROM v$mystat;
  
    SELECT VS.SCHEMANAME
      INTO V_SHEMA_NAME
      FROM V$SESSION VS
     WHERE VS.SID = N_SID;

USERENV