загрузить, когда (1: 5) в select с внешним встроенным представлением запрашивает переменные связывания - PullRequest
0 голосов
/ 17 февраля 2020

Я не нахожу переключатель для включения привязок в SQL Разработчик:

Я создал CSV-файл:

    declare  
       v_file utl_file.file_type;
    begin  
       v_file := utl_file.fopen('DATA_FILE_DIR', 'example2.csv', 'W');
       utl_file.put_line(v_file, 'colid|colstring|colnumber|coldate');  
       utl_file.put_line(v_file, '1|"nothing"|231.12|2019-01-03 23:43:32');
       utl_file.put_line(v_file, '2|"not more"|121|2020-10-05 14:33:15');
       utl_file.FFLUSH(v_file);  
       utl_file.fclose(v_file);  
    end;

Который я хочу прочитать встроенный выбор:

select c_001,c_002, c_003, c_004 from external
((   c_001 varchar2(200)
   , c_002 varchar2(200)
   , c_003 varchar2(200)
   , c_004 varchar2(200)
     )
    TYPE oracle_loader
    default directory DATA_FILE_DIR
    access parameters (
         RECORDS DELIMITED BY newline
         load when (1:5) != 'colid'
         LOGFILE DATA_FILE_DIR:'inline_ext_tab_%a_%p.log'
         FIELDS CSV WITH EMBEDDED TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
         MISSING FIELD VALUES ARE NULL(
             c_001
           , c_002
           , c_003 
           , c_004 
         )
    )
    location ('example2.csv')
    reject limit unlimited
    )

Проблема, которую я получаю, load when (1:5) != 'colid' запрашивает замену Bind.

set define off;
set escape off;

не помогло в моем случае. Есть идеи, чтобы предотвратить такое поведение? Использование пропуска 1 из-за ошибки 29420254 не вариант.

Ошибка регрессии 29420254 с load when text != 'xxxxxxxxxxxxxx' вместо skip 1:

ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEFETCH callout
ORA-30653: reject limit reached

select filename,text
from external(( FILENAME VARCHAR2(255 CHAR),text VARCHAR2(10 CHAR))
TYPE ORACLE_LOADER
DEFAULT DIRECTORY "DATA_FILE_DIR"
ACCESS PARAMETERS
( RECORDS DELIMITED BY newline
preprocessor DATA_FILE_DIR:'add_filename_semikolon.sh'
load when text != 'xxxxxxxxxxxxxx'
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
MISSING FIELD VALUES ARE NULL
(
FILENAME CHAR(255),
text CHAR (10)))
LOCATION
( 'Testfall_s1.csv')
); 

Testfall_s1.csv:

"xxxxxxxxxxxxxx"
"abcd" 

add_filename_semikolon. sh

#!/bin/bash
# Separator: ;
FILENAME='"'${1##*/}'"'
/usr/bin/sed -e 's/^/'$FILENAME';/' $1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...