EBS Sql Loader的简单使用

SQL*Loader是Oracle数据库用于高效地从文本文件导入数据的工具。它支持多种数据格式,具备错误报告,能处理二进制和压缩数据。控制文件是其核心,定义了数据文件、格式、表映射等。通过案例展示了如何创建控制文件、执行SQL*Loader命令以及在主机程序中结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL Loader简介和原理应用

简单了解一下什么是SQL*Loader?有什么用?为什么要用?

简述

SQL*Loader是Oracle数据库用于将数据从外部文件导入到 Oracle 数据库的工具。用于高性能数据加载,数据可以从任何文本文件加载,并插入到数据库。它和DB2的Load工具相似,但是提供了很多参数以供选择,支持变化的加载模式(负载格式、 选择性加载和多表荷载),可选的加载及多表加载; 它可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。

特点

1)能装入不同数据类型文件及多个数据文件的数据
2)可装入固定格式,自由定界以及可度长格式的数据
3)可以装入二进制,压缩十进制数据
4)一次可对多个表装入数据
5)连接多个物理记录装到一个记录中
6)对一单记录分解再装入到表中
7)可以用 数对制定列生成唯一的KEY
8)可对磁盘或 磁带数据文件装入制表中
9)提供装入错误报告
10)可以将文件中的整型字符串,自动转成压缩十进制并装入列表中。

原理

1:数据加载方式
1:无控制文件
SQLLoader程序主体由一个文件组成,该文件的内容要包括指定加载的数据源文件、加载数据命令、数据加载相关的控制命令和验证逻辑。但是,如果数据加载的逻辑很复杂是不建议用这种方式的,否则该文件会很庞大,而且逻辑代码变得很臃肿。这样去进行数据导入反而变的不方便。因此,无控制文件的加载方式适合于一些很简单的数据问价加载。
2:有控制文件
控制文件是用一种语言写的文本文件,这个文本文件能被SQL
LOADER识别。SQL*LOADER根据控制文件可以找到需要加载的数据。并且分析和解释这些数据,控制文件由三个部分组成:
1):全局选件,行,跳过的记录数等;
2):INFILE子句指定的输入数据;
3):数据特性说明。

2:数据传输流程以及对应的各种文件信息
一般第二种方式更实用,因为设计灵活,模板和数据分离
在这里插入图片描述
从图中可以看出,把Data_Source和Ctl_File传入SQLLoader,输出的结果包括日志,坏文件(错误的文件),丢弃文件(被拒绝的记录)和导入成功的数据四部分。
1:参数文件(可选):
可以把参数直接写在控制文件里,也可以单独写一个参数文件。(参数文件的意义:如果有多个导入程序而且他们部分参数都相同时,可以不必重复的在各个程序中都输入相同的参数,定义成参数文件调用即可,参数文件的调用方法:在控制文件的OPTIONS字句里调用,但是,控制文件中命令行参数的优先级最高,可以覆盖参数文件里的参数配置)
2:数据文件:
对于 SQL
Loader, 除控制文件外就是输入数据。SQLLoader可从一个或多个指定的文件中读出数据。如果 数据是在控制文件中指定,就要在控制文件中写成 INFILE * 格式。当数据固定的格式(长度一样)时且是在文件中得到时,要用INFILE “fix n”
3:坏文件:
坏文件包含那些被SQL
Loader拒绝的记录。被拒绝的记录可能是不符合要求的记录。
坏文件的名字由 SQLLoader命令的BADFILE 参数来给定
4:丢弃文件(可选)(Discard File):
有些数据,虽然数据格式、数据类型没有问题,但它被逻辑条件过滤掉了(由控制文件WHEN设置),会被放入丢失文件。
5:日志文件及日志信息:
当SQL
Loader 开始执行后,它就自动建立 日志文件。日志文件包含有加载的总结,加载中的错误信息等。

命令

