更新语句oracle - ORA-00933: SQL命令未正确结束

8 浏览
0 Comments

更新语句oracle - ORA-00933: SQL命令未正确结束

运行这个更新命令时遇到了一些问题。我一直在收到错误消息“ORA-00933: SQL命令未正确结束”。有人能帮助我确保这个命令正确吗?目前的命令如下:

谢谢,

乔治

UPDATE    A
SET             EARLIEST_STARTDATE =  CASE WHEN (DATE_SUBMITTED <     TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY'))
                                                                            THEN TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY')
                                                                            ELSE TO_DATE(DATE_SUBMITTED,'DD/MM/YY') END 
FROM        TABLE1 A
                 INNER JOIN TABLE2 C on A.ID = C.ID                                      
WHERE     (EARLIEST_STARTDATE IS NULL) AND 
                (A.WS_ELIGIBILITY_STATUS = 1) AND 
                (A.CLAIM_ADD_CRITERIA_FLAG = 'N' OR A.CAF = 'Y' or A.CCA_CODE = 'SC' AND A.CLAIM_ADD_CRITERIA_FLAG = 'Y') AND 
                (ADD_MONTHS(C.DOB, 24) BETWEEN TO_DATE('01/01/' || EXTRACT(YEAR FROM ADD_MONTHS(C.DOB, 24)),'DD/MM/YYYY') AND TO_DATE('31/03/' || EXTRACT(YEAR FROM ADD_MONTHS(C.DOB, 24)),'DD/MM/YYYY'))

0
0 Comments

在这个例子中,出现了"ORA-00933: SQL command not properly ended"错误。这个错误是因为在更新语句中使用了FROM子句和JOIN子句,而Oracle不支持在更新语句中使用这些子句。

为了解决这个问题,我们需要修改更新语句,删除FROM子句和JOIN子句,并通过添加适当的条件来关联子查询和正在更新的行。具体来说,可以通过使用主键列(在这个例子中可能是a.cid列)来关联子查询,以确保每个更新只涉及到一行。

下面是修改后的更新语句:

UPDATE A
SET EARLIEST_STARTDATE =  
(SELECT 
CASE WHEN (DATE_SUBMITTED < TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY'))
THEN TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY')
ELSE TO_DATE(DATE_SUBMITTED,'DD/MM/YY') END 
FROM TABLE1 A
WHERE (EARLIEST_STARTDATE IS NULL) AND 
(A.WS_ELIGIBILITY_STATUS = 1) AND 
(A.CLAIM_ADD_CRITERIA_FLAG = 'N' OR A.CAF = 'Y' or A.CCA_CODE = 'SC' AND A.CLAIM_ADD_CRITERIA_FLAG = 'Y') AND 
(ADD_MONTHS(A.DOB, 24) BETWEEN TO_DATE('01/01/' || EXTRACT(YEAR FROM ADD_MONTHS(A.DOB, 24)),'DD/MM/YYYY') AND TO_DATE('31/03/' || EXTRACT(YEAR FROM ADD_MONTHS(A.DOB, 24)),'DD/MM/YYYY')))

通过这样修改后的更新语句,我们就可以避免"ORA-00933: SQL command not properly ended"错误,并且确保每次更新只涉及到一行。

0
0 Comments

问题出现的原因是Oracle不允许在更新语句中使用连接操作。需要使用相关子查询来实现。解决方法是将连接操作改为相关子查询,如下所示:

UPDATE TABLE1 TOP_A
SET EARLIEST_STARTDATE = (
  SELECT CASE WHEN DATE_SUBMITTED <
      TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)), 'DD/MM/YYYY')
    THEN TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY')
    ELSE TO_DATE(DATE_SUBMITTED,'DD/MM/YY') END
  FROM TABLE1 SUB_A
  INNER JOIN TABLE2 SUB_C on SUB_A.ID = SUB_C.ID
  WHERE SUB_A.ID = TOP_A.ID
  AND ADD_MONTHS(SUB_C.DOB, 24) BETWEEN
    TO_DATE('01/01/' || EXTRACT(YEAR FROM ADD_MONTHS(SUB_C.DOB, 24)),'DD/MM/YYYY')
      AND TO_DATE('31/03/' || EXTRACT(YEAR FROM ADD_MONTHS(SUB_C.DOB, 24)),'DD/MM/YYYY')
)
WHERE EARLIEST_STARTDATE IS NULL
AND WS_ELIGIBILITY_STATUS = 1
AND (CLAIM_ADD_CRITERIA_FLAG = 'N' OR CAF = 'Y' OR (CCA_CODE = 'SC' AND CLAIM_ADD_CRITERIA_FLAG = 'Y'))
/

这个解决方法假设`TABLE1.ID`是唯一的。子查询在两个表之间进行连接,并且通过`WHERE SUB_A.ID = TOP_A.ID`子句与正在更新的行相关联。

你的AND/OR部分有点不清楚,所以你可能需要重新考虑括号的使用,以获得正确的布尔结果以满足业务需求。

在`CASE`的`ELSE`部分,`TO_DATE(DATE_SUBMITTED,'DD/MM/YY')`看起来有些可疑。如果`DATE_SUBMITTED`已经是一个日期类型,那么直接引用它,不需要调用`TO_DATE()`。你正在进行一个隐式的转换为字符串,然后再进行转换;由于使用了YY模式,可能会丢失日期的世纪信息。

另外,日期处理部分也可以简化。

0