Oracle:文件和表

时间:2017-11-20 11:43:06

标签: oracle stored-procedures plsql

我是oracle和plsql的新手,所以请耐心等待。 我有一个文件TYPES.txt

id,name,values
1,aaa,32
2,bbb,23
3,cvv,12
4,fff,54

我的数据库中还有一个表,PARTS.ATTRIBUTES

id,name,props,crops
1,aaa,100,zzzz
2,bbb,200,yyyy
3,cvv,300,xxxx
4,fff,400,wwww
5,sasa,343,gfgg
6,uyuy,897,hhdf

我想根据列INNER JOIN对文件TYPESATTRIBUTES进行name。现在,我已经通过最初将文件TYPES加载到临时表中然后在临时表和INNER JOIN表之间执行ATTRIBUTES来完成此操作。

但是我想知道是否可以在TYPES文件和ATTRIBUTES表之间进行INNER JOIN而不使用临时表。 < / p>

我知道我可以使用以下脚本加载文件并获取相应的行:

declare
 file utl_file.file_type;
 line varchar2(500);
begin
 file :=utl_file.fopen('USER_DIR','TYPES.txt','r');
loop
 utl_file.get_line(file ,line);
 dbms_output.put_line(line);
end loop;
exception
 when others then
utl_file.fclose(file);
end;

有人可以向我解释如何在文件内容和数据库表之间进行连接吗?

P.S。文件TYPES.txt是动态生成的,并且可以在不同时间具有不同数量的列。

1 个答案:

答案 0 :(得分:1)

一种更简洁的方法是使用EXTERNAL TABLE

使用这样的create语句创建TYPES_external表。

CREATE TABLE TYPES_external (
  id      NUMBER(5),
  name    VARCHAR2(50),
  Values  VARCHAR2(50)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY USER_DIR
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY ','
    MISSING FIELD VALUES ARE NULL
    (
  id      NUMBER(5),
  name    VARCHAR2(50),
  Values  VARCHAR2(50)
    )
  )
  LOCATION ('TYPES.txt','TYPES.txt')
)
PARALLEL 5
REJECT LIMIT UNLIMITED;

创建后,您可以像使用此外部表(TYPES_external)一样使用 使用任何数据库表进行select操作。