Aller au contenu

RUNSQL

Exécuter SQL

En bref

La commande RUNSQL exécute l'instruction SQL indiquée au paramètre SQL (SQL).

RUNSQL se lit RUN (Exécuter) + SQL. Sur IBM i, le nom d'une commande associe presque toujours un verbe et un objet.

Syntaxe minimale

RUNSQL SQL(…)

Paramètres

Astuce : dans une session 5250, tapez RUNSQL puis F4 pour l'invite de saisie, et F1 sur un paramètre pour son aide.

Aide IBM i de la commande

Texte du F1, IBM i 7.5 en français (bibliothèque QSYS)

Où s'exécute : Tous les environnements (*ALL)
Compatible multitâche : Non

La commande RUNSQL exécute l'instruction SQL indiquée au paramètre SQL (SQL).

L'instruction SQL fait l'objet d'une analyse syntaxique lorsque la commande est exécutée. Les erreurs de syntaxe ne sont pas identifiées tant que la commande n'est pas exécutée.

La commande RUNSQL exécute les instructions SQL dans le groupe d'activation de l'appelant. Si la commande RUNSQL est exécutée dans un programme CL compilé ou une procédure CL ILE, le groupe d'activation de ce programme ou de cette procédure est utilisé

Restrictions :

  • Dans d'autres interfaces SQL, une instruction SQL est limitée à une longueur de 2 mégaoctets. La limite sur cette commande est de 5 000 octets, ce qui représente le maximum pour le paramètre *CHAR d'une commande CL.
  • Contrairement à la commande RUNSQLSTM, la commande RUNSQL ne produit pas de fichier spoule. Lorsqu'une erreur se produit au cours de l'exécution de la commande, le message d'erreur SQL correspondant est envoyé à l'appelant sous forme de message d'arrêt programme. Pour une instruction SQL complexe qui renvoie une erreur de syntaxe, le moyen le plus simple pour rechercher la cause de l'erreur de syntaxe consiste à démarrer un moniteur de base de données, à exécuter la commande RUNSQL, puis à analyser le moniteur de base de données à l'aide de System i Navigator. Cela s'applique tout particulièrement lorsque l'instruction SQL est construite sous forme d'expression dans un programme ou une procédure CL.
  • Contrairement à la commande RUNSQLSTM qui valide ou invalide implicitement les instructions lorsqu'elle prend fin et que le contrôle de validation est utilisé, la commande RUNSQL, par défaut, n'exécute ni validation ni invalidation. Ces opérations sont à la charge de l'application de l'utilisateur. Ce fonctionnement est semblable à celui des instructions SQL imbriquées dans d'autres langages de programmation tels que RPG ou COBOL.
  • La commande RUNSQL ne peut pas être utilisée pour ouvrir un fichier base de données et le laisser ouvert. Tout fichier ouvert à l'aide de la commande RUNSQL est fermé avant la reprise du contrôle.

Paramètres

