2009-10-27 10 views
21

Disons que nous avons une procédure stockée sélection quelque chose d'une table:Procédures stockées MySql: Comment sélectionner une table de procédure?

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

Comment puis-je utiliser le résultat de cette procédure dans un sélectionner plus tard? (je l'ai essayé

 
SELECT * FROM (CALL database.getExamples()) 

mais sans succès.) Dois-je utiliser SELECT ... INTO OutVariable dans la procédure? Ou devrais-je utiliser une fonction retournant la table à la place?

+0

En essayant de trouver une solution, j'essaie ce qui suit, mais évidemment le type de données de retour ('TABLE') ne fonctionne pas;

 CREATE PROCEDURE database.getExamples( OUT examplesTable TABLE /* <<< What datatype to use for a table? */ ) SELECT * FROM examples INTO examplesTable 
Suis-je sur la bonne voie ici ..? – Cambiata

Répondre

5

Reformulé la question dans ce sujet: Can a stored procedure/function return a table?. Évidemment, ce n'est pas possible sans l'utilisation de tables temporaires.

+3

Qu'est-ce qui rend si évident que ce n'est pas possible sans tables temporaires? Cela ne répond pas à la question. – circuitry

+2

@circuitry La grammaire indique clairement que MySQL n'autorise pas 'select * from getExmaples() ...'. Cela ne signifie pas nécessairement qu'il n'y a pas d'autre moyen de le faire. C'est un problème frustrant. dans PostgreSQL, il est facile de 'select * from getExamples() ...'. –

+0

On dirait qu'il est temps pour moi de migrer vers PSQL puis ... –

-2

Dans serveur SQL vous pouvez alors faire SELECT * FROM database.getExamples()

Si vous souhaitez réutiliser la « procédure », alors, oui, je le mettrais dans une fonction table.

Sinon, vous pouvez simplement sélectionner une table temporaire dans la procédure stockée.

+0

Salut RR! J'essaie, mais de toute évidence le type de données "TABLE" n'est pas valide: CREER database.getExamples PROCEDURE ( TABLE/* <<< Quel type de données OUT examplesTable à utiliser pour une table * /?) SELECT * FROM exemples INTO examplesTable – Cambiata

+3

SQL Server = Microsoft SQL Server et il a des capacités différentes de MySQL. Cela signifie que beaucoup de choses que vous pouvez faire dans MS SQL ne peuvent pas être faites dans MySQL et vice versa. OP demande 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

Merci Dani! Cela signifie que je dois reconstruire la table entière à chaque fois? Cela me semble être beaucoup de travail supplémentaire. Juste en cours d'exécution CALL getExamples() donne évidemment les données dont j'ai besoin - la question est de savoir comment y accéder dans une instruction select ... – Cambiata

+1

Ceci est un code SQL Server. dans mysql - vous pouvez créer une table temporaire utilisez-la, puis déposez-la. – Dani

+0

De l'aspect performance, et je ne suis pas un pro, je pense que ce sera presque le même que de l'utiliser dans une instruction imbriquée, il y a probablement des possibilités d'optimisation dans l'option imbriquée, mais à moins que vous ne le remarquerez pas. – Dani

Questions connexes