【问题标题】:Oracle APEX PL/SQL Procedure Debugging?Oracle APEX PL/SQL 过程调试?
【发布时间】:2017-08-29 12:57:22
【问题描述】:

我正在使用 PL/SQL 过程将之前生成的一个表插入到另一个现有表中:

INSERT INTO REI_LABOUR_COST (DEALER_NUMBER, DEALER_STATUS, BILLING_PARTNER, BSI_GW, YEAR, QUANTITY_FRU, LABOUR_EUR, LABOUR_LOCAL, REQUESTED_RATE)
select c001 as DEALER_NUMBER
     , c002 as DEALER_STATUS
     , c003 as BILLING_PARTNER
     , c004 as BSI_GW
     , c005 as YEAR
     , c006 as QUANTITY_FRU
     , c007 as LABOUR_EUR
     , c008 as LABOUR_LOCAL
     , c009 as REQUESTED_RATE
from apex_collections col
where collection_name = 'COLLECTION' and seq_id != 1
order by seq_id;

但它不起作用。没有错误消息或其他程序失败的迹象,但在最终表格中没有显示任何结果。

第一个问题,有什么迹象表明我做错了吗?

第二个问题,如果命令失败,我会在哪里看到错误消息?我可以在某处启用它吗?

【问题讨论】:

  • 运行SELECT 部分有什么收获吗?
  • 是的,我愿意。一切都按照我的计划。它会自己转换错误的类型吗?考虑到 chars 形成有效数字,将数字与 varchar 或其他方式类似?
  • 删除所有列别名是否有效?你不需要它们来插入,但我不知道它是否会导致它崩溃。
  • 尝试删除您的 ORDER BY 子句
  • 没有什么明显的错误。大概这个插入是在 APEX 页面中的页面提交过程中执行的?在调试模式下运行页面可能会在某处显示问题 - 也许进程没有被触发。

标签: sql oracle plsql insert oracle-apex


【解决方案1】:

在插入数据库之前,必须为每个成员属性更新顶点集合。

第一个 Apex 流程:在提交和计算之前

declare
    y pls_integer := 0;
    v_msg varchar2(4000);
begin
    if not apex_collection.collection_exists(p_collection_name=>'COLLECTION') then
        wwv_flow.debug('No Apex collection found!');
    else
        for x in (select * from apex_collections where collection_name = 'COLLECTION' and seq_id != 1 order by seq_id) 
        loop
           y := y+1;
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>1,p_attr_value=>wwv_flow.g_f01(y));     
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>2,p_attr_value=>wwv_flow.g_f02(y)); 
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>3,p_attr_value=>wwv_flow.g_f03(y)); 
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>4,p_attr_value=>wwv_flow.g_f04(y)); 
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>5,p_attr_value=>wwv_flow.g_f05(y)); 
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>6,p_attr_value=>wwv_flow.g_f06(y)); 
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>7,p_attr_value=>wwv_flow.g_f07(y)); 
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>8,p_attr_value=>wwv_flow.g_f08(y)); 
            apex_collection.update_member_attribute (p_collection_name=> 'COLLECTION', p_seq=> x.seq_id,p_attr_number =>9,p_attr_value=>wwv_flow.g_f09(y)); 
        end loop;   
    end if;
exception when others then
    v_msg := ''||sqlerrm;
    wwv_flow.debug('ERR: '||v_msg); 
end;

第二个 Apex 流程:提交后

declare
    v_msg varchar2(4000);
begin
    for x in (select * from apex_collections where collection_name = 'COLLECTION' and seq_id != 1 order by seq_id) 
    loop            
        begin
            INSERT INTO REI_LABOUR_COST (DEALER_NUMBER, DEALER_STATUS, BILLING_PARTNER, BSI_GW, YEAR, QUANTITY_FRU, LABOUR_EUR, LABOUR_LOCAL, REQUESTED_RATE) 
            values(x.c001, x.c002, x.c003, x.c004, x.c005, x.c006, x.c007, x.c008, x.c009);
        exception when others then
            v_msg := ''||sqlerrm;
            wwv_flow.debug('ERR_1: '||v_msg);                   
        end;
    end loop;   
exception when others then
    v_msg := ''||sqlerrm;
    wwv_flow.debug('ERR_2: '||v_msg);   
end;

【讨论】:

  • 您能解释一下为什么我需要更新收藏吗?为什么第一个流程是 On Submit,第二个流程是 After Submit?另外,我在下拉选择器中看不到 On Submit,只有 After Submit、Processing 和其他一些。
  • 收集数据由用户手动修改时很有用。我使用 Apex 4.2,并且我有 On Submit 和 Before Computation。
  • 哦,好吧,我用的是 Apex 5,可能就是这样。知道我应该选择什么吗?
【解决方案2】:

我认为您不能像那样引用 seq_id。

使用APEX_COLLECTION.DELETE_MEMBER 去掉 seq_id 1。

例如

BEGIN

 APEX_COLLECTION.DELETE_MEMBER(
 p_collection_name => 'COLLECTION',
 p_seq => '1'); 

END;

然后照常继续。

编辑 - 失败的原因是错误的数据类型错误。如果您检查调试器,您应该能够看到这一点。

【讨论】:

  • 调试器?在哪里?
  • 此外,它在没有 INSERT 部分的情况下也能正常工作,甚至标题也被我想要的隐藏了。
  • 调试器位于屏幕底部的工具栏中间。
  • 表中的所有列都是 varchar2 类型的吗?
  • seq_id 是一个数字,像OP那样在where子句中引用它没有错。
猜你喜欢
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2016-09-28
相关资源
最近更新 更多