Mot-clé Description Valeurs possibles Remarques
SQL SQL Valeur caractère Obligatoire, positionnel 1
COMMIT Contrôle de validation *CHG, *UR, *CS, *ALL, *RS, *NONE, *NC, *RR Facultatif, positionnel 2
NAMING Appellation *SYS, *SQL Facultatif, positionnel 3
DATFMT Format de date *JOB, *USA, *ISO, *EUR, *JIS, *MDY, *DMY, *YMD, *JUL Facultatif
DATSEP Séparateur de date *JOB, '/', '.', ',', '-', ' ', *BLANK Facultatif
TIMFMT Format d'heure *HMS, *USA, *ISO, *EUR, *JIS Facultatif
TIMSEP Séparateur d'heure *JOB, ':', '.', ',', ' ', *BLANK Facultatif
DFTRDBCOL Collection par défaut Nom, *NONE Facultatif
DECMPT Symbole décimal *JOB, *SYSVAL, *PERIOD, *COMMA Facultatif
SRTSEQ Séquence de tri Valeurs uniques: *JOB, *LANGIDUNQ, *LANGIDSHR, *HEX
Autres valeurs: Nom d'objet qualifié
Facultatif
Qualificatif 1: Séquence de tri Nom
Qualificatif 2: Bibliothèque Nom, *LIBL, *CURLIB
LANGID Identificateur de langue Valeur caractère, *JOB Facultatif
OPTION Options pour liste source *NOLIST, *LIST Facultatif
PRTFILE Fichier imprimante Nom d'objet qualifié Facultatif
Qualificatif 1: Fichier imprimante Nom, QSYSPRT
Qualificatif 2: Bibliothèque Nom, *LIBL, *CURLIB
SECLVLTXT Texte deuxième niveau *NO, *YES Facultatif
ALWCPYDTA Copie des données admise *OPTIMIZE, *YES, *NO Facultatif
ALWBLK Groupage admis *ALLREAD, *NONE, *READ Facultatif
SQLCURRULE Règles SQL *DB2, *STD Facultatif
DECRESULT Options de résultat décimal Liste d'éléments Facultatif
Élément 1: Précision maximale 31, 63
Élément 2: Echelle maximale 0-63, 31
Élément 3: Echelle de division minimale 0-9, 0
CONACC Résolution accès simultanés *DFT, *CURCMT, *WAIT Facultatif
SYSTIME Dépendant de l'heure système *YES, *NO Facultatif

SQL (SQL)

Indique une instruction SQL à exécuter.

Ce paramètre est obligatoire.

valeur-alphanumérique
Indiquez l'Instruction SQL à exécuter. La longueur maximale de l'instruction est de 5 000 octets.

Contrôle de validation (COMMIT)

Indique si les instructions SQL sont exécutées sous contrôle de validation.

*CHG ou *UR
Indique que les objets désignés dans les instructions SQL ALTER, CALL, COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME et REVOKE, ainsi que toutes les lignes mises à jour, supprimées ou insérées sont verrouillés jusqu'à la fin de l'unité d'oeuvre (transaction). Les modifications invalidées dans les autres travaux peuvent être visualisées.
*CS
Indique que les objets désignés dans les instructions SQL ALTER, CALL, COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME et REVOKE, ainsi que toutes les lignes mises à jour, supprimées ou insérées sont verrouillés jusqu'à la fin de l'unité d'oeuvre (transaction). Une ligne sélectionnée, mais non mise à jour est verrouillée tant que la ligne suivante n'est pas sélectionnée. Les modifications invalidées dans les autres travaux ne peuvent pas être visualisées.
*ALL ou *RS
Indique que les objets désignés dans les instructions SQL ALTER, CALL, COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME et REVOKE, ainsi que toutes les lignes sélectionnées, mises à jour, supprimées ou insérées sont verrouillés jusqu'à la fin de l'unité d'oeuvre (transaction). Les modifications invalidées dans les autres travaux ne peuvent pas être visualisées.
*NONE ou *NC
Indique que le contrôle de validation n'est pas utilisé. Les modifications invalidées dans les autres travaux peuvent être visualisées. Si l'instruction SQL DROP SCHEMA est incluse dans le programme, vous devez utiliser *NONE ou *NC.
*RR
Indique que les objets désignés dans les instructions SQL ALTER, CALL, COMMENT ON, CREATE, DROP, GRANT, LABEL ON, RENAME et REVOKE, ainsi que toutes les lignes sélectionnées, mises à jour, supprimées ou insérées sont verrouillés jusqu'à la fin de l'unité d'oeuvre (transaction). Les modifications invalidées dans les autres travaux ne peuvent pas être visualisées. Toutes les tables désignées dans les instructions SELECT, UPDATE, DELETE et INSERT sont verrouillées jusqu'à la fin de l'unité d'oeuvre (transaction).

Convention d'appellation (NAMING)

Indique la convention d'appellation utilisée pour les objets des instructions SQL.

*SYS
La convention d'appellation du système (nom-bibliothèque/nom-fichier) est utilisée.
*SQL
La convention d'appellation SQL (nom-schéma.nom-table) est utilisée.

Format de date (DATFMT)

Indique le format utilisé lors de l'accès aux colonnes réservées aux résultats de type date. Pour les chaînes en entrée, la valeur spécifiée permet de déterminer si le format de date est admis.

