我有一个包含一些数据的交互式网格,当用户添加新行时,它没有显示(发现这是因为我编写了一个自定义过程来保存并且没有返回PK)。
因此,我在服务器端条件为Save [Interactive Grid]上设置了一个动态操作,类型为:未显示内联验证错误,并具有真正的刷新区域操作。
但这种情况确实有效。 当添加通过验证的行时,刷新会很好,但是当添加未通过验证的行时,会显示验证错误,并弹出一个对话框,询问我是否确定要继续进行更改(请尝试刷新)
我尝试将条件更改为显示的“内联验证错误”,但确实可行。我试图将事件范围更改为动态(我什至不知道它的作用),但这没有帮助。
如果这可能有助于自定义保存过程,我还将IG主键从表的默认PK更改为ROWID。
我宁愿不编辑保存过程来解决此问题,好像我需要修复很多保存过程一样。但是,如果我不能,我愿意修复它们。但我不确定如何。 我的保存过程的格式如下:
PROCEDURE save_table (s_variable1 IN table.variable1%TYPE
, s_variable2 IN table.variable2%TYPE
, row_status IN VARCHAR2)IS
BEGIN
CASE row_status
WHEN 'C' THEN
INSERT INTO table(variable1, variable2)
VALUES (variable1_seq.nextval, s_variable2);
WHEN 'U' THEN
UPDATE table
SET variable2= s_variable2
WHERE variable1= s_variable1;
WHEN 'D' THEN
DELETE FROM table
WHERE variable1= s_variable1;
END CASE;
END save_table;
如果有人可以告诉我最简单的方法来解决此问题,以返回PK(variable1)或ROWID,以便IG更新这一行,那么我什至不需要动态动作。
编辑: 找到最简单的方法是更改程序并找出方法:
PROCEDURE save_table (s_variable1 IN OUT table.variable1%TYPE
, s_variable2 IN table.variable2%TYPE
, row_status IN VARCHAR2)IS
a_variable1 table.variable1%TYPE;
BEGIN
CASE row_status
WHEN 'C' THEN
a_variable1 := variable1_seq.nextval;
INSERT INTO table(variable1, variable2)
VALUES (a_variable1, s_variable2)
RETURNING a_variable1 INTO s_variable1;
仅发布我更改的部分。
答案 0 :(得分:0)
RETURNING INTO子句允许我们返回受DML语句影响的行的列值。您可以在过程中使用它来返回列值,如下所示。
DECLARE
l_id t1.id%TYPE;
BEGIN
INSERT INTO t1 VALUES (t1_seq.nextval, 'FOUR')
RETURNING id INTO l_id;
COMMIT;
DBMS_OUTPUT.put_line('ID=' || l_id);
END;