想要通过加入 oracle 更新表显示错误
Posted
技术标签:
【中文标题】想要通过加入 oracle 更新表显示错误【英文标题】:Want to update a table With join in oracle showing error 【发布时间】:2017-03-01 06:26:22 【问题描述】:使用显示错误的合并更新更新表请建议
merge into IP_CO_WR2_USR.customer_tranching_data trn
using
(Select distinct( trnx.cdb) , mig.EFFECTIVE_DATE EFFECTIVE_DATE
from SCVSTAGE.account_migration mig,
SCVSTAGE.customer_details dtls,
IP_CO_WR2_USR.customer_tranching_data trnx
where mig.EFFECTIVE_DATE <='13-MAR-17'
and dtls.PLATFORM='SONATA'
and dtls.cdb=mig.cdb_number
and trnx.cdb=dtls.cdb ) x
on (x.cdb = trn.cdb)
when matched then
update
set trn.LAST_SENT_DATE= x.EFFECTIVE_DATE,
trn.NEXT_DUE_DATE='07-SEP-17';
请建议内部子查询使用单独运行。
SQL Error: ORA-30926: unable to get a stable set of rows in the source tables
30926. 00000 - "unable to get a stable set of rows in the source tables"
*Cause: A stable set of rows could not be got because of large dml
activity or a non-deterministic where clause.
*Action: Remove any non-deterministic where clauses and reissue the dml.
【问题讨论】:
除了按照链接问题中的说明进行操作之外,您是否尝试过其他任何方法? 为什么你不喜欢建议的 PL/SQL 答案? 你接受了这个答案。除了令人费解的delete from my_data_backup
(这是一个奇怪的存档策略)之外,它似乎满足您的要求。那么您有什么额外要求?
使用合并 sql 是不可能的。实际上我的要求是我必须在不使用 plsql 的情况下进行归档,所以在没有 plsql 和独立查询执行的情况下还有其他方法吗?
@Nitish- 我已经尝试使用合并 sql、plsql 匿名块和使用 plsql 块的 proc。使用合并 sql 是不可能的,plsql 块运行良好,但我想知道在我的场景中是否还有其他 tha plsql 块的可能性。
【参考方案1】:
据我了解,您面临的困难是在 JAVA 中使用该 PLSQL 单元。一种可以简化您的生活的粗略方式。
正如解释的那样,MERGE 并非全部推荐用于操作源表。在这里,我定义了一个函数并通过 SQL 查询调用它。希望这会有所帮助。
CREATE TABLE MY_DATE AS
SELECT level col1,level||'Av' col2 FROM dual CONNECT BY level < 11;
CREATE TABLE MY_DATE_backup AS
SELECT level COL1,level||'Av' COL2 FROM DUAL CONNECT BY level < 11 AND 1 = 2;
CREATE OR REPLACE
FUNCTION BACKUP_FUNCTION
RETURN NUMBER
AS
pragma AUTONOMOUS_TRANSACTION;
BEGIN
BEGIN
INSERT INTO MY_DATE_BACKUP
SELECT * FROM MY_DATE;
DELETE MY_DATE;
COMMIT;
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END;
END;
SELECT * FROM my_date;
SELECT * FROM my_date_backup;
SELECT BACKUP_FUNCTION FROM dual; -- Function Calling
【讨论】:
嗨 Avrajit,我对你的解决方案很好,我使用过程而不是函数,但两者都在其中使用 plsql 块,我是 oracle 的新手,有没有其他方法可以在没有 plsql 的情况下做到这一点,做你不知道!以上是关于想要通过加入 oracle 更新表显示错误的主要内容,如果未能解决你的问题,请参考以下文章
更新表时 cx_Oracle 执行/executemany 错误