Gestion des Espaces et Utilisateurs
Pour créer un nouvel espace de stockage destiné à une application spécifique, définissez le fichier de données avec une taille initiale et l'autonomisation.
<code>CREATE TABLESPACE APP_STORAGE
DATAFILE '/data/oracle/app_storage.dbf'
SIZE 256M
AUTOEXTEND ON NEXT 50M MAXSIZE UNLIMITED;</code>
L'attribution des droits permet d'accéder à l'instance et de gérer les objets logiques. L'utilisateur doit disposer des privilèges de base ainsi qu'une capacité illimitée sur l'espace dédié.
<code>CREATE USER APP_ADMIN IDENTIFIED BY 'SecurePass123'
DEFAULT TABLESPACE APP_STORAGE
TEMPORARY TABLESPACE TEMP;
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO APP_ADMIN;
GRANT UNLIMITED TABLESPACE TO APP_ADMIN;
GRANT CONNECT TO APP_ADMIN;</code>
Maintenance du Schéma
Lorsqu'un espace n'est plus utilisé, assurez-vous d'inclure son contenu et les fichiers physiques lors de la suppression.
<code>DROP TABLESPACE OLD_SCHEMA_INCLUDEING CONTENTS AND DATAFILES;</code>
Pour identifier quelle vue dépend d'une table spécifique, interrogez la vue système d'informations.
<code>SELECT OBJECT_OWNER, OBJECT_TYPE
FROM DBA_DEPENDENCIES
WHERE REFERENCED_NAME = 'TABLE_SOURCE_NAME'
AND TYPE = 'VIEW';</code>
Lorsque la création de vues ou de procédures échoue par manque de droits sur des tables tierces, l'administrateur de la table propriétaire doit octroyer les droits de sélection globaux.
<code>GRANT SELECT ANY TABLE TO VIEW_CREATOR_USER WITH ADMIN OPTION;</code>
Modification de Structure de Colonne
Pour modifeir le type de données d'une colonne sans perte d'information, ajoutez une nouvelle colonne temporaire, migrez les données, puis renommez l'ancienne vers la nouvelle structure.
<code>-- Étape 1 : Ajout d'une colonne temporaire
ALTER TABLE TBL_MAIN ADD COLUMN_DATE_TMP DATE;
-- Étape 2 : Migration des données converties
UPDATE TBL_MAIN SET COLUMN_DATE_TMP = TO_DATE(COLUMN_OLD_STR, 'YYYY-MM-DD');
-- Étape 3 : Suppression et renommage
ALTER TABLE TBL_MAIN DROP COLUMN COLUMN_OLD_STR;
ALTER TABLE TBL_MAIN RENAME COLUMN COLUMN_DATE_TMP TO COLUMN_DATE_ORIGINAL;</code>
Affichage des Métadonnées
Récupérer les descriptions associées aux colonnes via la vue utilisateur.
<code>SELECT COL_NAME AS NOM_COLUMN, COMME DESCRIPTION
FROM USER_COL_COMMENTS
WHERE TABLE_NAME = 'NOM_TABLE_CIBLE';</code>
Manipulation de Données et Fonctions
Séquence et Déclencheurs Auto-Incrément
Implémenter une clé primaire automatique nécessite une séquence et un trigger exécuté avant chaque insertion.
<code>-- Définition de la séquence
CREATE SEQUENCE SEQ_LOGIN_ID
START WITH 1
INCREMENT BY 1
MAXVALUE 99999999;
-- Déclencheur associé
CREATE OR REPLACE TRIGGER TRG_LOGIN_AUTOINC
BEFORE INSERT ON TAB_USERS
FOR EACH ROW
BEGIN
SELECT SEQ_LOGIN_ID.NEXTVAL INTO :NEW.USER_ID FROM DUAL;
END;
/</code>
Opérations sur Chaînes de Caractères
Diverses fonctions permettent la recherche, la découpe et la substitution de texte. Le calcul incluant des positions négatives commence par la fin de la chaîne.
<code>-- Recherche de sous-chaîne
SELECT INSTR(COLONNE_ADRESSE, 'DESTINATION') > 0 RESULTAT
FROM TAB_INFO;
-- Extrait de caractères (départ 0)
SUBSTR('TEXTE_EXEMPLE', 0); -- Retourne tout
SUBSTR('TEXTE_EXEMPLE', 2); -- De la 2ème position
SUBSTR('TEXTE_EXEMPLE', 2, 5); -- 5 caractères à partir de 2
SUBSTR('TEXTE_EXEMPLE', -3); -- 3 derniers caractères
-- Remplacement
SELECT REPLACE('CHAINEROLE', 'ROLE', 'NOUVEAU') FROM DUAL;</code>
Gestion Temporelle et Calendaires
Les intervalles supportent l'ajout direct de temps variés. Les dates peuvent être formattées dynamiquement.
<code>-- Opérations sur SYSDATE
SYSDATE + INTERVAL '1' YEAR
SYSDATE + INTERVAL '1' MONTH
SYSDATE + INTERVAL '1' DAY
SYSDATE + INTERVAL '1 HOUR TO MINUTE'
-- Conversion de formats spécifiques (ex: jour mois année)
TO_CHAR(TO_DATE(CHAMP_DAT, 'DD-MON-YY'), 'YYYY-MM-DD');</code>
Calculs de Différences de Temps
Convertir la différence entre deux timestamps en unités spécifiques (jours, heures, minutes).
<code>SELECT TO_NUMBER(TO_DATE('2023-06-01','DD-MM-YYYY') - TO_DATE('2023-05-01','DD-MM-YYYY')) AS JOURS
FROM DUAL;
SELECT TO_NUMBER((DATE_DEBUT - DATE_FIN) * 24) AS HEURES
FROM DUAL;</code>
Pour les écarts mensuels ou annuels, utilisez les fonctions dédiées qui gèrent les mois de longueur variable.
<code>SELECT MONTHS_BETWEEN(DATE_FIN, DATE_DEBUT) / 12 AS ANS_COMPART
FROM DUAL;</code>
Programmasion PL/SQL
Filtrage dans les Procédures
L'utilisation correcte des opérateurs comme LIKE dans les requêtes internes demande attention à la concaténation.
<code>PROCEDURE RECUPERATION_PLAN(IN_KEY IN VARCHAR2, OUT_CUR OUT SYS_REFCURSOR) IS
BEGIN
OPEN OUT_CUR FOR
SELECT * FROM TB_PLANIFICATION WHERE NOM LIKE '%' || IN_KEY || '%';
END;</code>
Logique Conditionnelle
Le bloc CASE permet de gérer plusieurs conditions sans imbriquer excessivement les boucles IF.
<code>CASE V_ID
WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('Option A');
WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Option B');
ELSE DBMS_OUTPUT.PUT_LINE('Autre');
END CASE;</code>
Gestion des Erreurs
Capturez systématiquement les exceptions lors des opérations SELECT INTO pour éviter les plantages silencieux.
<code>BEGIN
SELECT AGE, SEXE, NOM INTO VAR_A, VAR_B, VAR_C FROM EMP_LOYERS
WHERE ID_EMP = P_ID;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Aucun résultat trouvé');
END;</code>
Requêtes Avancées
Hiérarchie et Arborescence
Utilisez CONNECT BY PRIOR pour naviguer dans les données parent-enfant.
<code>SELECT DISTINCT * FROM ENTREE_DATA
START WITH NODE_UNIQUE = 'ROOT_001'
CONNECT BY PRIOR NODE_UNIQUE = PARENT_UNIQUE
ORDER SIBLINGS BY INDEX_NIVEAU;</code>
Conversion Lignes/Colonnes
La fonction LISTAGG agrège des valeurs, tandis que PIVOT transforme les lignes en colonnes dynamiques.
<code>-- Agrégation
SELECT ID, LISTAGG(VALEUR, ', ') WITHIN GROUP (ORDER BY VAL)
FROM SOURCE_VIEW GROUP BY ID;
-- Pivot simple
SELECT * FROM VUE_ETUDE
PIVOT (MAX(PORTE) FOR COTE IN ('OD' AS OD, 'OS' AS OS));</code>
Analytique Fonctions
Attribuez des numéros de rang selon des groupes spécifiques ou globalement.
<code>-- Rang dense global
SELECT NOM_PATIENT, DATHE_VISITE, DENSE_RANK() OVER(ORDER BY NOMBRE_VISITES) AS RANG
FROM HISTORIQUE_VISITES;
-- Rang partitionné par patient
SELECT *, ROW_NUMBER() OVER(PARTITION BY PATIENT_ID ORDER BY VISITE_DATE) AS NUMEROTATION
FROM DONNEES_TEMP;</code>
Maintenance Système
Scripts de Sauvegarde
Automatisez les sauvegardes via des tâches bat en utilisant l'utilitaire exp pour exporter les données brutes.
<code>@echo off
set DB_CONN=user/pass@localhost:port/service
set BACK_PATH=D:\BACKUPS
set NOM_FILE=%BACK_PATH%\backup_%date%_%time%.dmp
exp %DB_CONN% FILE=%NOM_FILE% LOG=%BACK_PATH%\log.txt FULL=Y;</code>
Tâches Programmées
Si les jobs planifiés ne s'exécutent pas, vérifiez que le paramètre processeur de queue est activé.
<code>show parameter job_queue_processes;
-- Augmentez si nécessaire
alter system set job_queue_processes=8 scope=both;</code>