创建外部表并将此数据加载到过程

时间:2017-09-27 16:41:53

标签: sql oracle stored-procedures external-tables

我正在尝试创建一个过程,它允许将数据从文件加载到外部表中。接下来它应该创建:sequence和trigger,它允许在从外部表插入数据到其他表期间自动生成ID。我编写了整个过程,但是存在很多问题,所以我从头开始 - 只是从文件创建外部表。

CREATE OR REPLACE PROCEDURE LOAD_TO_EXTERNAL AS
  PATH_FILE VARCHAR2(100) := 'TEST_FILE.TXT';
  DELIMETER VARCHAR2(100) := '\n';
  DATE_FORMATTING VARCHAR2(100) := 'YYYY-MM-DD';
  STMT VARCHAR2(5000);
BEGIN
  STMT := 'CREATE TABLE "TEST_EXT"
    (
      DATA DATE,
      NAME VARCHAR2(5),
      CODE VARCHAR2(5)
    )
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_LOADER DEFAULT DIRECTORY MY_DIR ACCESS PARAMETERS
      (RECORDS DELIMITED BY' || DELIMETER || '
      FIELDS LRTRIM (
          DATA (1:10) CHAR(10) DATE_FORMAT DATE MASK ' || DATE_FORMATTING || ',
          NAME (39:78) CHAR(40),
          CODE (79:80) CHAR(2)
         )
      ) LOCATION (' || PATH_FILE || ')
    )
    REJECT LIMIT UNLIMITED';

    EXECUTE IMMEDIATE STMT;

END LOAD_TO_EXTERNAL;

不幸的是,我收到此错误,指向EXECUTE IMMEDIATE

ORA-00905: missing keyword
ORA-06512: at "SYSTEM.LOAD_TO_EXTERNAL_SEQ", line 34
ORA-06512: at line 2

我也建议将STMT放在:('BEGIN ' || STMT || 'END;')之间,但后来我收到了这个错误:

PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:

   ( begin case declare exit for goto if loop mod null pragma
   raise return select update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   continue close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe purge
   json_exists json_value json_query json_object json_array

我不知道这有什么问题...

我试着没有创建STMT变量,只是将语句直接放在EXECUTE IMMEDIATE中,但它是一样的......

更重要的是,我知道将外部表中的数据加载到其他表中会出现下一个问题。我收到外部表不存在的消息,这是真的,但它会在调用代码之前创建,这将从外部表加载到普通表。

感谢您的帮助!

**编辑:**

@Guenther答案是正确的 - 缺少额外的qoutes。我今天早上发现了这个。 但是现在我有一个不同的问题......将FLOAT数据加载到外部表中......这样的数据:+00000700000,00。任何想法如何做到这一点? FLOAT EXTERNALFLOAT(15)不起作用......当然在CREATE声明中我有FLOAT列。

1 个答案:

答案 0 :(得分:0)

以下对我来说很好。我只是在delimited by之后添加了一个额外的空格,并在需要的地方添加了额外的引号。

create or replace PROCEDURE LOAD_TO_EXTERNAL AS
  PATH_FILE VARCHAR2(100) := 'TEST_FILE.TXT';
  DELIMETER VARCHAR2(100) := '-';
  DATE_FORMATTING VARCHAR2(100) := 'YYYY-MM-DD';
  STMT VARCHAR2(5000);
BEGIN
  STMT := 'CREATE TABLE "TEST_EXT"
    (
      DATA DATE,
      NAME VARCHAR2(5),
      CODE VARCHAR2(5)
    )
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_LOADER DEFAULT DIRECTORY MY_DIR ACCESS PARAMETERS
      (RECORDS DELIMITED BY ''' || DELIMETER || '''
      FIELDS LRTRIM (
          DATA (1:10) CHAR(10) DATE_FORMAT DATE MASK ''' || DATE_FORMATTING || ''',
          NAME (39:78) CHAR(40),
          CODE (79:80) CHAR(2)         )
      ) LOCATION (''' || PATH_FILE || ''')
    )
    REJECT LIMIT UNLIMITED';

    EXECUTE IMMEDIATE STMT;
END LOAD_TO_EXTERNAL;

之后

begin
 LOAD_TO_EXTERNAL();
end;

创建表格。确保架构所有者具有该目录的读权限。