Oracle 在ODI过程中从平面文件(数据存储)读取数据
我正在尝试从PL/SQL过程中读取一个文件,但我发现ORA-00942表或视图不存在错误Oracle 在ODI过程中从平面文件(数据存储)读取数据,oracle,oracle-data-integrator,Oracle,Oracle Data Integrator,我正在尝试从PL/SQL过程中读取一个文件,但我发现ORA-00942表或视图不存在错误 Caused by: Error : 942, Position : 21, Sql = SELECT UBIC_ID FROM LIST_UBICS , Error Msg = ORA-00942: table or view does not exist 我有一个文件,每行有一个id。此文件称为list_ubics.csv。我有一个文件模型和一个数据存储,指向名为LIST_UBIC的文件,带有UB
Caused by: Error : 942, Position : 21, Sql =
SELECT UBIC_ID FROM LIST_UBICS
, Error Msg = ORA-00942: table or view does not exist
我有一个文件,每行有一个id。此文件称为list_ubics.csv。我有一个文件模型和一个数据存储,指向名为LIST_UBIC的文件,带有UBIC_ID字段
我使用以下SQL在新过程中创建了一个任务:
从列表中选择UBIC\u ID\u UBICS
列表\u UBICS是我的数据存储,我没有任何具有这些名称的表
我想阅读这些文件,并对每一行进行一些处理,但我在文档中看不到任何方法来阅读适合我的文本文件
如何读取此文件
提前感谢您的帮助。用PL/SQL(Oracle技术)编写的ODI过程将被下推到数据库上。正在执行的数据库不知道文件数据存储,无法对其执行SQL语句 如果目标是加载带有ODI的文件,则可以使用接口(11g)或带有LKM文件到SQL的映射(12c)来完成。这将把文件的内容复制到数据库中的一个表中,然后可以对其执行任何SQL语句
或者,也可以在数据库中创建一个目录,将文件放在那里,并在上面创建一个外部表。查询可以用于外部表,但不能用于DML操作。这里有更多信息:我上周才发现还有一个解决方案,而且可能是最好的! 解决方案已经编写好了,如果您严格按照步骤操作,它就会工作(我实现了它) 无论如何,我将总结主要思想和步骤 我们可以在包中使用变量。有一个从给定文件中读取列的代码(请参见末尾的代码)。在包中生成for语句将帮助我们读取每一行,方法是从下面的代码中更改“CRFILE\u FIRST\u row”变量的值,以1开头的序号( 所以,一切都像上面那样简单。除了“CRFILE\U第一行”,还有更多可以更改的变量,如:CRFILE\U FORMAT=D(格式:十进制)、CRFILE\U SEP\U FIELD=0x0009(十六进制文件格式)等等 此外,正如您在原始文章(上面的链接)中所看到的,您可以生成视图代码;您不需要从下面复制粘贴 查看代码:
select TES.C1 C1
from location_of_file/objects_to_import.txt TES
/*$$SNPS_START_KEYSNP$CRDWG_TABLESNP$CRTABLE_NAME=TESTSNP$CRLOAD_FILE=location_of_file/objects_to_import.txtSNP$CRFILE_FORMAT=DSNP$CRFILE_SEP_FIELD=0x0009SNP$CRFILE_SEP_LINE=0x000ASNP$CRFILE_FIRST_ROW=#UTILS.IMPORT_OBJ_READ_INCRSNP$CRFILE_ENC_FIELD=SNP$CRFILE_DEC_SEP=SNP$CRSNP$CRDWG_COLSNP$CRCOL_NAME=C1SNP$CRTYPE_NAME=STRINGSNP$CRORDER=1SNP$CRLENGTH=50SNP$CRPRECISION=50SNP$CRACTION_ON_ERROR=NULLSNP$CR$$SNPS_END_KEY*/
映射(我使用的是12c)的问题是,如果这个ID存在,我必须在大视图(数百万个寄存器)中搜索文件中的每个ID,如果存在,则在目标表中插入。这是“一对一”检查是否存在是我在映射中无法做到的事情,如果我仅使用文件id和视图id放置联接,则执行总是会受阻。对于几百万行来说,联接不应该是问题。只需确保在两个表中的id属性上都有索引。并检查统计信息是否正确收集。如果是这样的话esn不起作用我上面建议的外部表格替代方案仍然是一个选项。