2009-07-20 9 views
-1

j'ai une requête de sélection qui va chercher des valeurs basées sur l'entrée d'utilisateur, pour EG: -SQL et le crapaud

SELECT 
    company, accounts 
from testdrive 
WHERE company LIKE '&Company', accounts = '&Account' 
order by company desc 

sur l'exécution de ce dans Toad, l'utilisateur est invité à saisir des valeurs .. mais je veux savoir comment le USER peut-il spécifier les "conditions" ALON avec les valeurs ?? Detno>, <,! = Etc

Répondre

2

il ne peut pas. Pour cela, vous avez besoin de SQL dynamique.

0

Il n'existe aucun moyen direct de le faire.

Pour les cas simples, vous pouvez contourner cette limitation en fournissant plusieurs paramètres pour les différentes comparaisons.

E.g.

SELECT company, accounts from testdrive WHERE company LIKE '&Company', accounts = '&Account' AND date<&datesmaller AND date<=&datesmallerequal order by company desc 

etc. Ensuite, vous pouvez fournir à la fois datesmaller et datesmallerequal. Il suffit de mettre celui dont vous n'avez pas besoin à une certaine date dans le futur, et la condition ne fera rien.

Mais cela ne fonctionne que pour les cas simples, en général, vous aurez besoin de SQL dynamique, ou une procédure stockée (qui peut gérer des paramètres complexes internall).

3

Je ne suis pas un utilisateur de TOAD, mais il semble que TOAD se base uniquement sur la fonction de variable de substitution de SQL Plus. SQL Les variables de substitution Plus ne sont pas des variables de liaison - elles ne sont que des substitutions de chaînes binaires - vous pouvez donc y placer n'importe quoi. Cela étant le cas, avez-vous vu ce qui se passe si vous faites quelque chose comme ceci:

SELECT company 
     , accounts 
    FROM testdrive 
    WHERE company &Company_Comparison '&Company' 
    AND accounts &Account_Comparison '&Account' 
ORDER BY company DESC; 

L'utilisateur doit être invité à Company_Comparison et Account_Comparison, où ils pourraient entrer =, comme, etc. Bien sûr, vous avez gagné! Ne soyez pas capable de valider leur entrée, et quelque chose comme ça est largement ouvert aux attaques par injection SQL, mais puisque votre client est TOAD, je suppose que vous n'êtes pas vraiment à la recherche d'une solution pare-balles.

+0

Cela pourrait être une solution. Dans SQL * PLus, vous pouvez certainement fournir n'importe quelle partie de la déclaration via les variables & substitution, et je suis sûr que TOAD fait la même chose. –

1

Ecrivez une fonction pour chaque colonne qui accepte un opérateur en tant qu'argument. De cette façon, les opérateurs peuvent être fournis via des variables de liaison ainsi que les opérandes eux-mêmes. Cette méthode souffrira probablement de problèmes de performance, car l'optimiseur ne pourra pas très bien calculer la sélectivité des prédicats.

par exemple.

FUNCTION company_is (company IN VARCHAR2, op IN VARCHAR2, value IN VARCHAR2) IS 
BEGIN 
    RETURN CASE op 
    WHEN '=' THEN (company = value) 
    WHEN 'LIKE' THEN (company LIKE value) 
    WHEN '<' THEN (company < value) 
    ... 
    END; 
END; 

FUNCTION date_is (thedate IN DATE, op IN VARCHAR2, value IN DATE) IS 
BEGIN 
    RETURN CASE op 
    WHEN '=' THEN (thedate = value) 
    WHEN '<' THEN (thedate < value) 
    ... 
    END; 
END; 

Ensuite, vous pouvez fournir prédicats de cette façon:

SELECT company, accounts 
FROM testdrive AS t 
WHERE company_is(t.company,'&CompanyOp','&Company') 
AND date_is(t.date_created,'&CreatedOp',TO_DATE('&Created','DD/MM/YYYY')) 
ORDER BY company DESC 

Mais attention pour les problèmes de performance - à moins que vous pouvez spécifier d'autres prédicats de façon normale, vous allez voir rien des analyses complètes!