2016-04-26 60 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

我做了一些研究更新和目前的,但我很困惑,在這種情況下,我應該使用它。有什麼建議麼? –