Remarque :Une chaîne en entrée utilisant le format de date *USA, *ISO, *EUR ou *JIS est toujours admise.

*JOB
Le format spécifié pour le travail est utilisé. Utilisez la commande DSPJOB (Afficher le travail) pour déterminer le format de date en cours du travail.
*USA
Le format de date américain mm/jj/aaaa est utilisé.
*ISO
Le format de date ISO est utilisé aaaa-mm-jj
*EUR
Le format de date européen jj.mm.aaaa est utilisée.
*JIS
Le format de date JIS - norme japonaise d'encodage des jeux de caractères (aaaa-mm-jj) est utilisé.
*MDY
Le format de date mm/jj/aa est utilisé.
*DMY
Le format de date jj/mm/aa est utilisé.
*YMD
Le format de date aa/mm/jj est utilisé.
*JUL
Le format de date julien aa/jjj est utilisé.

Séparateur de date (DATSEP)

Indique le séparateur utilisé lors de l'accès aux colonnes réservées aux résultats de type date.

Remarque :Ce paramètre ne s'applique que si *JOB, *MDY, *DMY, *YMD, ou *JUL est indiqué pour le paramètre Format de date (DATFMT).

*JOB
Le séparateur de date indiqué pour le travail lors de la précompilation (lorsqu'une nouvelle session SQL interactive est créée ou que RUNSQLSTM est exécuté) est utilisé.

Utilisez la commande DSPJOB (Afficher le travail) pour déterminer la valeur du séparateur de date en cours du travail.

'/'
Une barre oblique est utilisée comme séparateur de date.
'.'
Un point est utilisé comme séparateur de date.
'-'
Un tiret est utilisé comme séparateur de date.
','
Une virgule est utilisée comme séparateur de date.
' ' ou *BLANK
Un blanc est utilisé comme séparateur de date.

Format d'heure (TIMFMT)

Indique le format utilisé lors de l'accès aux colonnes réservées aux résultats de type heure. Pour les chaînes en entrée, la valeur spécifiée permet de déterminer si le format d'heure est admis.

Remarque :Une chaîne en entrée utilisant le format *USA, *ISO, *EUR ou *JIS est toujours admise.

*HMS
Le format hh:mm:ss est utilisé.
*USA
Le format d'heure américain hh:mmxx est utilisé, où xx correspond à AM ou PM.
*ISO
Le format d'heure ISO - Organisation internationale de normalisation - hh.mm.ss est utilisé.
*EUR
Le format d'heure européen hh.mm.ss est utilisé.
*JIS
Le format d'heure JIS - norme japonaise d'encodage des jeux de caractères - hh:mm:ss est utilisé.

Séparateur d'heure (TIMSEP)

Indique le séparateur utilisé lors de l'accès aux colonnes réservées aux résultats de type heure.

Remarque :Ce paramètre ne s'applique que si *HMS est indiqué pour le paramètre Format d'heure (TIMFMT).

*JOB
Le séparateur d'heure indiqué pour le travail lors de la précompilation (lorsqu'une nouvelle session SQL interactive est créée ou que RUNSQLSTM est exécuté) est utilisé.

Utilisez la commande DSPJOB (Afficher le travail) pour déterminer la valeur du séparateur d'heure en cours du travail.

':'
Les deux points sont utilisés comme séparateur d'heure.
'.'
Un point est utilisé comme séparateur d'heure.
','
Une virgule est utilisée comme séparateur d'heure.
' ' ou *BLANK
Un blanc est utilisé comme séparateur d'heure.

Collection par défaut (DFTRDBCOL)

Indique le nom de l'identificateur de schéma utilisé pour les nom non qualifiés de tables, de vues, d'index, de modules SQL, d'alias, de contraintes, de programmes externes, de groupes de noeuds et de déclencheurs. Ce paramètre ne s'applique qu'aux instructions SQL statiques.

*NONE
La convention d'appellation utilisée est celle indiquée pour le paramètre Convention d'appellation (NAMING).
nom
Indiquez le nom de l'identificateur de schéma à utiliser à la place de la convention d'appellation indiquée pour le paramètre NAMING.

