我正在试图弄清楚如何获得运行此查询时更新了哪些记录的输出:
UPDATE CSR.TARGET ces
SET (STATUS_CODE, COMPLETE_DATE, DATA) =
(SELECT 'ERROR', '', REPLACE(c.Data, ' x</csr', '</csr')
FROM CSR.TARGET C
WHERE (c.EID = ces.EID)
AND c.STATUS_CODE = 'ERROR')
WHERE EXISTS (SELECT 1
FROM CSR.TARGET C
WHERE (c.EID = ces.EID)
AND c.STATUS_CODE = 'ERROR')
如果有3条记录由上述查询更新,那么我想知道它们是什么(记录ID等)。我该怎么做?
目前它只是告诉我3条记录已更新,就是这样。没有其他细节。
任何帮助都会很棒!谢谢:o)
更新
我需要这个用于使用VB.net的查询,所以我不认为我可以做PL / SQL类型的事情?
Dim OracleCommand As New OracleCommand()
Dim ra As Integer
OracleCommand = New OracleCommand("UPDATE CSR.TARGET ces " & _
"SET (STATUS_CODE, COMPLETE_DATE, DATA) = " & _
"(SELECT 'ERROR', '', REPLACE(c.Data, ' x</csr', '</csr') " & _
"FROM CSR.TARGET C " & _
"WHERE (c.EID = ces.EID) " & _
"AND c.STATUS_CODE = 'ERROR') " & _
"WHERE EXISTS (SELECT 1 " & _
"FROM CSR.TARGET C " & _
"WHERE (c.EID = ces.EID) " & _
"AND c.STATUS_CODE = 'ERROR')", OracleConnection)
Try
ra = OracleCommand.ExecuteNonQuery()
OracleConnection.Close()
....
大卫
答案 0 :(得分:1)
您应该能够使用RETURNING子句。假设EID
列是您所指的“记录ID”并且它是数字
CREATE OR REPLACE TYPE num_tbl
IS
TABLE OF NUMBER;
DECLARE
l_modified_eids num_tbl;
BEGIN
UPDATE csr.target ces
SET <<omitted>>
WHERE <<omitted>>
RETURNING eid
BULK COLLECT INTO l_modified_eids;
<<Iterate through l_modified_eids to see which rows are modified>>
END;
答案 1 :(得分:0)
根据我对该查询的读取,所有具有与status_code为“ERROR”的记录的EID相匹配的EID的记录都将被更新。所以如果你有这样的表:
ID EID STATUS_CODE
-- --- -----------
1 1 ERROR
2 1 OKAY
3 2 OKAY
ID 1和2的两个记录都会更新,因为2的EID字段与1的EID字段匹配,1的EID字段显示错误。更新时,它总是使用“ERROR”行中的数据。