, , SQL nom court / nom long

Rappel :

Pour les noms des objets collection, table, index, view, etc … le système maintient en double un nom SQL et un nom IBM i
Exemple :
SQL / bd_des_articles et IBMi / BD_DE00001
la règle est la suivante pour les noms supérieurs à 10 caractères le système prends les 5 premières positions et incrémente un compteur sur 5 positions, ce qui n’est pas forcément très lisible.

pour éviter ça, il est conseillé d’indiquer les 2 au moment de la création de votre objet SQL

Bien sur vous ne pourrez pas avoir des doublons ni sur le nom long ni sur le nom court

Voici quelques conseils

Création d’une base de données

Par un create schema par exemple

vous indiquez le nom SQL et vous pouvez forcer un nom court par la clause FOR SCHEMA nomcourt

exemple

CREATE SCHEMA BASE_DE_DONNEES_ARTICLES FOR SCHEMA DBARTICLE

Création d’une table

create table

vous indiquez le nom SQL et vous pouvez définir un nom court par la clause SYSTEM NAME nomcourt
il est conseillé pour les mêmes raisons de mettre sur un nom court, un nom long par la clause FOR nomcourt

EXEMPLE

CREATE TABLE DBARTICLE.Fichier_ARTICLES FOR SYSTEM NAME ARTICLES (
NUMERO_ARTICLE FOR COLUMN NUMART DEC ( 6) NOT NULL WITH DEFAULT,
NOMCLI_ARTICLE FOR COLUMN NOMART CHAR ( 30) NOT NULL WITH DEFAULT)

vous pouvez utiliser indifféremment les 2 syntaxes

select
NUMART ,
NOMART
from DBARTICLE.Fichier_ARTICLES
ou

select
NUMERO_ARTICLE ,
NOMART
from DBARTICLE.ARTICLES

pour la plupart des autres objets vous pouvez indiquer la clause FOR SYSTEM NAME nomcourt

Création d’un index

CREATE INDEX nomlong FOR SYSTEM NAME nomcourt
ON bd (long ou court)/ table (nom court ou long)
(nom de zone court ou long)

Exemple

CREATE index DBARTICLE.key_articles_numcli FOR SYSTEM NAME key_numli
on DBARTICLE.ARTICLES
(NUMERO_ARTICLE)

Création d’une vue

CREATE VIEW … FOR SYSTEM NAME nomcourt ()

exemple

CREATE VIEW DBARTICLE.articles_nom_b FOR SYSTEM NAME articleb (
NUMERO_ARTICLE , NOMART )
as
(select
NUMERO_ARTICLE , NOMART
from DBARTICLE.ARTICLES
where NUMART like(‘B%’))

Remarques :

Vous pouvez créer une table en faisant un create table as

exemple

CREATE table DBARTICLE.articles_nom_c FOR SYSTEM NAME articlec as
(select
NUMERO_ARTICLE , NOMART
from DBARTICLE.ARTICLES
where NUMART like(‘B%’))
With data

Ce qui permet de récupérer les attributs des zones de la table

Vous pouvez renommer une zone

exemple

CREATE table DBARTICLE.articles_nom_cbis FOR SYSTEM NAME article1 as
(select
NUMERO_ARTICLE , NOMART as nom_article_bis
from DBARTICLE.ARTICLES
where NUMART like(‘B%’))
With data

Mais c’est une nouvelle zone et le nom court est conservé, bien sur sauf si c’est une zone de travail substr par exemple ….

Si vous souhaitez utiliser vos tables en RPG, vous pouvez préciser un nom de format, ce qui vous evitera un renommage dans le programme RPGLE
c’est en utilisant la clause RCDDFMT
CREATE TABLE nomdb.nomtable ( ) RCDFMT nomfmt

Exemple

CREATE TABLE DBARTICLE.Fichier_ARTICLES FOR SYSTEM NAME ARTICLES (
NUMERO_ARTICLE FOR COLUMN NUMART DEC ( 6) NOT NULL WITH DEFAULT,
NOMCLI_ARTICLE FOR COLUMN NOMART CHAR ( 30) NOT NULL WITH DEFAULT)
RCDFMT ARTICLEF

Pour connaitre les correspondances sur les objets existants, vous pouvez utiliser les vues SQL

pour les tables
SELECT TABLE_NAME, SYSTEM_TABLE_NAME FROM systables
where …

pour les index

SELECT INDEX_NAME, SYSTEM_INDEX_NAME FROM SYSINDEXES
where

pour les vues

SELECT TABLE_NAME, SYSTEM_VIEW_NAME FROM sysviews
where

oui la vue s’appelle TABLE_NAME ?????????? ça sent le copier coller …

on peut renommer des noms systèmes sur des objets SQL

Exemples

RENAME TABLE GDATA.LONG_NOM_TABLE TO SYSTEM NAME LONG_NOM

RENAME index GDATA.LONG_INDEX_ZONE1 TO SYSTEM NAME I_ZONE1

RENAME index GDATA.LONG_VIEW_ALL TO SYSTEM NAME LONG_VIEW

Complément

Particularité pour renommer une table

Nous créerons la table suivante

CREATE TABLE gdata/nom_long_table FOR SYSTEM NAME nom_court (
NUMERO_ARTICLE FOR COLUMN NUMART DEC ( 6) NOT NULL WITH DEFAULT,
NOMCLI_ARTICLE FOR COLUMN NOMART CHAR ( 30) NOT NULL WITH DEFAULT)