Symbole décimal (DECMPT)

Indique la valeur du symbole décimal utilisé pour les constantes numériques des instructions SQL. Cette valeur est également utilisée comme marque décimale en cas de transtypage entre les valeurs de type numérique et celles de type alphanumérique.

*JOB
La représentation du symbole décimal correspond à la valeur utilisée par le travail qui exécute l'instruction.
*SYSVAL
La valeur système QDECFMT est utilisée comme symbole décimal.
*PERIOD
Un point représente le symbole décimal.
*COMMA
Une virgule représente le symbole décimal.

Séquence de tri (SRTSEQ)

Indique la table de séquence de tri à utiliser pour comparer les chaînes des instructions SQL.

Valeurs particulières

*JOB
La valeur SRTSEQ du travail est utilisée.
*LANGIDUNQ
La table de tri à poids unique correspondant à la langue indiquée au paramètre Identificateur de langue (LANGID) est utilisée.
*LANGIDSHR
La table de tri à poids partagé correspondant à la langue indiquée pour le paramètre LANGID est utilisée.
*HEX
Aucune table de séquence de tri n'est utilisée. Les valeurs hexadécimales des caractères sont utilisées pour déterminer la séquence de tri.

Qualificatif 1 : Séquence de tri

nom
Précisez le nom de la table de séquence de tri à utiliser avec ce programme.

Qualificatif 2 : Bibliothèque

*LIBL
La recherche porte sur toutes les bibliothèques de la liste des bibliothèques de l'unité d'exécution en cours jusqu'à ce que la première occurrence soit trouvée.
*CURLIB
La recherche porte sur la bibliothèque en cours du travail. Si celle-ci n'est pas précisée, QGPL est utilisée par défaut.
nom
Indiquez le nom de la bibliothèque sur laquelle doit porter la recherche.

Identificateur de langue (LANGID)

Indique l'identificateur de langue à utiliser lorsque SRTSEQ(*LANGIDUNQ) ou SRTSEQ(*LANGIDSHR) est spécifié.

*JOB
La valeur LANGID du travail est extraite.
identificateur-langue
Indiquez un identificateur de langue.

Options pour liste source (OPTION)

Indique si une liste est générée par la commande.

*NOLIST
Aucune liste n'est générée. Tous les messages sont envoyés dans l'historique du travail.
*LIST
Une liste est générée.

Fichier imprimante (PRTFILE)

Indique le fichier imprimante vers lequel la sortie de la commande est dirigée. Le fichier doit être de 132 octets minimum. Si un enregistrement de fichier est inférieur à 132 octets, les informations sont perdues.

Qualificatif 1 : Fichier imprimante

QSYSPRT
Le fichier en sortie est placé dans le fichier imprimante QSYSPRT, fourni par IBM.
nom
Indiquez le nom du fichier imprimante vers lequel la sortie est dirigée.

Qualificatif 2 : Bibliothèque

*LIBL
La recherche porte sur toutes les bibliothèques de la liste des bibliothèques de l'unité d'exécution en cours jusqu'à ce que la première occurrence soit trouvée.
*CURLIB
La recherche porte sur la bibliothèque en cours du travail. Si celle-ci n'est pas précisée, QGPL est utilisée par défaut.
nom
Indiquez le nom de la bibliothèque dans laquelle se trouve le fichier imprimante.

Texte deuxième niveau (SECLVLTXT)

Indique que les descriptions textuelles des messages de deuxième niveau doivent être écrites dans la liste en sortie.

*NO
Le texte de second niveau ne figure pas dans la liste.
*YES
Le texte de second niveau avec des données de remplacement est ajouté à la liste de tous les messages.

Copie des données admise (ALWCPYDTA)

Indique si une copie des données peut être utilisée dans une instruction SELECT.

