簡體   English   中英

Oracle SQL MERGE 查詢缺少關鍵字問題

[英]Oracle SQL MERGE query missing keyword issue

不知道我在這里缺少什么關鍵字..從互聯網上的各種示例和看起來正確的文檔..非常感謝任何幫助。 難道是因為 Oracle 不支持嵌套的 MERGE 語句?

輸入是:

workflowId='CHILD1'
processName='TEST4'
sectionId=''
dependsOnWorkflowId='PARENT1'
dependsOnProcessName='TEST4'
dependsOnSectionId=''

查詢是

  MERGE INTO WF_CMN_A_PROCESS_DEPENDENCY_TREE_TEST3 USING DUAL 
  ON (    "WORKFLOW_ID"             = :workflowId
      AND "PROCESS_NAME"            = :processName
      AND NVL("SECTION_ID", '-')    = NVL(:sectionId, '-')
    )
  -- Root node exists, create a parent-child link and delete the root node
  WHEN MATCHED THEN UPDATE SET 
      "DEPENDS_ON_WORKFLOW_ID" = :dependsOnWorkflowId,
      "DEPENDS_ON_PROCESS_NAME"= :dependsOnProcessName,
      "DEPENDS_ON_SECTION_ID"  = :dependsOnSectionId,
      "LAST_UPDT_DT_TM"        = SYSDATE
    WHERE 
            "WORKFLOW_ID"             = :workflowId
        AND "PROCESS_NAME"            = :processName
        AND NVL("SECTION_ID", '-')    = NVL(:sectionId, '-')
        AND "DEPENDS_ON_WORKFLOW_ID"  IS NULL 
        AND "DEPENDS_ON_PROCESS_NAME" IS NULL 
        AND "DEPENDS_ON_SECTION_ID"   IS NULL 
        
  WHEN NOT MATCHED THEN 
      MERGE INTO WF_CMN_A_PROCESS_DEPENDENCY_TREE_TEST3 USING DUAL 
      ON (  "WORKFLOW_ID"                      = :workflowId
        AND "PROCESS_NAME"                     = :processName
        AND NVL("SECTION_ID", '-')             = NVL(:sectionId, '-')
        AND NVL("DEPENDS_ON_WORKFLOW_ID" ,'-') = NVL(:dependsOnWorkflowId , '-')
        AND NVL("DEPENDS_ON_PROCESS_NAME",'-') = NVL(:dependsOnProcessName, '-')
        AND NVL("DEPENDS_ON_SECTION_ID"  ,'-') = NVL(:dependsOnSectionId  , '-')
      )
      WHEN NOT MATCHED THEN 
      INSERT (
        "WORKFLOW_ID",
        "PROCESS_NAME",
        "SECTION_ID",
        "DEPENDS_ON_WORKFLOW_ID",
        "DEPENDS_ON_PROCESS_NAME",
        "DEPENDS_ON_SECTION_ID",
        "LAST_UPDT_DT_TM"
      ) 
      VALUES (        
        :workflowId,
        :processName,
        :sectionId,
        :dependsOnWorkflowId,
        :dependsOnProcessName,
        :dependsOnSectionId,
        SYSDATE
      )

這是錯誤:

      org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [905] [42000]: ORA-00905: missing keyword

at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:133)
at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:544)
at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$0(SQLQueryJob.java:451)
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:171)
at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:458)
at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:847)
at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:3515)
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:118)
at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:171)
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:116)
at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:4852)
at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00905: missing keyword

MERGE 語句中不能有 MERGE。 您唯一的選擇是WHEN MATCHED THEN UPDATEWHEN NOT MATCHED THEN INSERT 我懷疑你想要類似的東西:

  MERGE INTO WF_CMN_A_PROCESS_DEPENDENCY_TREE_TEST3 USING DUAL 
  ON (    "WORKFLOW_ID"             = :workflowId
      AND "PROCESS_NAME"            = :processName
      AND NVL("SECTION_ID", '-')    = NVL(:sectionId, '-')
    )
  -- Root node exists, create a parent-child link and delete the root node
  WHEN MATCHED THEN UPDATE SET 
      "DEPENDS_ON_WORKFLOW_ID" = :dependsOnWorkflowId,
      "DEPENDS_ON_PROCESS_NAME"= :dependsOnProcessName,
      "DEPENDS_ON_SECTION_ID"  = :dependsOnSectionId,
      "LAST_UPDT_DT_TM"        = SYSDATE
    WHERE 
            "WORKFLOW_ID"             = :workflowId
        AND "PROCESS_NAME"            = :processName
        AND NVL("SECTION_ID", '-')    = NVL(:sectionId, '-')
        AND "DEPENDS_ON_WORKFLOW_ID"  IS NULL 
        AND "DEPENDS_ON_PROCESS_NAME" IS NULL 
        AND "DEPENDS_ON_SECTION_ID"   IS NULL 
        
  WHEN NOT MATCHED THEN INSERT (
        "WORKFLOW_ID",
        "PROCESS_NAME",
        "SECTION_ID",
        "DEPENDS_ON_WORKFLOW_ID",
        "DEPENDS_ON_PROCESS_NAME",
        "DEPENDS_ON_SECTION_ID",
        "LAST_UPDT_DT_TM"
      ) 
      VALUES (        
        :workflowId,
        :processName,
        :sectionId,
        :dependsOnWorkflowId,
        :dependsOnProcessName,
        :dependsOnSectionId,
        SYSDATE
      )

雖然我確定我錯過了你正在做的一些細微差別。

MERGE 聲明文檔在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM