创建外部 table 并将此数据加载到另一个 table 内部过程
Creating external table and loading this data into another table inside procedure
我正在尝试创建一个过程,它允许将数据从文件加载到外部 table。接下来它应该创建:序列和触发器,允许在将数据从外部 table 插入到其他 table 期间自动生成 ID。我写了整个过程,但是有很多问题,所以我从头开始 - 只是从文件创建外部 table。
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
中,但它是一样的...
此外,我知道将数据从外部 table 加载到其他 table 会遇到下一个问题。我收到消息说外部 table 不存在,这是真的,但它会在调用代码之前创建,这会将数据从外部加载到正常 table.
非常感谢您的帮助!
**编辑:**
@Guenther 的回答是正确的 - 缺少额外的引用。我今天早上发现了这个。
但是现在我遇到了一个不同的问题...将 FLOAT
数据加载到外部 table... 类似这样的数据:+00000700000,00
。任何想法如何做到这一点? FLOAT EXTERNAL
或 FLOAT(15)
不起作用...当然在 CREATE
语句中我有 FLOAT
列。
以下对我来说效果很好。我只是在 delimited by
之后添加了一个额外的 space 并在需要的地方添加了额外的引号。
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;
创建 table。确保架构所有者对该目录具有读取权限。
我正在尝试创建一个过程,它允许将数据从文件加载到外部 table。接下来它应该创建:序列和触发器,允许在将数据从外部 table 插入到其他 table 期间自动生成 ID。我写了整个过程,但是有很多问题,所以我从头开始 - 只是从文件创建外部 table。
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
中,但它是一样的...
此外,我知道将数据从外部 table 加载到其他 table 会遇到下一个问题。我收到消息说外部 table 不存在,这是真的,但它会在调用代码之前创建,这会将数据从外部加载到正常 table.
非常感谢您的帮助!
**编辑:**
@Guenther 的回答是正确的 - 缺少额外的引用。我今天早上发现了这个。
但是现在我遇到了一个不同的问题...将 FLOAT
数据加载到外部 table... 类似这样的数据:+00000700000,00
。任何想法如何做到这一点? FLOAT EXTERNAL
或 FLOAT(15)
不起作用...当然在 CREATE
语句中我有 FLOAT
列。
以下对我来说效果很好。我只是在 delimited by
之后添加了一个额外的 space 并在需要的地方添加了额外的引号。
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;
创建 table。确保架构所有者对该目录具有读取权限。