2017-08-28 2 views
1

TERADATA SQL, j'ai des instructions SQL stockées dans une table. Je veux remplir une autre table avec les résultats de ces instructions SQL. Les instructions SQL sont différentes pour chaque ligne et chaque colonne. Pourriez-vous s'il vous plaît me dire comment je peux y arriver? J'ai essayé d'obtenir des résultats grâce à la procédure stockée et au script Shell. Cependant, je ne pouvais pas le coder correctement.TERADATA SQL: Remplir une table via les résultats de la requête stockés dans une autre table

+0

Vous avez des instructions de sélection ou d'insérer des déclarations dans votre table? – Andrew

+0

Vous avez des instructions SQL stockées dans une table. Dans plus d'une colonne? Pouvez-vous partager la disposition de ce tableau et quelques exemples de données? Je devine un curseur pour faire une boucle dans cette table et exécuter les instructions dynamiquement ferait l'affaire. – JNevill

+0

@Andrew: Oui, j'ai des instructions SELECT dans la table. Je veux exécuter ces requêtes sql et remplir une autre table avec les résultats de la requête. –

Répondre

0

Voici une procédure assez simple pour extraire quelque chose comme ça. Il est un peu poilu parce que:

  1. Nous employons un curseur en boucle à travers votre table source qui contient les instructions SQL
  2. Nous Intégrant un second curseur en boucle à travers le premier curseur pour exécuter dynamiquement la chaîne SQL et FETCH les résultats de cette requête SQL dans une variable.

Je suppose que vous courrez dans toutes sortes de bugs tout en obtenant cette mise en place, mais je crois que cela est assez proche d'une procédure de travail:

CREATE PROCEDURE <yourdatbase>.MyNewProcedure() 
BEGIN 
    --Declare variables to hold the three fields as we loop through them with the cursor 
    --You'll need to change these types to match your table's data type so we can fetch 
    -- them without error inside the cursor loop 
    DECLARE customerID INT; 
    DECLARE customerName VARCHAR(50); 
    DECLARE sqlQUERY as VARCHAR(10000); 
    DECLARE source_table_cursor CURSOR FOR SELECT customerID, customerName, SQLQuery FROM <yourdatabase>.yoursourcetable FOR READ ONLY; 

    OPEN source_table_cursor; 
     looplabel: 
     LOOP 
      --We'll need a cursor for a dynamic statement 
      --And we'll also need an integer to catch your query 
      --results (Assuming they are all like (Sum(<somefield>) or some 
      --type of INT 
      DECLARE C1 CURSOR FOR S1; 
      DECLARE sqlResults as INT; 

      FETCH source_table_cursor INTO customerID, customerName, sqlQuery; 

      --WOAH THERE! Cursor issues something went wrong die die die 
      IF (SQLSTATE ='02000') THEN 
       LEAVE label1; 
      END IF;  

      --Now that we have a record and a sql statement we will need another cursor 
      --where we will execute, dynamically, the SQL statement and then fetch the 
      --single record result to update our target table   
      PREPARE S1 FROM sqlQuery; 
      OPEN C1; 
       FETCH C1 INTO sqlResults; 

       --Now we can INsert into your target table 
       INSERT INTO <yourdatabase>.yourtargettable (customerID, customerName SQL_RESULT) 
        VALUES (customerID, customerName, sqlResults); 

      CLOSE C1; 

     END LOOP looplabel; 
    CLOSE demographic_cursor; 
END 
+0

Nous vous remercions de fournir cette solution. –

+0

J'ai créé une procédure stockée pendant que vous développiez. Je suis incapable de comprendre comment les instructions SQL sont en cours d'exécution et obtenir des résultats dans sqlResults. Je veux savoir comment "PREPARER S1 DE sqlQuery;" récupère les résultats des requêtes. –

+0

'sqlQuery' est une varchar/chaîne qui est remplie avec l'instruction SQL pour l'enregistrement dans le premier curseur (à partir de votre table). Nous avons créé un curseur créé à partir d'une instruction 'S1'. 'S1' est" préparé "à partir de l'instruction sql dans' sqlQuery'. Une fois que cette instruction est "préparée", nous pouvons alors ouvrir le curseur 'C1' et le peupler avec les enregistrements de la chaîne' sqlQuery' qui a exécuté l'instruction 's1'. C'est beaucoup de sauter à travers les cerceaux afin d'exécuter dynamiquement une instruction SQL stockée dans une colonne. – JNevill