我正在尝试使用APEX数据加载器来允许用户导入数据和其中一个列值,我宁愿不强迫用户提供,因为当用户选择导入时,会话中的值随时可用。是那里一种以编程方式添加该列值的方法?
答案 0 :(得分:3)
我有一个类似的问题,并按照Greg在评论中提出的方式解决了这个问题。下面是我在过程中使用的代码示例,该代码在" Parse Uploaded Data"之后运行。在向导的第1页上:
FOR UPLOAD_ROW IN (SELECT SEQ_ID
FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '2',
p_attr_value => :P1_TABLE_FIELD_2);
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '3',
p_attr_value => :P1_TABLE_FIELD_3);
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '4',
p_attr_value => :P1_TABLE_FIELD_4);
END LOOP;
有关更详细的说明,请参阅http://www.jrweth.com/oracle-apex-data-loader-part-1-adding-custom-columns/
答案 1 :(得分:3)
使用Oracle APEX 4.2数据向导,如果First Rows是列名,则将行添加到SPREADSHEET_CONTENT是不够的。假设您要添加第9列,则还必须运行以下命令,' C009'并且名称是“MY_COLUMN_NAME”'。
APEX_COLLECTION.ADD_MEMBER(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'C009',
p_c002 => 'MY_COLUMN_NAME')
;
否则,它只是使用PARSE_COL_HEAD的元数据忽略数据。
答案 2 :(得分:2)
您可以编辑加载程序并添加数据转换规则。
我讨厌发布链接,但Rowan的这篇博文提供了充分的解释,因为Oracle的文档没有这样做。
Application Express Data Loader Transformation Rules in 4.2
基本上,转换规则功能允许您在目标表中选择一个或多个列。然后从可用选项中选择转换类型:PL / SQL表达式,PL / SQL函数,SQL查询(2种类型)。
加载器将为每个加载的行运行此函数,您可以引用会话状态,查找其他表或包状态中的值,以及行中的列值。例如,如果您有一个名为COLUMN1的列,您将在转换规则的源中将其引用为:COLUMN1(例如IF:COLUMN1> 10 THEN ....)。
如果使用PL / SQL表达式,则评估后的值将作为新列值返回。如果使用PL / SQL函数,则需要添加一个RETURN表达式以将该值返回到列中。
也就是说,您将无法使用用于获取值的绑定表示法来设置值。因此,如果您希望将COLUMN1设置为10,请构建规则以设置该值,请勿尝试执行此操作:COLUMN1:= 10;因为这个状态只会在执行转换记录的规则执行期间持续。
答案 3 :(得分:2)
尽管APEX添加了USE_APPLICATION_DATE_FORMAT列,但此新代码仍能正常运行。请注意,在代码底部附近,p_seq设置为“35”。
Declare
v_date date;
BEGIN
SELECT SYSDATE INTO v_date FROM Dual;
APEX_COLLECTION.ADD_MEMBER(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'C036',
p_c002 => 'UPLOAD_DTE');
APEX_COLLECTION.MOVE_MEMBER_DOWN(
p_collection_name =>'PARSE_COL_HEAD',
p_seq => '36');
FOR UPLOAD_ROW IN (SELECT SEQ_ID FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '35',
p_attr_value => v_date);
END LOOP;
END;
答案 4 :(得分:1)
对于Oracle APEX数据加载器4.2,在开发人员视图中,查看第1页,页面处理'阻止,右键单击"处理"并选择"添加新流程" ,然后命名。我的名为' add_column',然后添加以下代码。
您需要先向APEX集合添加新列。你可以做APEX_COLLECTION.ADD_MEMBER()函数。在下面的代码中,我在第31列位置添加了一个额外的列,并且列的名称被称为' FILE_DATE'。这与作为数据库表列的名称相同。
之后,您通过SEQ_ID遍历每一行,并使用值更新第31列。就我而言,我想获取文件名,即:P25_FILE_NAME
当您运行这些页面时,您可以点击“会话”'在底部的开发人员工具栏上,查看APEX集合数组,看看您的列是否正确填充。
BEGIN
APEX_COLLECTION.ADD_MEMBER
(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'C031',
p_c002 => 'FILE_DATE');
FOR UPLOAD_ROW IN (SELECT SEQ_ID FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '31',
p_attr_value => :P25_FILE_NAME
);
END LOOP;
END;
答案 5 :(得分:0)
我可以使用以下代码完成它:
Declare
v_count number(10);
BEGIN
APEX_COLLECTION.ADD_MEMBER(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'SESSION_ID');
v_count:=APEX_COLLECTION.COLLECTION_MEMBER_COUNT ('PARSE_COL_HEAD');
v_count:=v_count+1;
FOR UPLOAD_ROW IN (SELECT SEQ_ID
FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => v_count,
p_attr_value => V('APP_SESSION')); –-I was trying to load session id
END LOOP;
END;
答案 6 :(得分:0)
所以它现在是2017年和APEX 5.0.4.00.12数据加载向导有一个新奇怪的功能。如果您在上传中包含日期字段,那么您的PARSE_COL_HEAD集合中已添加了一个额外的列,C001 = USE_APPLICATION_DATE_FORMAT,C002 = E.此" E"列名显示在表映射页中,而不是您尝试添加的新列。如果你选择/映射你的别名文件上传正确(使用上面的Tikkaty'例子),但是" E"远非用户友好。就我而言," E"在第35栏中显示,并且添加的列I必须是第36列。
睡觉之后,我在这里修理它:
Declare
v_date date;
BEGIN
SELECT SYSDATE INTO v_date FROM Dual;
APEX_COLLECTION.ADD_MEMBER(
p_collection_name => 'PARSE_COL_HEAD',
p_c001 => 'C036',
p_c002 => 'UPLOAD_DTE');
APEX_COLLECTION.MOVE_MEMBER_DOWN(
p_collection_name =>'PARSE_COL_HEAD',
p_seq => '36');
FOR UPLOAD_ROW IN (SELECT SEQ_ID FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'SPREADSHEET_CONTENT')
LOOP
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE (
p_collection_name => 'SPREADSHEET_CONTENT',
p_seq => UPLOAD_ROW.SEQ_ID,
p_attr_number => '35',
p_attr_value => v_date);
END LOOP;
END;