web-dev-qa-db-fra.com

MySQL Comment INSERT INTO [table temporaire] DE [Procédure stockée]

Ceci est très similaire à question 653714 , mais pour MySQL au lieu de SQL Server.

Fondamentalement, j'ai un choix compliqué qui constitue la base de plusieurs procédures stockées. J'aimerais partager le code entre les procédures stockées, mais je ne sais pas comment faire. Une façon de le faire est de faire en sorte que le partage sélectionne une procédure stockée, puis appelle cette procédure stockée à partir des autres. Je n'arrive pas à comprendre comment utiliser l'ensemble de résultats de la procédure stockée imbriquée. Si je pouvais les mettre dans une table temporaire, je pourrais utiliser les résultats efficacement, mais je ne saurais pas comment les obtenir dans une table temporaire. Par exemple, cela ne fonctionne pas:

CREATE TEMPORARY TABLE tmp EXEC nested_sp();
16
Brian Fisher

Le problème est que les procédures stockées ne renvoient pas directement la sortie. Ils peuvent exécuter des instructions select dans le script, mais n'ont aucune valeur de retour.

MySQL appelle les procédures stockées via CALL StoredProcedureName(); Et vous ne pouvez pas diriger cette sortie vers quoi que ce soit, car ils ne renvoient rien (contrairement à une fonction).

Commande d'appel MySQL

13
St. John Johnson

Ma première réaction a été "Cela ressemble à une vue pour moi". Cela n’est-il pas assez abstrait pour que vous puissiez simplement ajouter la variabilité à un SP par cas?

Tout ce qui ajoute une table temporaire qui ne serait pas autrement présente un anti-modèle très probable.

5
dkretz

Vous ne pouvez pas "SELECT INTO" avec les procédures stockées.

Créez d'abord la table temporaire et demandez à votre procédure stockée de stocker le résultat de la requête dans la table temporaire créée à l'aide de la commande "INSERT INTO" normale. La table temporaire est visible tant que vous la déposez ou que la connexion est fermée.

4
slaakso

je sais que cela arrive très tard, mais comme il m'a fallu beaucoup de temps pour trouver une solution réelle, je pourrais tout aussi bien vous en faire part. J'ai travaillé sur un exemple qui est ci-dessous.

les tables créées sont:

CREATE TABLE BOOK(
B_ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(B_ID),
TITLE VARCHAR(100),
DESCRIPTION VARCHAR(30),
PRICE DOUBLE);

CREATE TABLE BOOK_COMMENT(

PRIMARY KEY(B_C_ID),
B_C_ID INT NOT NULL AUTO_INCREMENT,
REMARK VARCHAR(120),
B_ID INT,
FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID));

CREATE TABLE AUTHOR(
A_ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(A_ID),
A_NAME CHAR(15),
B_ID INT,

FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID));
  1. DELIMITER

CREATE PROCEDURE BOOK_IMPORTANT( _PRICE DOUBLE, _B_ID INT, A_NAME CHAR(15), _BD_ID INT)

BEGIN

INSERT INTO BOOK(PRICE)

VALUES(_PRICE);

SET _B_ID=LAST_INSERT_ID();

INSERT INTO BOOK_COMMENT(B_ID)

VALUES(_B_ID);

SET _BD_ID=LAST_INSERT_ID();

INSERT INTO AUTHOR(A_NAME,B_ID)

VALUES(A_NAME,_BD_ID);

END

puis utilisez ce qui suit pour insérer les valeurs.

CALL BOOK_IMPORTANT('0.79',LAST_INSERT_ID(),'',LAST_INSERT_ID());

LAST_INSERT_ID() prend la dernière incrémentation automatique de la table et l'insère dans la colonne de référence de la table enfant.

Dans les paramètres de procédure, _B_ID et _BD_ID représentent le B_ID puisque j'ai besoin de B_ID en tant que clé étrangère dans les deux tables.

Désolé pour la formulation excédentaire. Tous les autres gars s'attendent à ce que vous sachiez automatiquement comment le faire. J'espère que ça aide

4
coder 222

C'est peut-être un sujet fermé, mais j'aimerais proposer une solution basée sur les propriétés des tables temporaires de MySQL. Premièrement, la manière de créer la table temporaire ne serait pas d'appeler le SP "CREATE TEMPORARY TABLE tmp EXEC nested_sp ();". La requête est à la table temporaire de "infrastructure", (pour la nommer en quelque sorte).

Pour obtenir le résultat souhaité, il est nécessaire de créer 2 SP, le premier SP traite les données et remplit la table temporaire "infrastructure", le deuxième SP, lit cette table et poursuit le processus, puis " DROP "la" infrastructure "table

Le premier SP.

    CREATE DEFINER = 'root'@'localhost'
PROCEDURE cajareal.priv_test()
BEGIN
  CREATE TEMPORARY TABLE IF NOT EXISTS  tmp(
      column1 TEXT
    , column2 TEXT
    , column3 TEXT
    );



  INSERT INTO tmp(column1, column2 , column3) VALUES(CURDATE(), CURRENT_DATE(), CURRENT_TIMESTAMP());

END

Le deuxième SP

CREATE DEFINER = 'root'@'localhost'
PROCEDURE cajareal.priv_caller()
BEGIN
  CALL priv_test;

  -- Read data of "infrastructure" table
  SELECT * FROM tmp;


  -- Do the bussiness logic


  -- Delete the "infrastructure" table
  DROP TABLE tmp;
END

J'utilise cette technique pour analyser une chaîne et la convertir en table

0
Janhell