APEX数据加载 - 以编程方式添加列

时间:2014-01-27 16:40:27

标签: oracle-apex

我正在尝试使用APEX数据加载器来允许用户导入数据和其中一个列值,我宁愿不强迫用户提供,因为当用户选择导入时,会话中的值随时可用。是那里一种以编程方式添加该列值的方法?

7 个答案:

答案 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',然后添加以下代码。enter image description here

您需要先向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;