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