2016-04-26 62 views
0

波纹管是我的程序。Oracle SQL程序错误

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" (
    ID VARCHAR2, 
    TITLE VARCHAR2, 
    SHORT_NAME VARCHAR2, 
    ACCOUNT_OFFICER VARCHAR2, 
    LEGAL_ID VARCHAR2, 
    LOCAL_REF_23 VARCHAR2, 
    LOCAL_REF_90 VARCHAR2, 
    COUNTRY VARCHAR2, 
    BIRTH_INCORP_DATE VARCHAR2, 
    LOCAL_REF_1 VARCHAR2, 
    CUSTOMER_STATUS VARCHAR2, 
    INDUSTRY VARCHAR2, 
    LEGAL_ID_2 VARCHAR2, 
    NET_MONTHLY_IN VARCHAR2, 
    GENDER VARCHAR2, 
    MARITAL_STATUS VARCHAR2, 
    OCCUPATION VARCHAR2, 
    EMPLOYERS_NAME VARCHAR2, 
    OFF_PHONE VARCHAR2, 
    EMPLOYERS_ADD VARCHAR2, 
    NO_OF_DEPENDENTS VARCHAR2, 
    INTRODUCER VARCHAR2, 
    DATE_TIME DATE, 
    LAST_KYC_REVIEW_DATE VARCHAR2, 
    JOB_TITLE VARCHAR2, 
    EMPLOYMENT_STATUS VARCHAR2, 
    LOCAL_REF_22 VARCHAR2, 
    LOCAL_REF_99 VARCHAR2, 
    LEGAL_EXP_DATE VARCHAR2, 
    DATE_OF_BIRTH VARCHAR2, 
    NATIONALITY VARCHAR2, 
    GIVEN_NAMES VARCHAR2, 
    FAMILY_NAME VARCHAR2, 
    LOCAL_REF_87 VARCHAR2, 
    NAME_2 VARCHAR2, 
    STREET VARCHAR2, 
    ADDRESS VARCHAR2, 
    TOWN_COUNTRY VARCHAR2, 
    LOCAL_REF_20 VARCHAR2, 
    LOCAL_REF_21 VARCHAR2, 
    COUNTRY_2 VARCHAR2, 
    POST_CODE VARCHAR2, 
    PHONE_1 VARCHAR2, 
    FAX_1 VARCHAR2, 
    SMS_1 VARCHAR2, 
    EMAIL_1 VARCHAR2, 
    LOCAL_REF_66 VARCHAR2, 
    LOCAL_REF_67 VARCHAR2, 
    LOCAL_REF_68 VARCHAR2, 
    LOCAL_REF_69 VARCHAR2, 
    LOCAL_REF_70 VARCHAR2, 
    LOCAL_REF_71 VARCHAR2, 
    LOCAL_REF_81 VARCHAR2, 
    LOCAL_REF_72 VARCHAR2, 
    RELATION_CODE VARCHAR2, 
    BASEL_SG VARCHAR2, 
    LEGAL_DOC_NAME VARCHAR2, 
    LEGAL_ID_3 VARCHAR2, 
    LEGAL_ISS_AUTH VARCHAR2, 
    LEGAL_EXP_DATE_2 VARCHAR2, 
    DATE_TIME_2 VARCHAR2, 
    LOCAL_REF_4 VARCHAR2, 
    MNEMONIC VARCHAR2, 
    PEP VARCHAR2, 
    RESIDENCE VARCHAR2, 
    OTHER_NATIONALITY VARCHAR2, 
    FADCA_CUS_POB VARCHAR2, 
    RUN_DATE DATE, 
    TABLE_NAME VARCHAR2 
    ) IS 