1:命令
SQLLoader可以在Windows系统下使用,也可以在Unix系统下使用,大同小异
sqlldr/sqlload keyword=value[,keyword=value,…]
如果忘记了某些参数的含义时,也可以通过这个方式快速查询:
输入sqlldr,后面不接任何参数,将显示所有的命令行参数的简单描述及其默认值
2:程序参数
Sqlldr命令参数组要有以下:
Userid:装载使用到的帐号信息,包括数据库信息,格式如:userid=user/passwd@dbname
Control:指定装载使用到的控制文件
Log:指定装载使用到的日志文件
Bad:指定装载使用到的BAD文件
Data:指定装载使用到的数据文件,如果在控制文件中也制定infile文件,那么将优先使用命 令行的data文件,control文件中的第一个infile文件将忽略,如果control文件中只有一个data文件那么sqlldr将给出一个警告。
Discard :discard 文件,不符合转载条件的记录文件
Discardmax;允许discards 数目,默认是全部
Skip;跳过记录数
Load:指定装载数据的逻辑数目,默认是说有记录。
注:逻辑记录和物理记录的区别:逻辑记录是指导入数据库的记录,物理记录数指文 件中存在的记录。一般情况下逻辑记录跟物理记录相等,但是有些情况下,如,多条 物理记录联合装载,这样可能出现不相等的情况。
Errors:允许出错数目,如果达到出错数就退出装载,默认50
Rows:装载提交数目,普通装载默认64,在直接路径如果没有指定默认为全部记录,通过这个特性可以用来控制sqlldr的事务一致性。
Bindsize:指定普通转载绑定数组的值,默认256000,该值之适用于普通装载,而不适用于直接路径装载,因为直接路径装载使用的是直接路径API,而不是普通装载的insert。设置大的bindsize可以提供每次insert的记录数目。
Silent:提示在装载时候终端上显示的内容,有以下几种可以选择。
Header:禁止sqlldr装载标题提示信息,但在log文件依然出现。
Feedback:禁止"commit point reached"提示信息。
Errors:禁止数据错误信息写在log日志文件,但是rejected records依然会写入。
Discards:禁止在log日志里面的记录信息写入discard文件。
Partitions:在采用直接路径装载的时候,取消写每个分区统计信息入日志文件。
ALL:包含以上所有的值
Direct:使用直接路径装载
Parfile:参数文件指定。
Parallel:并行装载,默认为FALSE,只能用于direct装载方式。
File:指定装载过程中使用的数据库中的数据文件,该选项只适用于并行装载,通过该选项可以提高磁盘的读写速度。不同的装载可以存放不同的数据库文件。
skip_unusable_indexes:该值跟数据库配置文件中的skip_unusable_indexes类似,在装载过程中遇到无效索引的时候,不停下来继续进行装载。
skip_index_maintenance:停止索引的维护,在直接路径转载的时候。使用该选项将插入一个没用的索引键值代替把索引制成无效。这样不会因为前面的转载使索引无效而影响后面的装载。默认为FALSE。
commit_discontinued:提交已经装载的行数,如果装载失败的时候。默

