2009-01-16 2 views
1

Les procédures stockées écrites ici concats actuellement les paramètres aux requêtes:Est-il possible de paramétrer une requête à l'intérieur de pl sql?

SELECT * 
    FROM Names 
    WHERE Name = ' || prmName || ' 
ORDER BY ' || prmSortField 

Est-il possible de paramétrer cette requête dans la procédure stockée? Peut-être comme:

query = 'select * From Names Where Name = @name Order By ' || prmSortField 
call(query, prmName) 

Note:
Si vous vous demandez pourquoi nous le faisons, il y a deux paramètres communs pour notre sp de: sortFieldIndex et sortDirection. Puisque nous ne pouvons pas les paramétrer directement, la requête est générée dynamiquement. Mais d'autres paramètres rendent les requêtes ouvertes à l'injection. Je cherche donc un moyen de paramétrer certains des paramètres.

Répondre

4

Absolument. Utilisez cursors.

DECLARE 
    CURSOR c1 (job VARCHAR2, max_wage NUMBER) IS 
    SELECT * FROM employees WHERE job_id = job AND salary > max_wage; 
BEGIN 
    FOR person IN c1('CLERK', 3000) 
    LOOP 
    -- process data record 
    DBMS_OUTPUT.PUT_LINE('Name = ' || person.last_name || ', salary = ' || 
         person.salary || ', Job Id = ' || person.job_id); 
    END LOOP; 
END; 
+0

Qu'en est-il de la variable prmSortField de l'OP? Comment paramétrer le champ de commande sans requêtes dynamiques? –

4

Pour une requête dynamique avec des valeurs de grippage, faites ceci:

procedure p (prmName varchar2, prmSortField varchar2) 
is 
    query varchar2(100); 
    rc sys_refcursor; 
    names_rec names%rowtype; 
begin 
    query = 'select * From Names Where Name = :name Order By ' || prmSortField 
    open rc for query using prmName; 
    loop 
     fetch rc into names_rec; 
     exit when rc%notfound; 
     -- process this row 
    end loop; 
    close rc; 
end;