2014-10-01 55 views
1

我搜索了這個沒有多少運氣...我希望你能幫助我...PostgreSQL的錯誤42883當執行自定義功能

這是我的PL/pgSQL函數:

CREATE OR REPLACE FUNCTION crearempresa(
    _id_empresa integer DEFAULT NULL::integer, 
    _ci_rif character varying DEFAULT NULL::character varying, 
    _nombre character varying DEFAULT NULL::character varying, 
    _persona_contacto character varying DEFAULT NULL::character varying, 
    _telefono_movil character varying DEFAULT NULL::character varying, 
    _telefono_oficina character varying DEFAULT NULL::character varying, 
    _fax character varying DEFAULT NULL::character varying, 
    _email character varying DEFAULT NULL::character varying, 
    _email_alterno character varying DEFAULT NULL::character varying, 
    _direccion character varying DEFAULT NULL::character varying, 
    _tipoempresa character varying DEFAULT NULL::character varying, 
    _cod_usuario integer DEFAULT NULL::integer, 
    _estado_registro integer DEFAULT NULL::integer 
) 
    RETURNS character varying AS 
$BODY$ 
    DECLARE 
     retorno character varying; 
    BEGIN 
     IF _id_empresa = 0 THEN 
      _id_empresa = NULL; 
     END IF; 
     IF (select id_empresa from empresa where id_empresa = _id_empresa) is null THEN 
      IF (Select MAX(id_empresa) from empresa) is null THEN 
       _id_empresa = 1; 
      ELSE 
       _id_empresa = (Select MAX(id_empresa) + 1 from empresa); 
      END IF; 
      insert into empresa (
       id_empresa,ci_rif,nombre,persona_contacto,telefono_movil,telefono_oficina,fax,email, 
       email_alterno,direccion,id_tipo_empresa,cod_usuario,fecha_creacion,fecha_actualizacion,estado_registro) 
      values (
       _id_empresa,_ci_rif,_nombre,_persona_contacto,_telefono_movil,_telefono_oficina,_fax,_email,    
       _email_alterno,_direccion,_tipoempresa,_cod_usuario,CURRENT_DATE,CURRENT_DATE,_estado_registro); 
      retorno = '1';  
     ELSE 
      Update empresa 
       set ci_rif = _ci_rif,    
        nombre = _nombre,    
        persona_contacto = _persona_contacto,    
        telefono_movil = _telefono_movil,   
        telefono_oficina = _telefono_oficina,    
        fax = _fax,   
        email = _email,   
        email_alterno = _email_alterno,   
        direccion = _direccion,  
        id_tipo_empresa = _tipoempresa, 
        cod_usuario = _cod_usuario,   
        fecha_actualizacion = CURRENT_DATE,   
        estado_registro = _estado_registro 
      where id_empresa = _id_empresa; 
      retorno = '2'; 
     END IF;     
     RETURN retorno; 
    END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE COST 100; 

這是創建精細,因爲我可以在pgAdminIII看到該文件夾​​「功能」裏面的功能:

enter image description here

我,當我嘗試使用測試功能:

select crearempresa (1,'a','f','a','b','c','d','e','f','g',4,1,1); 

我收到以下錯誤信息:

ERROR: no existe la función crearempresa(integer, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, integer, integer, integer) 
LINE 1: select crearempresa (1,'a','f','a','b','c','d','e','f','g',4... 
      ^
HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede ser necesario agregar conversión explícita de tipos. 
********** Error ********** 

ERROR: no existe la función crearempresa(integer, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, integer, integer, integer) 
SQL state: 42883 
Hint: Ninguna función coincide en el nombre y tipos de argumentos. Puede ser necesario agregar conversión explícita de tipos. 
Character: 8 

我只是不知道哪一個是正確的形式給出瞭解決這個問題。它看起來像PostgreSQL即使它已經被創建也找不到這個函數,就像你在圖中看到的那樣。或者,它可能與數據類型有關,但我不明白爲什麼,因爲在函數定義中,數據類型等於函數調用中的參數。另外,我已經有類似這樣的許多功能,並都能正常運作......

希望你能幫助我理解這...

提前感謝!

回答

4

參數類型不匹配。

你的最後三個參數的函數調用都是整數:

4,1,1); 

但功能預計3 - 從 - 最後一個參數是varchar

_tipoempresa character varying DEFAULT NULL::character varying, 
_cod_usuario integer DEFAULT NULL::integer, 
_estado_registro integer DEFAULT NULL::integer 

因爲PostgreSQL支持與功能相同的名稱和不同的參數,它不能告訴你是否打算用不同的參數來調用這個函數,或者不知道當前數據庫中缺少的其他同名函數。這就是爲什麼它報告錯誤的原因。

+0

這實際上是這個錯誤!我將它更改爲整數,它工作!謝謝克雷格林格!當我這樣做的時候幾乎是午夜,我看不到這個錯誤!的xD – 2014-10-02 00:27:14