2016-10-25 44 views
3

我有下面的代碼不起作用。它會編譯,但是如果使用sysdate作爲parm_value參數調用,則它將引發PLS-00307: too many declarations of 'P_UPSERT_SDE_DATA' match this call如果我註釋掉varchar2條目,則重載將按照預期的那樣僅使用日期和數字數據類型。用DATE和VARCHAR2重載oracle過程

什麼是最好的方式去我想要做什麼,這是接受參數只有在parm_values數據類型(特別是日期和varchar2)不同?

PROCEDURE P_Upsert_SDE_Data(parm_table_name GORSDAV.GORSDAV_TABLE_NAME%TYPE, 
           parm_attr_name  GORSDAV.GORSDAV_ATTR_NAME%TYPE, 
           parm_key    GORSDAV.GORSDAV_PK_PARENTTAB%TYPE, 
           parm_user_id  GORSDAV.GORSDAV_USER_ID%TYPE, 
           parm_value   VARCHAR2); 
--        
    PROCEDURE P_Upsert_SDE_Data(parm_table_name GORSDAV.GORSDAV_TABLE_NAME%TYPE, 
           parm_attr_name  GORSDAV.GORSDAV_ATTR_NAME%TYPE, 
           parm_key    GORSDAV.GORSDAV_PK_PARENTTAB%TYPE, 
           parm_user_id  GORSDAV.GORSDAV_USER_ID%TYPE, 
           parm_value   NUMBER); 

    PROCEDURE P_Upsert_SDE_Data(parm_table_name GORSDAV.GORSDAV_TABLE_NAME%TYPE, 
           parm_attr_name  GORSDAV.GORSDAV_ATTR_NAME%TYPE, 
           parm_key    GORSDAV.GORSDAV_PK_PARENTTAB%TYPE, 
           parm_user_id  GORSDAV.GORSDAV_USER_ID%TYPE, 
           parm_value   DATE); 
+0

那麼,你怎麼稱呼程序? –

+0

'UTL_SDE.p_Upsert_SDE_Data('FRBGRNT','GRANT_END_DATE',var_FRBGRNT_CODE,'BANNER_GAS_SYNS',SYSDATE);'但是我已經嘗試了''TO_DATE('20020315','yyyymmdd')'sysdate。同樣的問題。 – JDro04

+2

您可以編輯問題以包含'gorsdav'列和'var_frb_grnt_code'(?)變量的完整數據類型嗎? –

回答

2

如果你傳遞的其他參數之一被隱式轉換,你可以看到這個;從您發佈的電話我懷疑var_FRB‌​GRNT_CODE是一個不同的類型,正在轉換;例如該變量是一個數字,並且GORSDAV.GORSDAV_PK_PARENTTAB是一個字符串。

From the documentation

當試圖確定哪些子程序被調用,如果PL/SQL編譯器的一個參數隱式轉換成匹配的類型,則編譯器查找,它可以隱式轉換爲匹配其他參數類型。如果有多個匹配項,則會發生編譯時錯誤PLS-00307,如Example 8-34中所示。

其中一個參數的隱式轉換使其尋找其他參數的潛在轉換;只有它纔會看到日期和varchar2版本,這些版本可以隱式轉換爲對方。如果所有參數都與用於形式參數聲明的表列類型相同,那麼它將不會查找隱式轉換,並且不會被date/varchar2版本混淆。

+0

沒錯。我非常關心重載變量,我不認爲那些重複的變量很重要。非常感謝你。 – JDro04

0

每當我得到這個錯誤,似乎是spec規範聲明和body聲明在某處不匹配。確保您的每個規範聲明都與您的正文聲明完全匹配。