PL / SQL项目列表,检查记录是否存在,如果是,则更新如果不创建

时间:2016-07-22 14:59:32

标签: plsql sql-update

我正在尝试学习PL / SQL,并且我获得了一项我不确定如何解决的任务。

我收到一份订单清单。我想以下列方式检查每个ORDER表:

  1. 检查订单是否存在,如果没有创建记录
  2. 检查订单是否已满(0或1)
  3. 如果订单未满(0),请更新为1
  4. 我整理了一个脚本,我认为可以为一个订单执行此操作,但我确定它不是很好:

    DECLARE
    tmp NUMBER;
    tmp2 NUMBER;
    o_id NUMBER := 999;
    
    BEGIN
    
    /*Checking if order exists */
      SELECT COUNT (*)
        INTO tmp
          FROM ORDERS
      WHERE ORDERID = o_id;               
    
      IF ( tmp = 0 ) THEN
     /* INSERT HERE */
      END IF;
    
      SELECT FULLFILLED INTO tmp2
      FROM ORDERS
      WHERE ORDERID = o_id;
    
    
      IF (tmp2 = 0) THEN
     /* UPDATE... */
    
      END IF;
    
    end;
    

    我很感激任何建议,我应该考虑什么来使这个脚本有效?谢谢。

2 个答案:

答案 0 :(得分:0)

请阅读合并声明:https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm

也称为" upsert"。基本上如果该行不存在,请插入。如果是,请更新。

它会在一个声明中做你想做的事。

答案 1 :(得分:0)

@ECHO ON ::// Minus days is the number of days to subtract from the CURRENT DAY i.e. 2 for minus 2 days or 99999 for minus 99999 days from when it's run SET MinusDay=2 :: This calls the temp vbs script routine that will be used to set YYYY-MM-DD values for the subtracted days date you specify CALL :DynamicVBSScriptBuild FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS%"') DO SET YYYY=%%A FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS%"') DO SET MM=%%A FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS%"') DO SET DD=%%A ::// Set your web server log file path in the below variable SET WebServerLogPath=C:\WebServer\Logs ::// Set web server log file name where YYYY MM DD variables are set to the values after the day numbers setup above are subtracted SET YYYY=%YYYY% SET MM=%MM% SET DD=%DD% ECHO %YYYY%%MM%%DD% PAUSE GOTO EOF :DynamicVBSScriptBuild SET YYYYTmpVBS=%temp%\~tmp_yyyy.vbs SET MMTmpVBS=%temp%\~tmp_mm.vbs SET DDTmpVBS=%temp%\~tmp_dd.vbs IF EXIST "%YYYYTmpVBS%" DEL /Q /F "%YYYYTmpVBS%" IF EXIST "%MMTmpVBS%" DEL /Q /F "%MMTmpVBS%" IF EXIST "%DDTmpVBS%" DEL /Q /F "%DDTmpVBS%" ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%YYYYTmpVBS%" ECHO yyyy = Year(dt) >> "%YYYYTmpVBS%" ECHO WScript.Echo yyyy >> "%YYYYTmpVBS%" ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%MMTmpVBS%" ECHO mm = Right("0" ^& Month(dt),2) >> "%MMTmpVBS%" ECHO WScript.Echo mm >> "%MMTmpVBS%" ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%DDTmpVBS%" ECHO dd = Right("0" ^& Day(dt),2) >> "%DDTmpVBS%" ECHO WScript.Echo dd >> "%DDTmpVBS%" GOTO EOF 声明就是您所需要的。它基于MERGE声明,并使用SELECT条款让您UPDATEINSERT数据。以下是一些很好的解释:Oracle Base MERGE Statement

这里还有一些你可能会觉得有用的代码片段:

WHEN (NOT) MATCHED THEN