使用DATE和VARCHAR2重载oracle过程

时间:2016-10-25 20:21:54

标签: oracle plsql

我有以下不起作用的代码。它编译,但当使用sysdate作为parm_value参数调用时,它会抛出PLS-00307: too many declarations of 'P_UPSERT_SDE_DATA' match this call如果我注释掉varchar2条目,则重载按预期工作,只有日期和数字数据类型。

关于我尝试做什么的最好方法是什么,接受参数只在parm_values数据类型(特别是date和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);

2 个答案:

答案 0 :(得分:2)

如果你传递的其他一个参数被隐式转换,你可以看到这个;从您发布的电话我怀疑var_FRB‌​GRNT_CODE是一个不同的类型,正在转换;例如该变量是一个数字,GORSDAV.GORSDAV_PK_PARENTTAB是一个字符串。

From the documentation

  

当尝试确定调用哪个子程序时,如果PL / SQL编译器隐式地将一个参数转换为匹配类型,则编译器会查找可以隐式转换为匹配类型的其他参数。如果存在多个匹配,则发生编译时错误PLS-00307,如Example 8-34中所示。

其他一个参数的隐式转换使其寻找其他参数的潜在转换;它只能看到date和varchar2版本,它们可以隐式地相互转换。如果所有参数与用于形式参数声明的表列的类型相同,那么它将不会寻找隐式转换,并且不会被日期/ varchar2版本混淆。

答案 1 :(得分:0)

每当我收到此错误时,似乎某个地方的规范声明和正文声明之间存在不匹配。确保每个规范声明都与您的身体声明完全匹配。