Hola.
No estoy seguro de que puedas poner una subconsulta dentro de la expresión de un IF. Pero en el caso de que se pueda, la expresión a evaluar del IF debe ir encerrada en paréntesis. Es decir :
SET TERM ^ ;
CREATE PROCEDURE IngresarPer
(codper CHAR(5), apeper VARCHAR(25), nomper VARCHAR(25), dniper CHAR(8), fnacper DATE, dirper VARCHAR(30), provper VARCHAR(25), telfper VARCHAR(12), celper VARCHAR(16), emailper VARCHAR(30), cargper VARCHAR(25), fingper DATE, fcesper DATE, plaper CHAR(1), fondpensper VARCHAR(25), codessper VARCHAR(15))
AS
BEGIN
IF ((SELECT COUNT(*) FROM REGISTROSPER WHERE REGISTROSPER.COD_PER = :codper) = 0) THEN BEGIN
INSERT INTO REGISTROSPER VALUES (:codper, :apeper, :nomper, ;dniper, :fnacper, :dirper, :provper, :telfper, :celper, :emailper, :cargper, :fingper, :fcesper, :plaper, :fondpensper, :codessper);
END
END^
SET TERM ; ^
Pero realmente creo que no puedes hacerlo así, directamente. Por lo que la solución pasar por poner el resultado de la subconsulta en una variable, antes de evaluar la expresión en el IF, es decir :
SET TERM ^ ;
CREATE PROCEDURE IngresarPer
(codper CHAR(5), apeper VARCHAR(25), nomper VARCHAR(25), dniper CHAR(8), fnacper DATE, dirper VARCHAR(30), provper VARCHAR(25), telfper VARCHAR(12), celper VARCHAR(16), emailper VARCHAR(30), cargper VARCHAR(25), fingper DATE, fcesper DATE, plaper CHAR(1), fondpensper VARCHAR(25), codessper VARCHAR(15))
AS
DECLARE variable existe SMALLINT;
BEGIN
SELECT COUNT(*) FROM REGISTROSPER WHERE REGISTROSPER.COD_PER = :codper INTO :existe;
IF (:existe = 0) THEN BEGIN
INSERT INTO REGISTROSPER VALUES (:codper, :apeper, :nomper, ;dniper, :fnacper, :dirper, :provper, :telfper, :celper, :emailper, :cargper, :fingper, :fcesper, :plaper, :fondpensper, :codessper);
END
END^
SET TERM ; ^
NOTA: Las variables en Firebird siempre van precedidas por el símbolo de dos puntos, en el cuerpo del procedimiento almacenado. Y la cláusula RETURNS se utiliza para designar los parámetros de salida del procedimiento almacenado, pero en este caso los parámetros que declaras son los de entrada, por lo tanto no van detrás de un RETURNS. Y finalmente las instrucciones dentro de un IF (o de cualquier otra agrupación) van dentro de un BEGIN ... END.
Estoy escribiendo esto de memoria, no tengo ningún Firebird a mano para probarlo, así que es posible de que te salten otros errores. Simplemente dinos cuales son, y los resolveremos.
Saludos.