Oracle Forms - 提交单个SQL语句而不是整个表单

时间:2011-06-24 16:08:28

标签: oracle plsql oracleforms

我正在开发一个在单个画布上有两个块的Oracle Form(10g)。顶部块称为QUERY_BLOCK,用户填写该行以用数据行填充PRICING_BLOCK。

但是,在QUERY_BLOCK中我还有一个复选框,需要分别对数据库执行INSERT和DELETE。我的WHEN-CHECKBOX-CHANGED触发器如下所示:

begin
    if :query_block.profile_code is not null then

        if :query_block.CHECKBOX_FLAG = 'Y' then
            begin
                INSERT INTO profile_table VALUES ('Y', :query_block.profile_code);
            end;
        else
            begin
                DELETE FROM profile_table WHERE profile_code = :query_block.profile_code and profile_type_code = 'FR';
            end;
        end if;
    end if;
end;

我知道我需要在这里添加一些提交语句,否则记录锁定并没有实际发生。但是,如果我做一个COMMIT;然后整个表单经过验证并更新任何更改的行。

如何在不更新表格的情况下执行这些单行查询?

1 个答案:

答案 0 :(得分:2)

在没有评论其实际智慧的情况下,您可以在数据库中创建执行autonomous transaction的过程:

CREATE OR REPLACE FUNCTION my_fnc(p_flag IN VARCHAR2) 
  RETURN VARCHAR2 IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  IF p_flag = 'Y' THEN
    INSERT...
  ELSE
    DELETE...
  END IF;
  COMMIT;
  RETURN 'SUCCESS';
EXCPTION
  WHEN OTHERS THEN
    RETURN 'FAIL';
END;    

您的表单代码可能如下所示:

begin
    if :query_block.profile_code is not null then
      stat := my_fnc(:query_block.CHECKBOX_FLAG);
    end if;
end;

这允许您的函数独立于调用事务进行提交。但请注意这一点 - 如果您的外部事务必须回滚,则仍将提交自治事务。我认为应该有一种交易方式来做你需要做的事情来解决你的锁定问题,这可能是更好的方法。在不知道你的过程细节的情况下,我无法分辨。一般而言,无论事务是提交还是回退(例如,记录),都必须进行更新时使用自治事务。