Sql 在oracle中同时选择和更新表
我们正在尝试选择表中的一些记录,这些记录是3列组合的最新记录。 除此之外,我们还必须更新列组合中非最新的记录 请参阅我们的数据如下: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
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行的活动状态。考虑到这些,在我的需求中,我觉得拥有自主事务是可以的。我只更新重复的行,而不更新最新的行。所以对我来说应该没问题。