it-swarm-fr.com

Requête paramétrée SQLPLUS via un fichier

Je souhaite émettre un paramétré à Oracle via SQLPlus avec tous les paramètres fournis dans un fichier texte. Y a-t-il un moyen de faire cela? La requête a plus de paramètres que ce qui est raisonnable pour qu'une personne soit invitée et que nous souhaitons éliminer l'erreur de l'utilisateur lors de la saisie du paramètre pour cela.

La raison pour laquelle nous devons émettre une requête paramétrée est que nous constatons une énorme différence de performance entre une instruction SQL droite et la même requête émise qu'une requête paramétrée dans notre application. Nous souhaitons supprimer tout code d'application de la chaîne et avoir la différence évidente avec uniquement des outils Oracle.

5
Darryl Braaten

Si vous souhaitez que le SQL dans un fichier et les paramètres d'une autre, il s'agit d'une option. Avoir query.sql Affectation de paramètres de position pour lier des variables, puis exécuter une requête:

variable p_owner varchar2(30);
variable p_column varchar2(30);

set verify off
set feedback off

begin
    :p_owner := '&1';
    :P_column := '&2';
end;
/

set feedback on

select table_name
from all_tab_columns
where owner = :p_owner
and column_name = :p_column;

exit 0;

Et mettre les valeurs de paramètre dans un fichier texte, dites parms.txt:

SYS
OSUSER

Et le mettre avec:

sqlplus -s user/password @query `cat parms.txt`

(Ceci est pour Unix, évidemment; pas sûr de l'équivalent de la ligne de commande pour Windows). Changement parms.txt, ou utilisez différents fichiers, et vous obtiendrez toujours le même plan analysé à chaque fois.

Votre problème de performance sonne comme il peut éventuellement être lié à une liaison à la variable de liaison, en particulier la description "bloquée avec un mauvais plan". Le plan d'exécution est déterminé par la première exécution de la requête, qui pourrait choisir des index appropriés, etc. pour ces paramètres; Les exécutions suivantes utilisent ensuite le même plan même si différents index peuvent être plus appropriés pour les nouveaux paramètres. Le SQL droit autonome aura une analyse séparée et donc peut-être un plan différent (plus approprié). Dans le passé, j'ai dû rassembler des statistiques manuellement pour éviter que les histogrammes soient utilisés, ce qui stabilise au moins des choses.

5
Alex Poole

Eh bien, une requête paramétrée va faire mieux, la main vers le bas. La façon dont nous avions l'habitude de faire quelque chose de similaire à cela était d'utiliser un bloc PL/SQL anonyme qui utiliserait UTLFILE pour ouvrir et lire les paramètres, les alimentant à la requête dans le bloc et écrire la sortie dans le système de fichiers.

YMMV bien sûr.

4
mezmo

Depuis que vous mentionnez SQL Plus, je suppose que vous faites cela à la ligne de commande? Si oui, cela pourrait fonctionner pour vous:

parms.shl:
export parm1=1
export parm2=15
export parm3=150

dojob.shl:
#!/bin/sh
# source our variables into our context.
. parms.shl 
# call sqlplus and have the variables embedded.
sqlplus -s <<EOF
-- we're now in SQLPLUS
SELECT '$parm1', '$parm2', '$parm3'
  FROM DUAL;
-- and exit out
EXIT;
EOF

Ensuite, à l'invite de commande, courez:

./dojob.shl

Et les résultats doivent correspondre aux paramètres entrants. La capture est que le SQL doit être dans le script shell. (Assurez-vous que l'utilisation de la fonctionnalité @ FileName.SQL de SQLPlus ne verra pas les variables d'environnement au niveau du système d'exploitation.)

Pas le plus élégant, mais il devrait fonctionner sans utf_file au-dessus de la tête/risque. Il devrait fonctionner sur la plupart des variantes * NIX/BSD, mais il ne devrait pas être difficile de convertir dans un fichier de lots Windows.

Note latérale: Pourquoi ne pas stocker les paramètres d'un endroit déjà prêt pour stocker des données? C'est-à-dire votre base de données? Si les paramètres doivent être modifiables, écrivez un écran ou un autre processus permettant de mettre à jour les paramètres par l'utilisateur final et simplement de lier à la table dans votre processus.

Côté Note: Dans mon exemple, je ne fais rien en ce qui concerne les variables contraignantes. Par conséquent, la performance n'est pas susceptible d'être excellente lorsqu'il est utilisé dans une déclaration de longue date. Vous pouvez utiliser les variables de SQLPLUS pour atténuer l'effet (la configuration de la variable du système d'exploitation via une variable, puis la réutilisation des variables de SQLPLUS dans votre code réel. Ensuite, Oracle devrait être capable d'optimiser le relevé. Voir http: (http://www.adp-gmbh.ch/ora/sqlplus/use_vars.html )

3
Kerri Shotts

Définir les paramètres nommés owner et table dans le fichier params.sql:

    define owner=scott
    define table=emp

Appelez le fichier de définition et utilisez les paramètres dans le fichier query.sql

    @params.sql
    select count(*) from &owner..&table
    /
    exit

Le .. (deux points) après &owner sont destinées.

Maintenant, changez-vous au répertoire où params.sql et query.sql sont et appelez

    sqlplus user/[email protected] @query.sql

Les paramètres nommés peuvent être utilisés dans le fichier query.sql De la même manière que les paramètres de ligne de commande de SQL Plus. Le fichier params.sql peut contenir d'autres déclarations que define. Il y a beaucoup de techniques pouvant être utilisées avec SQL Plus décrit dans le manuel SQL * Plus.

2
miracle173