2012-03-29 17 views
17

Piszę procedurę PL/SQL, która wykonuje wybór na podstawie zmiennych wejściowych, a następnie wstawia wiersz dla każdego wyniku w selekcji. Mam problem z debugowaniem, co jest nie tak z moim zapytaniem z powodu mojej nowości do PL/SQL. Wiem, że to musi być łatwe, ale utknąłem tu z jakiegoś powodu. Dzięki za pomoc!PL/SQL Wstawianie 1 wiersza dla każdego wyniku w zaznaczeniu

Według Oracle Developer Compiler ... "NAME_ID" jest nieprawidłowym identyfikatorem. Próbowałem umieścić go w cudzysłowach, ale bez kości. Narzeka również, że użycie zmiennych indeksu pętli "REC" jest nieważne. Każda pomoc jest doceniana.

Odpowiedz

42

Nie ma potrzeby dynamicznego SQL tutaj:

BEGIN 

    FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES 
       WHERE NAME = class_string) 
    LOOP 
     INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID) 
     VALUES (rec.NAME_ID, ranking_id); 
    END LOOP; 
END; 

Jeszcze lepiej można uniknąć powolnego podejścia wiersz po wierszu kursor tak:

BEGIN 
    INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID) 
    SELECT NAME_ID, ranking_id FROM PRODUCT_NAMES 
    WHERE NAME = class_string; 
END; 

Jeśli rzeczywiście potrzebne dynamiczny SQL nie należy konkatenować wartości do niego, ale za pomocą zmiennych wiążących:

BEGIN 

    FOR rec IN (SELECT NAME_ID FROM PRODUCT_NAMES 
       WHERE NAME = class_string) 
    LOOP 
     EXECUTE IMMEDIATE 'INSERT INTO NAME_RANKING 
          (NAME_ID, RANKING_ID) VALUES (:b1, :b2) 
     USING rec.NAME_ID, ranking_id; 
    END LOOP; 
END; 
Powiązane problemy