我的PL / SQL过程中有代码片段,它执行以下操作:
INSERT INTO payment_operations (id, subscriber, amount, description) VALUES (payment_id, 1234, 5, 'Test');
COMMIT;
SELECT subscriber INTO test_subscriber FROM payment_operations_view WHERE id = payment_id;
在此之后我得到一个例外“no_data_found”!但是,如果我在运行程序后自己执行相同的SELECT语句,则会看到记录。
请注意,我从视图中进行选择,而不是直接从表中进行选择。为什么我在插入后无法立即看到这些数据?
答案 0 :(得分:7)
这是预感:
payment_options
表格是否有列payment_id
?
我问,因为在下面的语句中,在PL / SQL中,如果payment_id作为列存在,那么该列将被使用而不是本地PL / SQL变量:
SELECT subscriber
INTO test_subscriber
FROM payment_operations_view
WHERE id = payment_id;
由于它使用payment_id
列,如果它存在,并且因为它未在插入中设置,您可能正在执行where id = null
,它永远不会计算为真。
我使用v_来表示变量。所以你的代码片段会变成(其余的程序会相应改变):
INSERT INTO payment_operations (id, subscriber, amount, description)
VALUES (v_payment_id, 1234, 5, 'Test');
COMMIT;
SELECT subscriber
INTO v_test_subscriber
FROM payment_operations_view WHERE id = v_payment_id;
答案 1 :(得分:0)
看起来您所指的视图是“物化”视图。如果是,请在获取数据之前尝试使用此代码段手动刷新视图:
...
INSERT INTO payment_operations (id, subscriber, amount, description) VALUES (payment_id, 1234, 5, 'Test');
COMMIT;
DBMS_SNAPSHOT.REFRESH( 'payment_operations_view','c');
SELECT subscriber INTO test_subscriber FROM payment_operations_view WHERE id = payment_id;
DBMS_OUTPUT.PUT_LINE('--> ' || test_subscriber);
...
希望这有帮助。
答案 2 :(得分:0)
您正在插入基表,然后从视图中进行选择。视图是否有任何过滤条件?如果是这样,您插入的数据可能与视图的条件不匹配。
正如其他人所指出的,视图也可能是物化视图,在这种情况下可能需要刷新。
我不得不问......为什么逻辑需要选择你刚刚插入的数据?除非你期望其他东西修改了INSERT和SELECT之间的数据,为什么不只是使用你刚刚插入的subscriber
值而不是查询来再次获取它?
答案 3 :(得分:-1)
在insert语句后显式提交并检查。
对我而言,在插入后实际发生提交之前,似乎正在运行select语句。