*OPTIMIZE
Le système détermine s'il doit utiliser les données directement extraites de la base de données ou une copie de ces données. Ce choix dépend des performances des différentes méthodes. Si le paramètre Contrôle de validation (COMMIT) n'a pas la valeur *NONE, le paramètre Groupage admis (ALWBLK) doit prendre la valeur *ALLREAD, si possible, pour obtenir de meilleures performances.
*YES
Une copie des données est utilisée le cas échéant.
*NO
Aucune copie des données n'est utilisée. Si une copie temporaire des données est requise pour le lancement d'une requête, un message d'erreur s'affiche.

Groupage admis (ALWBLK)

Indique si le gestionnaire de bases de données peut utiliser le groupage d'enregistrements et dans quelle mesure ce groupage peut être utilisé pour les curseurs en lecture seule.

*ALLREAD
Les lignes sont groupées pour les curseurs en lecture seule. Tous les curseurs d'un programme qui ne peuvent pas être explicitement modifiés sont ouverts pour le traitement en lecture seule même si des instructions EXECUTE ou EXECUTE IMMEDIATE peuvent figurer dans ce programme.

*ALLREAD :

  • Autorise le groupage d'enregistrements pour les curseurs en lecture seule.
  • Peut améliorer les performances de pratiquement tous les curseurs en lecture seule des programmes, mais restreint les requêtes comme suit :
    • Lorsque *ALLREAD est spécifié, la commande d'invalidation (ROLLBACK), une instruction ROLLBACK en langage hôte ou l'instruction SQL ROLLBACK HOLD ne permettent pas de repositionner un curseur en lecture seule.
    • Vous ne pouvez pas utiliser l'exécution dynamique d'une instruction UPDATE ou DELETE positionnée (via EXECUTE IMMEDIATE, par exemple) pour mettre à jour une ligne d'un curseur sauf si l'instruction DECLARE du curseur comprend la clause FOR UPDATE.
*NONE
Les lignes ne sont pas groupées en vue de l'extraction de données pour les curseurs.

*NONE :

  • Garantit que les données extraites sont à jour.
  • Peut réduire le temps nécessaire à l'extraction de la première ligne de données d'une requête.
  • Arrête le gestionnaire de bases de données lors de l'extraction d'un ensemble de lignes de données non utilisé par le programme lorsque les premières lignes d'une requête sont extraites avant la fermeture de cette dernière.
  • Peut réduire les performances globales d'une requête qui extrait de nombreuses lignes.
*READ
Les enregistrements sont groupés pour l'extraction de données en lecture seule destinées aux curseurs lorsque :
  • *NONE est indiqué pour le paramètre Contrôle de validation (COMMIT), ce qui signifie que le contrôle de validation n'est pas utilisé.
  • Le curseur dispose d'une clause FOR READ ONLY ou qu'aucune instruction dynamique ne peut exécuter une instruction UPDATE ou DELETE positionnée pour le curseur.

Règles SQL (SQLCURRULE)

Indique la sémantique utilisée pour les instructions SQL.

*DB2
Par défaut, la sémantique de l'ensemble des instructions SQL est conforme aux règles établies pour DB2. La sémantique suivante est gérée par cette option :

Les constantes hexadécimales sont traitées comme des données de type caractères.

*STD
Par défaut, la sémantique de l'ensemble des instructions SQL est conforme aux règles établies par les normes ISO et ANSI SQL. La sémantique suivante est gérée par cette option :

Les constantes hexadécimales sont traitées comme des données binaires.

Options de résultat décimal (DECRESULT)

Indique la précision maximale, l'échelle maximale et l'échelle de division minimale devant être utilisées lors d'opérations décimales comme le calcul arithmétique. Les limites spécifiées s'appliquent uniquement aux types de données NUMERIC et DECIMAL.

Elément 1 : Précision maximale

31
La précision maximale (longueur) devant être renvoyée par les opérations décimales est de 31 chiffres.
63
La précision maximale (longueur) devant être renvoyée par les opérations décimales est de 63 chiffres.

Elément 2 : Echelle maximale

31
L'échelle maximale (nombre de décimales à droite de la virgule) devant être renvoyée par les opérations décimales est de 31 chiffres.
0-63
Indiquez l'échelle maximale (nombre de décimales à droite de la virgule) devant être renvoyée par les opérations décimales. La valeur peut être comprise entre 0 et la précision maximale.

