Sql 在oracle中同时选择和更新表

Sql 在oracle中同时选择和更新表,sql,oracle,Sql,Oracle,我们正在尝试选择表中的一些记录,这些记录是3列组合的最新记录。 除此之外,我们还必须更新列组合中非最新的记录 请参阅我们的数据如下: SELECT * FROM TEST_RECORDS ORA-14551: cannot perform a DML operation inside a query ORA-06512: at line 9 ORA-06512: at line 20 下面是我们正在使用的查询 WITH FUNCTION UPDATEDUPLICATES(P_ACCOUN

我们正在尝试选择表中的一些记录,这些记录是3列组合的最新记录。 除此之外,我们还必须更新列组合中非最新的记录

请参阅我们的数据如下:

SELECT * FROM TEST_RECORDS
ORA-14551: cannot perform a DML operation inside a query 
ORA-06512: at line 9
ORA-06512: at line 20

下面是我们正在使用的查询

WITH FUNCTION UPDATEDUPLICATES(P_ACCOUNT VARCHAR2,
                               P_CCAID VARCHAR2,
                               P_REQSEQ NUMBER,
                               P_RANK NUMBER ) 
                               RETURN NUMBER IS
BEGIN
if P_RANK > 1
  THEN
  UPDATE TEST_RECORDS
     SET DOMAIN_ID = 2
   WHERE ACCOUNT_NUM = P_ACCOUNT
     AND CCAID = P_CCAID
     AND REQUEST_SEQ = P_REQSEQ;
     RETURN 1;
     ELSE
       RETURN 0;
END IF;

END;
RANKED_RECORDS AS(
  SELECT SR.*,
         RANK() OVER(PARTITION BY 
         ACCOUNT_NUM, 
         CUSTOMER_REF, 
         CCAID ORDER BY REQUEST_DTM DESC) R_RANK
    FROM TEST_RECORDS SR), 
UPDATESELECTED AS (
SELECT RR.*,UPDATEDUPLICATES(
                        RR.ACCOUNT_NUM,
                        RR.CCAID,
                        RR.REQUEST_SEQ,
                        RR.R_RANK
                       ) update_status
                       FROM RANKED_RECORDS RR
                  )
SELECT * FROM UPDATESELECTED;
但此查询引发如下错误:

SELECT * FROM TEST_RECORDS
ORA-14551: cannot perform a DML operation inside a query 
ORA-06512: at line 9
ORA-06512: at line 20

我这样做可能是错误的,如果是,任何一个ne都可以告诉我如何同时进行选择和更新。

功能,除非自主事务(这也意味着它必须提交)不能执行DML(如错误所述)。我不建议让它成为一个自主交易


怎么办?编写一个过程并更新行。

我按照Mohd的建议尝试了以下方法。以及它的工作原理

WITH FUNCTION UPDATEDUPLICATES(P_ACCOUNT VARCHAR2,
                               P_CCAID VARCHAR2,
                               P_REQSEQ NUMBER,
                               P_RANK NUMBER ) 
                               RETURN NUMBER IS
PRAGMA AUTONOMOUS_TRANSACTION;                               
BEGIN
if P_RANK > 1
  THEN
  UPDATE TEST_RECORDS
     SET DOMAIN_ID = 2
   WHERE ACCOUNT_NUM = P_ACCOUNT
     AND CCAID = P_CCAID
     AND REQUEST_SEQ = P_REQSEQ;
     commit;
     RETURN 1;
     ELSE
       RETURN 0;
END IF;

END;
RANKED_RECORDS AS(
  SELECT SR.*,
         RANK() OVER(PARTITION BY 
         ACCOUNT_NUM, 
         CUSTOMER_REF, 
         CCAID ORDER BY REQUEST_DTM DESC) R_RANK
    FROM TEST_RECORDS SR), 
UPDATESELECTED AS (
SELECT RR.*,UPDATEDUPLICATES(
                        RR.ACCOUNT_NUM,
                        RR.CCAID,
                        RR.REQUEST_SEQ,
                        RR.R_RANK
                       ) update_status
                       FROM RANKED_RECORDS RR
                  )
SELECT * FROM UPDATESELECTED

您应该首先更新记录,然后选择它,或者以其他方式将您的函数声明为
PRAGMA autonomy_TRANSACTION
我可以知道拥有一个自治事务有什么问题吗?理想情况下,我想更新的记录只是过时的记录。它在函数中提交事务,但不是“主”事务。如果出现问题,您会遇到问题,因为有些行已更新(并提交),而有些行未更新,谁知道自治事务之外发生了什么。。。它们有它们的用途——也许你的案例就是其中之一。只是要小心,因为你可能会解决一个问题,导致更大的问题。是的。理解。但在我的逻辑中,即使在更新了1行之后,我仍然保持1行的活动状态。考虑到这些,在我的需求中,我觉得拥有自主事务是可以的。我只更新重复的行,而不更新最新的行。所以对我来说应该没问题。