BEGIN 
    INSERT INTO NDB_AML_CUSTOMER 
    (ID, TITLE, SHORT_NAME, ACCOUNT_OFFICER, LEGAL_ID, LOCAL_REF_23, 
    LOCAL_REF_90, COUNTRY, BIRTH_INCORP_DATE,LOCAL_REF_1, CUSTOMER_STATUS, 
    INDUSTRY, LEGAL_ID_2, NET_MONTHLY_IN, GENDER, MARITAL_STATUS, 
    OCCUPATION, EMPLOYERS_NAME, OFF_PHONE, EMPLOYERS_ADD, NO_OF_DEPENDENTS, 
    INTRODUCER, DATE_TIME, LAST_KYC_REVIEW_DATE, JOB_TITLE, 
    EMPLOYMENT_STATUS, LOCAL_REF_22, LOCAL_REF_99, LEGAL_EXP_DATE, 
    DATE_OF_BIRTH, NATIONALITY, GIVEN_NAMES, FAMILY_NAME, LOCAL_REF_87, 
    NAME_2, STREET, ADDRESS, TOWN_COUNTRY, LOCAL_REF_20, LOCAL_REF_21, 
    COUNTRY_2, POST_CODE, PHONE_1, FAX_1, SMS_1, EMAIL_1, LOCAL_REF_66, 
    LOCAL_REF_67, LOCAL_REF_68, LOCAL_REF_69, LOCAL_REF_70, 
    LOCAL_REF_71, LOCAL_REF_81, LOCAL_REF_72, RELATION_CODE, BASEL_SG, 
    LEGAL_DOC_NAME, LEGAL_ID_3, LEGAL_ISS_AUTH, LEGAL_EXP_DATE_2, 
    DATE_TIME_2, LOCAL_REF_4, MNEMONIC, PEP, RESIDENCE, OTHER_NATIONALITY, 
    FADCA_CUS_POB) 
    SELECT ID, TITLE, SHORT_NAME, ACCOUNT_OFFICER, LEGAL_ID, LOCAL_REF_23, 
     LOCAL_REF_90, COUNTRY, BIRTH_INCORP_DATE, LOCAL_REF_1, 
     CUSTOMER_STATUS, INDUSTRY, LEGAL_ID_2, NET_MONTHLY_IN, GENDER, 
     MARITAL_STATUS, OCCUPATION, EMPLOYERS_NAME, OFF_PHONE, 
     EMPLOYERS_ADD, NO_OF_DEPENDENTS, INTRODUCER, DATE_TIME, 
     LAST_KYC_REVIEW_DATE, JOB_TITLE, EMPLOYMENT_STATUS, LOCAL_REF_22, 
     LOCAL_REF_99, LEGAL_EXP_DATE, DATE_OF_BIRTH, NATIONALITY, 
     GIVEN_NAMES, FAMILY_NAME, LOCAL_REF_87, NAME_2, STREET, ADDRESS, 
     TOWN_COUNTRY, LOCAL_REF_20, LOCAL_REF_21, COUNTRY_2, POST_CODE, 
     PHONE_1, FAX_1, SMS_1, EMAIL_1, LOCAL_REF_66, LOCAL_REF_67, 
     LOCAL_REF_68, LOCAL_REF_69, LOCAL_REF_70, LOCAL_REF_71, 
     LOCAL_REF_81, LOCAL_REF_72, RELATION_CODE, BASEL_SG, 
     LEGAL_DOC_NAME, LEGAL_ID_3, LEGAL_ISS_AUTH, LEGAL_EXP_DATE_2, 
     DATE_TIME_2, LOCAL_REF_4, MNEMONIC, PEP, RESIDENCE, 
     OTHER_NATIONALITY, FADCA_CUS_POB 
    FROM NDB_CUSTOMER_NEW 
    WHERE DATE_TIME > (SELECT RUN_DATE 
         FROM CHECK_POINT 
         WHERE TABLE_NAME = (SELECT TABLE_NAME 
               FROM ALL_TABLES 
               WHERE TABLE_NAME='NDB_CUSTOMER_NEW')); 

    UPDATE CHECK_POINT 
    SET RUN_DATE = SYSDATE; 

    COMMIT; 
END; 
/ 

当我执行我得到

错误数量或类型的参数

+0

你在说的方式上有问题;请用过程调用代码 – Aleksej

+0

执行CUSTOMER_INCREMENTAL –

+0

程序有参数,你必须通过它们 – Aleksej

回答

2

你已经宣布很多formal parameters为你的程序,但你永远不要使用他们。所有插入NDB_AML_CUSTOMER的值都来自NDB_CUSTOMER_NEW

所以,你的过程声明只是需要:

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" 
IS 
BEGIN 
    INSERT INTO ... 
    UPDATE ... 
    COMMIT; 
END; 

ALL_TABLES子查询是没有必要的;它所能做的只是检查表是否存在,但如果不存在,解析器在执行该子查询之前将抛出错误。子查询,以获得RUN_DATE可能只是:

SELECT RUN_DATE FROM CHECK_POINT WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW' 

但假设这意味着你必须为每个目标表不同的运行日期的多条记录,您的更新仅需要轻触同一个纪录:

UPDATE CHECK_POINT SET RUN_DATE = SYSDATE WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'; 

您也可能遇到跟踪问题。首先,会话可能会同时执行此操作,并看到相同的值,可能导致数据重复或违反约束条件。其次,当你插入插入的时间和你更新记录的时间(更新RUN_DATE;如果记录被添加到NDB_CUSTOMER_NEWDATE_TIME在那个差距,他们将永远不会被处理。您可能想要阅读有关for updatecurrent of以更安全地进行管理。

+0

您是否打算说会话将首先执行UPDATE语句,然后执行INSERT语句?在执行过程中将不会有记录添加到NDB_CUSTOMER_NEW。 –

+0

@DeEDEe - 不,我的意思是,如果您在12:41:08运行插入,那么它将使用该时间点源表中存在的任何记录。然后当你更新时,'sysdate'可能已经有一点变成了12:41:10,这取决于插入实际需要多长时间。 * next *运行将从那时开始。所以任何添加了DATE_TIME的12:41:09记录都不会被任何运行捕获。如果没有新的记录将被添加,那么在这种情况下可能无关紧要,但总的来说需要小心。 –

+0

我做了一些研究更新和目前的,但我很困惑,在这种情况下,我应该使用它。有什么建议么? –