简体   繁体   English

插入新行,使用Oracle SQL中的merge,insert,update语句更新行

[英]Insert new rows, update rows with merge, insert, update statement in Oracle SQL

When I try and run this PL/SQL block, my alias cannot be referenced. 当我尝试运行此PL / SQL块时,无法引用我的别名。 I receive: 我收到:

ORA-06550 Line xx, column x: 
PLS:00225: subprogram or cursor "V" reference is out of scope.  

This is for each instance of my 'V' alias. 这是我的“ V”别名的每个实例。

I'm using this link as a guide to create my logic: http://www.oratable.com/oracle-merge-command-for-upsert/ 我使用此链接作为创建逻辑的指南: http : //www.oratable.com/oracle-merge-command-for-upsert/

I'm wanting to pull data from a View, if the CONTRACT_NO matches; 如果CONTRACT_NO匹配,我想从视图中提取数据; then update data, else data would need to be inserted into the Table from the values of the View. 然后更新数据,否则需要将数据从视图的值插入表中。

Much appreciated. 非常感激。

declare
begin
merge into APEX_EBS_EXTENSION.SIUPO_CONTRACTS_OBLIGATION_DOC DOC
using
(select CONTRACT_NO,
        VENDOR_ID, 
        FISCAL_YEAR     
        TRANSACTION_CODE,   
        NUM_ID,
        VENDOR_NAME,
        ADDRESS1,              
        ADDRESS2,
        CITY,   
        STATE,
        ZIP,    
        VENDOR_CODE,
        START_DATE,
        END_DATE,
        COMMENTS,
        MULTI_YEAR_START,
        MULTI_YEAR_END
        FROM APEX_EBS_EXTENSION.SIUPO_CONTRACTS_OBLIGATION_V
        WHERE CONTRACT_NO = :P6_SEARCH) V
        ON (V.CONTRACT_NO = DOC.CONTRACT_NO)
     when matched then update
     set
        V.VENDOR_ID = DOC.VENDOR_ID,
        V.FISCAL_YEAR = DOC.FISCAL_YEAR,
        V.TRANSACTION_CODE = DOC.TRANSACTION_CODE,
        V.NUM_ID = DOC.NUM_ID,
        V.VENDOR_NAME = DOC.VENDOR_NAME,
        V.ADDRESS1 = DOC.ADDRESS1,
        V.ADDRESS2 = DOC.ADDRESS2,
        V.CITY = DOC.CITY,
        V.STATE = DOC.STATE,
        V.ZIP = DOC.ZIP,
        V.VENDOR_CODE = DOC.VENDOR_CODE,
        V.START_DATE = DOC.START_DATE,
        V.END_DATE = DOC.END_DATE,
        V.COMMENTS = DOC.COMMENTS,
        V.MULTI_YEAR_START = DOC.MULTI_YEAR_START,
        V.MULTI_YEAR_END = DOC.MULTI_YEAR_END

when not matched then

insert (V.CONTRACT_NO, V.VENDOR_ID, V.FISCAL_YEAR, V.TRANSACTION_CODE, V.NUM_ID, V.VENDOR_NAME, V.ADDRESS1, V.ADDRESS2, V.CITY,
V.STATE, V.ZIP, V.VENDOR_CODE, V.START_DATE, V.END_DATE, V.COMMENTS, V.MULTI_YEAR_START, V.MULTI_YEAR_END)

values (DOC.CONTRACT_NO, DOC.VENDOR_ID, DOC.FISCAL_YEAR, DOC.TRANSACTION_CODE, DOC.NUM_ID, DOC.VENDOR_NAME, DOC.ADDRESS1, DOC.ADDRESS2, DOC.CITY,
DOC.STATE, DOC.ZIP, DOC.VENDOR_CODE, DOC.START_DATE, DOC.END_DATE, DOC.COMMENTS, DOC.MULTI_YEAR_START, DOC.MULTI_YEAR_END);

end;

Found out the issue was the Table has no data and was trying to insert blank values into the Table. 发现问题在于表没有数据,并试图在表中插入空白值。 I simply flipped the aliases around and corrected 1 comma error and it worked like a charm. 我只是简单地翻转了别名,并更正了1个逗号错误,它就像一个魅力一样工作。 The data is now being pulled from the View and matched to the Table. 现在,数据已从视图中拉出并与表匹配。 If there isn't a match, it will insert the values from the View into the Table. 如果不匹配,它将把View中的值插入到Table中。

See below for updated MERGE, UPDATE and INSERT statement: 有关更新的MERGE,UPDATE和INSERT语句,请参见下文:

declare
begin
merge into APEX_EBS_EXTENSION.SIUPO_CONTRACTS_OBLIGATION_DOC DOC
using
(select CONTRACT_NO,
        VENDOR_ID, 
        FISCAL_YEAR, --put in comma 
        TRANSACTION_CODE,   
        NUM_ID,
        VENDOR_NAME,
        ADDRESS1,              
        ADDRESS2,
        CITY,   
        STATE,
        ZIP,    
        VENDOR_CODE,
        START_DATE,
        END_DATE,
        COMMENTS,
        MULTI_YEAR_START,
        MULTI_YEAR_END
        FROM APEX_EBS_EXTENSION.SIUPO_CONTRACTS_OBLIGATION_V
        WHERE CONTRACT_NO = :P6_SEARCH) V
        ON (DOC.CONTRACT_NO = V.CONTRACT_NO)
        when matched then update
        set

        DOC.VENDOR_ID = V.VENDOR_ID,
        DOC.FISCAL_YEAR = V.FISCAL_YEAR,
        DOC.TRANSACTION_CODE = V.TRANSACTION_CODE,
        DOC.NUM_ID = V.NUM_ID,
        DOC.VENDOR_NAME = V.VENDOR_NAME,
        DOC.ADDRESS1 = V.ADDRESS1,
        DOC.ADDRESS2 = V.ADDRESS2,
        DOC.CITY = V.CITY,
        DOC.STATE = V.STATE,
        DOC.ZIP = V.ZIP,
        DOC.VENDOR_CODE = V.VENDOR_CODE,
        DOC.START_DATE = V.START_DATE,
        DOC.END_DATE = V.END_DATE,
        DOC.COMMENTS = V.COMMENTS,
        DOC.MULTI_YEAR_START = V.MULTI_YEAR_START,
        DOC.MULTI_YEAR_END = V.MULTI_YEAR_END



when not matched then
--flipped aliases for insert and values  from V. to .DOC and vice-versa
insert  (DOC.CONTRACT_NO, DOC.VENDOR_ID, DOC.FISCAL_YEAR, DOC.TRANSACTION_CODE, DOC.NUM_ID, DOC.VENDOR_NAME, DOC.ADDRESS1, DOC.ADDRESS2, DOC.CITY,
DOC.STATE, DOC.ZIP, DOC.VENDOR_CODE, DOC.START_DATE, DOC.END_DATE, DOC.COMMENTS, DOC.MULTI_YEAR_START, DOC.MULTI_YEAR_END)

values (V.CONTRACT_NO, V.VENDOR_ID, V.FISCAL_YEAR, V.TRANSACTION_CODE, V.NUM_ID, V.VENDOR_NAME, V.ADDRESS1, V.ADDRESS2, V.CITY,
V.STATE, V.ZIP, V.VENDOR_CODE, V.START_DATE, V.END_DATE, V.COMMENTS, V.MULTI_YEAR_START, V.MULTI_YEAR_END);

end;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM