在PL / SQL过程中提交后无法找到数据?

时间:2009-12-07 20:39:01

标签: sql oracle

我的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语句,则会看到记录。

请注意,我从视图中进行选择,而不是直接从表中进行选择。为什么我在插入后无法立即看到这些数据?

4 个答案:

答案 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语句。