我有以下不起作用的代码。它编译,但当使用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);
答案 0 :(得分:2)
如果你传递的其他一个参数被隐式转换,你可以看到这个;从您发布的电话我怀疑var_FRBGRNT_CODE
是一个不同的类型,正在转换;例如该变量是一个数字,GORSDAV.GORSDAV_PK_PARENTTAB
是一个字符串。
当尝试确定调用哪个子程序时,如果PL / SQL编译器隐式地将一个参数转换为匹配类型,则编译器会查找可以隐式转换为匹配类型的其他参数。如果存在多个匹配,则发生编译时错误PLS-00307,如Example 8-34中所示。
其他一个参数的隐式转换使其寻找其他参数的潜在转换;它只能看到date和varchar2版本,它们可以隐式地相互转换。如果所有参数与用于形式参数声明的表列的类型相同,那么它将不会寻找隐式转换,并且不会被日期/ varchar2版本混淆。
答案 1 :(得分:0)
每当我收到此错误时,似乎某个地方的规范声明和正文声明之间存在不匹配。确保每个规范声明都与您的身体声明完全匹配。