我正在开发一个在单个画布上有两个块的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;然后整个表单经过验证并更新任何更改的行。
如何在不更新表格的情况下执行这些单行查询?
答案 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;
这允许您的函数独立于调用事务进行提交。但请注意这一点 - 如果您的外部事务必须回滚,则仍将提交自治事务。我认为应该有一种交易方式来做你需要做的事情来解决你的锁定问题,这可能是更好的方法。在不知道你的过程细节的情况下,我无法分辨。一般而言,无论事务是提交还是回退(例如,记录),都必须进行更新时使用自治事务。