想要通过加入 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 错误

支持加入表。(Oracle Apex 的新功能)

Oracle - 在没有触发器的情况下更新表时出现“表正在变异,触发器/函数可能看不到它”错误

使用 AND 运算符的 Oracle 更新问题

SQL_BIG_SELECTS 错误

[SQL]Oracle ORA-01555快照过旧的错误