rappel
Une table a un nom long et un nom court qui doivent être unique

on essaye de dupliquer la table dans la même bibliothèque

CRTDUPOBJ OBJ(NOM_COURT)
FROMLIB(GDATA)
OBJTYPE(FILE) TOLIB(GDATA) NEWOBJ(NOM_COURT2) DATA(YES)

duplication impossible dans la même bibliothèque, le probléme étant sur le nom long qui est dupliqué

Le message est le suivant
Le nom de remplacement attribué au fichier NOM_COURT2 n’est pas admis.

Pour dupliquer votre table vous devez donc passez par SQL

create table gdata/nom_long_table2 like gdata/nom_long_table

vous obtenez bien une 2éme table qui se nomme nom_long_table2

Mais le nom ibmi est fixé par le système ici NOM_L00001
est si vous voulez le renommer vous pouvez le faire par RNMOBJ

RNMOBJ OBJ(GDATA/NOM_L00001) OBJTYPE(*FILE) NEWOBJ(NOM_COURT2)

Vous avez nom long nom_long_table2
Vous avez nom court nom_court2

Vous devez bien faire les 2 opérations

Si vous voulez juste sauvegarder les données

Préférer un create table as en SQL ou un cpyf crtfile(*YES) en IBMI

, , 5 astuces pour optimiser vos connexions ODBC.

On a souvent du mal a régler ODBC voici quelques points qui peuvent vous aider dans cette tache.
L’apport de la procédure SET_SERVER_SBS_ROUTING qui permet de router des jobs ODBC, par adresses IP ou utilisateurs à considérablement changer la donne.

Rappel sur la procédure SET_SERVER_SBS_ROUTING

Gestion par utilisateur

call qsys2.SET_SERVER_SBS_ROUTING(‘PLB’, ‘QZDASOINIT’ , ‘ODBC’)

pour activer la redirection

call qsys2.SET_SERVER_SBS_ROUTING(‘PLB’, ‘QZDASOINIT’ , NULL);

pour supprimer cette redirection

SELECT * FROM QSYS2.SERVER_SBS_ROUTING

Pour les redirections existantes par nom user

Gestion par adresse IP

Pour activer

CALL QSYS2.SET_SERVER_SBS_ROUTING(AUTHORIZATION_NAME => ‘*ALL’,
SERVER_NAME => ‘QZDASOINIT’,
IP_ADDRESS_START => ‘192.168.1.10’,
IP_ADDRESS_END => ‘192.168.1.30’,
SUBSYSTEM_NAME => ‘ODBC’)

Pour supprimer cette redirection

CALL QSYS2.SET_SERVER_SBS_ROUTING(AUTHORIZATION_NAME => ‘*ALL’,
SERVER_NAME => ‘QZDASOINIT’,
IP_ADDRESS_START => ‘192.168.1.10’,
IP_ADDRESS_END => ‘192.168.1.30’,
SUBSYSTEM_NAME => NULL);

pour voir les redirections existantes par adresses IP

SELECT * FROM QSYS2.SERVER_SBS_CONFIGURATION;

Voici quelques axes qui peuvent vous donner des idées

1) Séparer vos connexions en créant un sous-système spécifique

Ce qui permet une meilleur administration.
Vous pourrez router vos jobs par utilisateurs ou par adresse IP grâce à la procédure SQL SET_SERVER_SBS_ROUTING

CRTSBSD SBSD(VOTRESBS)
POOLS((1 *BASE))
TEXT(‘Sous-système pour job ODBC’)
vous pouvez indiquer le pool de base

un travail à démarrage automatique

ADDPJE SBSD(GODBC) PGM(QSYS/QZDASOINIT) INLJOBS(QZDASOINIT) JOBD(Qgpl/votrejobd) CLS(QSYS/votreclasse) user(votreuser)

et un poste de routage

ADDRTGE SBSD(VOTRESBS)
SEQNBR(9999)
CMPVAL(*ANY)
PGM(VOTREPGM)
CLS(VOTRECLASS)

2) Mettre un pool spécifique sur votre sous système

Ce qui permettra de réinitialiser votre cache entre 2 benchmarks.

POOLS((1 *SHRPOOL7))

3) Mettre une classe spécifique

Ce qui permettra de régler les priorités d’exécution sur la commande RTGE.
la classe par défaut est la QPWFSERVER , dupliquez la et ajustez les paramètres que vous désirez par CHGCLS.
Par exemple, les priorités.

4) Mettre une JOBD spécifique pour fixer le niveau de log

par exemple sur la commande ajout des travaux auto.
la jobd par défaut est la QDFTSVR , dupliquez la et ajustez les paramètres que vous désirez par CHGJOBD.
Par exemple le niveau de log.

5) Mettre un programme initial spécifique

Pour par exemple choisir le fichier QAQQINI pour les réglages SQL.
Le programme par défaut est QCMD , voici un exemple.
Par exemple, changer le fichier QAQQINI
PGM
CHGQRYA QRYOPTLIB(&LIB)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(‘Vous +
utilisez désormais QAQQINI de la +
bibliothèque, ‘ BCAT &LIB) MSGTYPE(STATUS)
ENDPM

Rappel :

Ici on traite pas de la traçabilité, il est important de voir qui peut faire de l’ODBC sur votre système.

Nous avons un logiciel GODBC qui peut vous aider dans cette tache ici : https://www.gaia.fr/produits/