¿Por qué este procedimiento SQL almacenado requiere que se cree una tabla temporal para que funcione (resultados de devolución)?

IBM Informix Dynamic Server versión 11.50.FC6

Estaba trabajando en un pequeño procedimiento almacenado que tomaría campos de nombre de una tabla y los analizaría en "nombres de usuario" con un máximo de 8 caracteres.

Este es el código que estaba intentando:

CREATE PROCEDURE build_jics_user (pid INT) RETURNING CHAR(8) AS username; SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) username FROM id_rec WHERE id = pid; END PROCEDURE; 

El error devuelto cuando se ejecuta es:

  659: INTO TEMP table requinetworking for SELECT statement. Error in line 5 Near character position 15 

No entiendo cuál es el punto de convocar una tabla temporal, y tampoco pude encontrar ningún ejemplo similar en línea que funcione sin errores.

¿Alguien sabe lo que me estoy perdiendo?

Lo que quieres decir es esto:

 CREATE PROCEDURE build_jics_user (pid INT) RETURNING CHAR(8); DEFINE username CHAR(8); SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) INTO username FROM id_rec WHERE id = pid; RETURN username; END PROCEDURE; 

… y ejecutarlo así:

 EXECUTE PROCEDURE build_jics_user(42); 

ACTUALIZAR

Si el propósito de esto es ser una function, donde se requiere dentro de otro SQL, entonces puede hacer lo siguiente:

 CREATE FUNCTION jics_user(fname VARCHAR(255), lname VARCHAR(255)) RETURNING CHAR(8); RETURN LOWER(SUBSTR(fname,0,1) || SUBSTR(lname,0,7)); END FUNCTION; 

… y ejecutarlo así:

 SELECT id, firstname, lastname, jics_user(firstname, lastname) AS jics_user, ... FROM id_rec; 

No hay una diferencia técnica real entre un PROCEDIMIENTO y una FUNCIÓN, es más una afirmación de cómo se usa.

Esto parece ser por layout (que debe ser responsable de la ausencia de los 'ejemplos similares en línea' ). Aparentemente, sin importar los datos que esté utilizando con una instrucción SELECT en un procedimiento almacenado, no puede devolverlos directamente. Debe almacenarlos en una tabla temporal o en variables para su uso posterior.

Es probable que su statement SELECT se vea así

 SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) INTO username FROM id_rec WHERE id = pid;