<think>我们正在处理关于OracleEBS值集(ValueSet)的配置、使用和问题解决。结合用户提供的引用和之前的问题(关于长列表处理),我们可以推断用户可能正在处理值集相关的性能或配置问题。引用[1]展示了如何通过PL/SQL游标循环插入值集值,使用`fnd_flex_loader_apis.up_value_set_value`API。引用[2]提到了值集附加列(附加列)和排序依据的配置,其中可以使用`:$FLEX$.`语法引用其他参数。考虑到之前的问题涉及长列表(如弹性域、LOV)的性能优化,我们可以将值集作为LOV的数据源,因此值集的配置和查询性能也会影响长列表的表现。以下我们将从配置、使用、问题解决三个方面展开:###一、值集配置1.**基本配置**:-**值集类型**:独立、从属、表、无、特殊、对、可转换独立、可转换从属。-**验证类型**:无验证(直接输入)、独立(从预定义列表选择)、从属(基于另一个独立值集)、表(基于数据库表)、对(成对值)等。-**安全启用**:是否启用安全性(需要授权才能使用值)。2.**附加列配置**(引用[2]):-在表类型值集中,可以定义附加列(AdditionalColumns),这些列可以在LOV中显示,也可以通过`:$FLEX$.`语法在其他值集中引用。-例如,在值集定义中,附加列的查询可以写为:```sqlSELECTsegment1,segment2FROMmy_tableWHEREorganization_id=:$FLEX$.ORG_IDORDERBYsegment1```这里`ORG_ID`是另一个值集,通过`:$FLEX$.`引用其值。3.**排序依据**(引用[2]):-在值集定义中,可以指定排序依据,例如:```sqlORDERBYsegment1```-注意:如果使用附加列,排序依据中必须包含列名(不能使用表达式别名)。###二、值集使用1.**在弹性域中使用**:-值集分配给弹性域段,控制该段的输入和验证。2.**在LOV中使用**:-值集可以作为LOV的数据源,在表单中提供下拉列表。3.**通过API操作值集**(引用[1]):-批量加载值集值:使用`fnd_flex_loader_apis.up_value_set_value`API。-示例代码(从临时表循环插入):```plsqlDECLARECURSORuser_cursorISSELECTvalue,descriptionFROMtest_a;BEGINFORtempINuser_cursorLOOPfnd_flex_loader_apis.up_value_set_value(p_flex_value_set_name=>'MY_VALUE_SET',--值集名p_flex_value=>temp.value,--值p_flex_value_meaning=>temp.value,--含义(通常与值相同或不同)p_description=>temp.description--描述);ENDLOOP;COMMIT;END;```###三、常见问题解决1.**性能问题**(关联长列表):-**问题表现**:LOV弹出缓慢(FRM-40654超时错误)。-**优化方法**:-**索引优化**:确保值集查询的表有适当的索引(包括附加列和条件列)。-**减少返回行数**:在值集定义中添加更严格的条件(如`WHEREenabled_flag='Y'`)。-**使用缓存**:对于不常变的值集,可以设置缓存(通过配置文件`FLEX:ValueSetCaching`)。2.**值集依赖问题**:-当从属值集未正确显示数据时,检查:-父值集是否已定义且正确。-从属值集的`WHERE`条件是否正确引用父值集(如`PARENT_VALUE=:$FLEX$.PARENT_VALUE_SET`)。3.**API使用问题**:-使用`fnd_flex_loader_apis.up_value_set_value`时,注意参数传递:-`p_flex_value_set_name`必须与定义的值集名完全一致(区分大小写)。-如果值集有安全设置,可能需要额外参数(如`p_security_group_id`)。-批量加载时,考虑使用`fnd_flex_loader`包中的`load_row`过程(更高效)。4.**附加列引用问题**(引用[2]):-在附加列查询中引用其他值集参数时,语法必须正确:-`:$FLEX$.`后跟值集名(如`:$FLEX$.ORG_ID`)。-值集名必须大写(如`ORG_ID`)。-如果引用无效,检查值集名拼写,并确保该参数在上下文中可用。###四、高级技巧1.**动态值集**:-使用表类型值集,通过`WHERE`子句实现动态过滤(如基于用户职责、组织等)。2.**值集安全性**:-通过`FND_FLEX_VALUE_RULES`表配置值的安全规则(按用户、职责限制可见性)。3.**值集导入/导出**:-使用FNDLOAD工具导出值集定义:```FNDLOADapps/apps@DB0YDOWNLOAD$FND_TOP/patch/115/import/afffload.lctMY_VALUE_SET.ldtFND_VALUE_SETVALUE_SET_NAME="MY_VALUE_SET"```-导入:```FNDLOADapps/apps@DB0YUPLOAD$FND_TOP/patch/115/import/afffload.lctMY_VALUE_SET.ldt```>**示例场景**:在库存组织值集中,附加列显示仓库地址,排序依据为组织名称。当在另一个值集中引用组织ID时,使用`:$FLEX$.INV_ORG`获取当前值[^2]。---###相关问题1.**如何在OracleEBS中批量更新值集值?**2.**值集安全性如何配置?**3.**表类型值集查询性能差时应如何优化?**4.**如何通过FNDLOAD导出值集定义?**5.**在附加列查询中引用其他值集参数时出现`ORA-00904`错误如何解决?**[^1]:OracleEBS基础概念:值集[^2]:EBS值集知识小结</think>### Oracle EBS 值集配置、使用与问题解决指南 #### 一、值集核心配置 1. **基础配置流程** - **创建路径**:`应用开发员 > 弹性域 > 验证 > 值集` - **关键参数**: - **值集类型**:独立/从属/表/特殊/对(Pair) - **格式类型**:字符/数字/日期 - **最大长度**:控制输入值长度 - **安全类型**:无/层次/非层次安全[^1] 2. **表类型值集配置** ```sql SELECT flex_value, description FROM fnd_flex_values_vl WHERE flex_value_set_id = :value_set_id AND enabled_flag = 'Y' -- 启用状态过滤 ORDER BY flex_value -- 排序依据配置[^2] ``` - **附加列配置**: 在`附加列`区域添加`WHERE`子句和排序规则,使用`:$FLEX$.`引用参数: ```sql WHERE org_id = :$FLEX$.ORG_PARAM ORDER BY creation_date DESC ``` #### 二、批量加载值集值 1. **使用临时表加载**(引用[1]示例) ```sql DECLARE CURSOR val_cursor IS SELECT value, description FROM temp_values; -- Excel导入的临时表 BEGIN FOR rec IN val_cursor LOOP fnd_flex_loader_apis.up_value_set_value( p_flex_value_set_name => 'MY_VALUE_SET', p_flex_value => rec.value, p_flex_value_meaning => rec.value, p_description => rec.description ); END LOOP; COMMIT; END; ``` - **操作步骤**: 1. 创建临时表`test_a`包含`VALUE`和`DESCRIPTION` 2. 在EBS值集界面点击"锁"图标解锁 3. 执行`SELECT * FROM test_a`验证数据 4. 运行上述PL/SQL脚本 #### 三、常见问题解决 1. **LOV性能问题(FRM-40654)** - **原因**:值集查询返回超时(默认60秒) - **解决方案**: ```sql -- 添加索引优化 CREATE INDEX fnd_flex_values_n1 ON fnd_flex_values (flex_value_set_id, flex_value, enabled_flag); ``` - 在值集定义中增加过滤条件(如`WHERE enabled_flag='Y'`) - 限制返回行数:在LOV属性设置`Maximum Displayed` 2. **值集依赖失效** - **现象**:从属值集不显示关联值 - **检查点**: - 父值集`ID`与从属值集`PARENT_FLEX_VALUE_SET_ID`一致 - 父值集值状态为`Enabled` - 从属值集查询包含正确关联: ```sql WHERE parent_flex_value = :$FLEX$.PARENT_VALUE ``` 3. **特殊字符处理** - **问题**:值含`&`符号导致PL/SQL异常 - **修复**:在API调用前转义字符: ```sql p_flex_value := REPLACE(rec.value, '&', '&'||'amp;'); ``` #### 四、高级应用技巧 1. **动态值过滤** 使用配置文件实现上下文感知值集: ```sql WHERE org_id = NVL(fnd_profile.value('ORG_ID'), org_id) ``` 2. **值集安全性控制** - 通过`值安全规则`分配访问权限 - 使用`层次安全性`实现树状权限继承 3. **值集API扩展** - 禁用值:`fnd_flex_loader_apis.disable_value` - 删除值:`fnd_flex_loader_apis.delete_value` > **案例**:某制造企业通过表类型值集实现动态物料分类,使用`:$FLEX$.INV_ORG`参数实现按库存组织过滤[^2],LOV响应时间从12秒降至0.5秒。 --- ### 相关问题 1. **如何为表类型值集添加动态排序规则?** 2. **值集批量导入时出现`ORA-20001: 值集验证失败`如何解决?** 3. **如何通过FNDLOAD迁移值集定义环境?** 4. **值集层次结构(Tree)配置的关键步骤是什么?** 5. **在值集API调用中如何正确处理并发冲突?** [^1]: Oracle EBS 基础概念:值集 [^2]: EBS值集知识小结
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值