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

在PL/SQL过程中提交后找不到数据?,sql,oracle,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; 在此之后,我得到一个异常“没有

我的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;
在此之后,我得到一个异常“没有找到数据”!但是,如果在运行该过程后我自己执行相同的SELECT语句,则会看到该记录


请注意,我是从视图中选择的,而不是直接从表中选择的。为什么插入后无法立即查看此数据?

在insert语句后显式放置commit并进行检查


在我看来,select语句似乎是在insert之后实际发生提交之前运行的。

看起来您所指的视图是一个“物化”视图。如果是,请在获取数据之前尝试此代码段手动刷新视图:

...
    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);

...
希望这有帮助。

这是一种预感:

payment\u options
表是否有列
payment\u id

我这样问是因为在下面的语句中,在PL/SQL中,如果payment_id作为一个列存在,那么该列将被使用,而不是本地PL/SQL变量:

SELECT subscriber 
INTO test_subscriber 
FROM payment_operations_view 
WHERE id = payment_id;
因为它使用的是
payment\u id
列(如果存在),并且因为它没有在insert中设置,所以您可能正在执行
操作,其中id=null
的计算结果永远不会为true

我用v_u表示变量。因此,您的代码片段将变为(与过程的其余部分相应地更改):


您将插入到基表中,然后从视图中进行选择。视图是否具有任何过滤条件?如果是这样,那么您插入的数据可能与视图的条件不匹配

正如其他人所指出的,视图也可能是物化视图,在这种情况下,它可能需要刷新


我不得不问。。。为什么逻辑要求选择刚插入的数据?除非您希望有其他东西修改插入和选择之间的数据,为什么不使用刚才插入的
订户
值而不是查询以再次获取它?

我的理解是,Oracle的默认隔离级别允许选择在提交之前的数据达到峰值。代码背后的想法是可以的,但是您的语句“如果我执行相同的SELECT语句…”让我怀疑您是否对PL/SQL变量和列名称有一些混淆-视图中是否有一个名为payment_id的列?您使用的是默认事务隔离级别?这是“标准”视图还是物化视图?@Rajat:COMMIT在INSERT和SELECT语句之间。即使他没有包含COMMIT,那也不是问题所在。
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;