【问题标题】:Update query in same stored procedure in Oracle在 Oracle 中的同一存储过程中更新查询
【发布时间】:2021-01-10 15:24:00
【问题描述】:

我想在同一个存储过程中为同一张表写UPDATE的逻辑。下面是我的SP。

PROCEDURE INSERT_PROJECT_MST
(
  P_PROJECTNO IN NVARCHAR2,
  P_CRNO IN NVARCHAR2,
  P_APPNAME IN NVARCHAR2,
  P_APPFUNCDESC IN NVARCHAR2,
  P_AZUREFEATNO IN NVARCHAR2,
  P_AZUREFEATDESC IN NVARCHAR2,
  P_PROJMANAGER IN NVARCHAR2,
  P_PROJLEAD IN NVARCHAR2,
  P_REQBY IN NVARCHAR2,
  P_BUSINESSCAT IN NVARCHAR2,
  P_BUSINESSUSERCAT IN NVARCHAR2,
  P_FEATUREID IN NVARCHAR2,
  P_ISMGISRNO IN NVARCHAR2,
  P_REPLICARR IN NVARCHAR2,
  P_PRODRR IN NVARCHAR2,
  P_USERSTORY IN NVARCHAR2,
  P_ASSIGNEDBY IN NVARCHAR2,
  P_ASSIGNEDTO IN NVARCHAR2,
  P_CREATEDBY IN NVARCHAR2,
  P_LASTUPDBY IN NVARCHAR2,
  TBLDATA OUT NVARCHAR2
)
AS
  
  V_PROJ_ID NUMBER:=0;
  
  BEGIN
    
   -- SELECT COUNT(MST_ID) INTO V_PROJ_ID FROM TBL_PROJECT_MST_INFO WHERE PROJECT_NO = P_PROJECTNO;
   
   INSERT INTO TBL_PROJECT_MST_INFO      
                                   (
                                          PROJECT_NO,
                                          CR_NO,
                                          APPLICATION_NAME,
                                          APP_FUNC_DESC,
                                          AZURE_FEATURE_NO,
                                          AZURE_FEATURE_DESC,
                                          PROJECT_MANAGER_NAME,
                                          PROJECT_LEAD_NAME,
                                          REQUESTED_BY,
                                          BUSINESS_CATEGORY,
                                          BUSINESS_USER_CATEGORY,
                                          RATIONAL_FEATURE_ID,
                                          ISMG_ISR_NO,
                                          REPLICA_RR,
                                          PROD_RR,
                                          USER_STORY,
                                          ASSIGNED_BY,
                                          ASSIGNED_TO,
                                          CREATED_BY,
                                          LAST_UPDATED_BY,
                                          CREATED_DATE,
                                          LAST_UPDATED_DATE
                                    )
                                     VALUES
                                   (            
                                          P_PROJECTNO,
                                          P_CRNO,
                                          P_APPNAME,
                                          P_APPFUNCDESC,
                                          P_AZUREFEATNO,
                                          P_AZUREFEATDESC,
                                          P_PROJMANAGER,
                                          P_PROJLEAD,
                                          P_REQBY,
                                          P_BUSINESSCAT,
                                          P_BUSINESSUSERCAT,
                                          P_FEATUREID,
                                          P_ISMGISRNO,
                                          P_REPLICARR,
                                          P_PRODRR,
                                          P_USERSTORY,
                                          UPPER(P_ASSIGNEDBY),
                                          UPPER(P_ASSIGNEDTO),
                                          P_CREATEDBY,
                                          P_LASTUPDBY,
                                          SYSDATE,
                                          SYSDATE
                                   )                                   
                                   
                                   RETURNING V_PROJ_ID INTO TBLDATA;
          TBLDATA:='Record Saved Succesfully';  
          
END  INSERT_PROJECT_MST; 

以下是相同的表格说明。

Name                   Null     Type           
---------------------- -------- -------------- 
ID                              NUMBER         
MST_ID                 NOT NULL NUMBER         
PROJECT_NO                      NVARCHAR2(100) 
CR_NO                           NVARCHAR2(100) 
APPLICATION_NAME                NVARCHAR2(255) 
APP_FUNC_DESC                   CLOB           
AZURE_FEATURE_NO                NVARCHAR2(155) 
AZURE_FEATURE_DESC              CLOB           
PROJECT_MANAGER_NAME            NVARCHAR2(100) 
PROJECT_LEAD_NAME               NVARCHAR2(100) 
REQUESTED_BY                    NVARCHAR2(100) 
BUSINESS_CATEGORY               NVARCHAR2(100) 
BUSINESS_USER_CATEGORY          NVARCHAR2(100) 
RATIONAL_FEATURE_ID             NVARCHAR2(100) 
ISMG_ISR_NO                     NVARCHAR2(100) 
REPLICA_RR                      NVARCHAR2(100) 
PROD_RR                         NVARCHAR2(100) 
USER_STORY                      NVARCHAR2(500) 
CREATED_BY                      NVARCHAR2(100) 
CREATED_DATE                    DATE           
ASSIGNED_TO                     NVARCHAR2(100) 
ASSIGNED_BY                     NVARCHAR2(100) 
IS_ACTIVE                       CHAR(1)        
LAST_UPDATED_BY                 NVARCHAR2(100) 
LAST_UPDATED_DATE               DATE           
COLUMN3                         VARCHAR2(20)   
COLUMN4                         VARCHAR2(20)   
COLUMN5                         VARCHAR2(20)  

注意 MST_ID 是我的唯一标识列,我将根据它更新表格。

【问题讨论】:

    标签: oracle stored-procedures insert-update


    【解决方案1】:

    我不确定我是否理解您的要求。目前,您的程序在表中插入一行;您插入的值是过程的 IN 参数。

    您希望能够通过调用相同的过程并传递相同的参数来更新同一个表中的当前行?

    如果是这样,MERGE 可能是一个不错的选择。它也被称为 upsert,因为它能够在同一个表中插入行(不存在)或更新行(如果存在)。

    类似这样的东西(简化;不想输入那么多列):

    CREATE OR REPLACE PROCEDURE merge_project_mst (p_mst_id     IN     NUMBER,
                                                   p_projectno  IN     NVARCHAR2,
                                                   p_crno       IN     NVARCHAR2,
                                                   p_msg           OUT NVARCHAR2)
    IS
    BEGIN
       MERGE INTO tbl_project_mst_info t
            USING (SELECT p_mst_id, p_projectno, p_crno FROM DUAL) x
               ON (x.p_mst_id = t.mst_id)
       WHEN MATCHED
       THEN
          UPDATE SET t.project_no = p_projectno, t.cr_no = p_crno
       WHEN NOT MATCHED
       THEN
          INSERT     (mst_id, project_no, cr_no)
              VALUES (x.p_mst_id, x.p_projectno, x.p_crno);
    
       p_msg := 'Merged ' || SQL%ROWCOUNT || ' row(s)';
    END;
    

    【讨论】:

    • 写入列没有问题,但如果记录存在则更新,不存在时插入?
    • 同时插入INSERT (mst_id, project_no, cr_no) mst_id 是我唯一的列。它会自动插入
    • 1st 评论:试试看,你会看到的。 2第二条评论:如果您希望能够更新现有行,则必须将 MST_ID 作为参数传递。您还怎么知道要更新哪些行?
    • 我想返回一个成功的插入或更新消息。我将如何添加它?请建议
    • 包含一个 OUT 参数;我修改了示例代码,看看。
    猜你喜欢
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多