2009-10-27 14 views
21

Digamos que tenemos un procedimiento almacenado seleccionar algo de una tabla:Procedimientos almacenados de MySql: ¿cómo seleccionar desde la tabla de procedimientos?

 
CREATE PROCEDURE database.getExamples() 
SELECT * FROM examples; 

¿Cómo puedo usar el resultado de este procedimiento en un seleccionar más adelante? (He intentado

 
SELECT * FROM (CALL database.getExamples()) 

pero sin éxito.) ¿Debo usar SELECT ... INTO outVariable en el procedimiento? ¿O debería usar una función que devuelva la tabla?

+0

Tratando de encontrar una solución, intento lo siguiente, pero obviamente el tipo de datos devueltos ('TABLE') no funciona;

 CREATE PROCEDURE database.getExamples( OUT examplesTable TABLE /* <<< What datatype to use for a table? */ ) SELECT * FROM examples INTO examplesTable 
¿Estoy en el buen camino aquí ...? – Cambiata

Respuesta

5

Reformularon la pregunta en este hilo: Can a stored procedure/function return a table?. Obviamente, no es posible sin el uso de tablas temporales.

+3

¿Qué lo hace tan obvio que no es posible sin tablas temporales? Esto no responde la pregunta. – circuitry

+2

@circuitry La gramática deja en claro que MySQL no permite 'select * from getExmaples() ...'. No necesariamente significa que no hay otra manera de hacerlo. Este es un problema frustrante; en PostgreSQL, es fácil 'seleccionar * de getExamples() ...'. –

+0

Parece que es hora de migrar a PSQL, entonces ... –

-2

En servidor SQL a continuación, puede hacer SELECT * FROM database.getExamples()

Si desea volver a utilizar el 'procedimiento' entonces, sí, yo lo pondría en una función con valores de tabla.

De lo contrario, podría SELECCIONAR INTO una tabla #temporary dentro del procedimiento almacenado.

+0

¡Hola RR! Estoy intentando esto, pero obviamente el tipo de datos "TABLE" no es válido: CREAR PROCEDIMIENTO database.getEjemplos ( OUT examplesTable TABLE/* <<< ¿Qué tipo de datos usar para una tabla? * /) SELECT * FROM examples INTO tablesTable – Cambiata

+3

SQL Server = Microsoft SQL Server y tiene capacidades diferentes de MySQL. Esto significa que muchas cosas que puede hacer en MS SQL no se pueden hacer en MySQL y viceversa. OP pregunta por MySQL. – Erk

2
CREATE TABLE #TempTable 
(OID int IDENTITY (1,1), 
VAr1 varchar(128) NOT NULL, 
VAr2 varchar(128) NOT NULL) 

Populate temporary table 

INSERT INTO #TempTable(VAr1 , VAr2) 
SELECT * FROM examples 
+1

Gracias Dani! Esto significa que tengo que reconstruir toda la tabla todo el tiempo? Eso me parece mucho trabajo extra. Simplemente ejecutando CALL getExamples() obviamente proporciona los datos que necesito - la pregunta es cómo acceder a ella en una declaración de selección ... – Cambiata

+1

Este es el código de SQL Server. en mysql: puede crear tablas temporales y, a continuación, soltarlas. – Dani

+0

Desde el aspecto del rendimiento, y no soy un profesional, creo que será casi lo mismo que usarlo en una declaración anidada, probablemente haya algunas posibilidades de optimización en la opción anidada, pero a menos que se trate de una selección muy grande/complicada no lo notarás – Dani

Cuestiones relacionadas