我有一个带有一些数据的交互式网格,当用户添加一个它没有显示的新行时(发现这是因为我编写了一个自定义程序来保存而我不返回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;
只发布了我更改的部分。
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;