Elément 3 : Echelle de division minimale

0
L'échelle de division minimale n'est pas utilisée.
0-9
Indiquez l'échelle de division minimale (nombre de décimales à droite de la virgule) devant être renvoyée par les opérations décimales. La valeur ne peut pas dépasser l'échelle maximale. Si 0 est indiqué pour l'échelle maximale, l'échelle de division minimale n'est pas utilisée.

Résolution accès simultanés (CONACC)

Indique comment le gestionnaire de la base de données doit gérer les conflits de verrouillage d'enregistrements pour les données en cours de mise à jour.

*DFT
Indique que l'option d'accès simultané ne sera pas explicitement définie pour le programme. La valeur prise en compte sera la valeur applicable au moment de l'appel du programme. La valeur peut être via l'option SQL_CONCURRENT_ACCESS_RESOLUTION du fichier d'options de requête QAQQINI.
*CURCMT
Lorsque cela est possible, le gestionnaire de la base de données doit utiliser les données validées en cas de conflit de verrouillage d'enregistrements pour les requêtes en lecture seule. Ceci s'applique lorsque le niveau de validation est *CS.
*WAIT
En cas de conflit de verrouillage d'enregistrements, le gestionnaire de la base de données doit attendre le résultat.

Dépendant de l'heure système (SYSTIME)

Indique si les références aux tables temporelles de période système dans les instructions SQL statiques et dynamiques sont affectées par la valeur du registre spécial CURRENT TEMPORAL SYSTEM_TIME.

*YES
Les références aux tables temporelles de période système sont affectées par la valeur du registre spécial CURRENT TEMPORAL SYSTEM_TIME.
*NO
Les références aux tables temporelles de période système ne sont pas affectées par la valeur du registre spécial CURRENT TEMPORAL SYSTEM_TIME.

Exemples

Exemple 1 : Insertion d'une ligne dans une table

RUNSQL   SQL('insert into testlib/t1 values (1)')

Cette commande permet d'insérer une ligne dans le fichier T1 dans la bibliothèque TESTLIB.

Exemple 2 : Exécution d'une requête et stockage des résultats dans une table temporaire

RUNSQL   SQL('CREATE TABLE qtemp.t1 AS
              (SELECT * FROM qsys2.systables
               WHERE table_schema = ''TESTLIB'') WITH DATA')
         COMMIT(*NONE) NAMING(*SQL)

Cette commande permet d'exécuter une requête et de stocker les résultats dans une table temporaire. La table est le fichier T1 dans la bibliothèque QTEMP. Si la commande est exécutée dans un programme ou une procédure CL, vous pouvez utiliser la commande RCVF pour lire les résultats de la requête.

Exemple 3 : Utilisation d'une expression pour l'instruction SQL

RUNSQL1: PGM  PARM(&LIB)
          DCL  &LIB TYPE(*CHAR) LEN(10)
          DCL  &SQLSTMT TYPE(*CHAR) LEN(1000)
          CHGVAR  VAR(&SQLSTMT) +
                  VALUE('DECLARE GLOBAL TEMPORARY TABLE result +
                       AS (SELECT * FROM qsys2.systables WHERE +
                       table_schema = ''' !! &LIB !! ''') with +
                       data WITH REPLACE NOT LOGGED')
          RUNSQL  SQL(&SQLSTMT) COMMIT(*NONE) NAMING(*SQL)
ENDSQL1: ENDPGM

Cet exemple illustre l'utilisation de la commande RUNSQL dans un programme ou une procédure CL. Le paramètre SQL est construit en tant qu'expression de type caractère CL qui concatène le texte littéral avec la valeur de la variable de type caractère &LIB.

Messages d'erreur

Messages *ESCAPE

SQLxxxx
Toute erreur SQL composée de quatre chiffres, par exemple, SQL0204.
SQ2xxxx
Toute erreur SQL comprise entre 20000 et 29999, par exemple, SQ20180.
SQ3xxxx
Toute erreur SQL comprise entre 30000 et 39999, par exemple, SQ30106.

© Copyright IBM Corp. Texte d'aide reproduit à des fins de formation.