# Oracle Database/Version imprimable

* Si vous imprimez cette page, choisissez « Aperçu avant impression » dans votre navigateur, ou cliquez sur le lien Version imprimable dans la boîte à outils, vous verrez cette page sans ce message, ni éléments de navigation sur la gauche ou en haut.
* Cliquez sur Rafraîchir cette page pour obtenir la dernière version du wikilivre.
* Pour plus d'informations sur les version imprimables, y compris la manière d'obtenir une version PDF, vous pouvez lire l'article Versions imprimables.
Une version à jour et éditable de ce livre est disponible sur Wikilivres, une bibliothèque de livres pédagogiques, à l'URL : https://fr.wikibooks.org/wiki/Oracle_Database

# Introduction
## Présentation

Oracle Database est un système de gestion de base de données (SGBD) des plus employés au monde. Il fût créé en 1979 et son langage de requête est nommé PL/SQL.

## Installation d'Oracle

Oracle est disponible sur Windows et Linux, en plusieurs versions :
* Express Edition (XE) : gratuite mais en version plus ancienne que la payante (ex : 11g au lieu de 12c en 2016), avec une limite de stockage quatre gigaoctets en monoprocesseur.
* Standard Edition One : sans limite de stockage, ni support des systèmes multiprocesseurs.
* Standard Edition (SE2) : gestion de clusters (Oracle Real Application Clusters, alias Oracle RAC).
* Enterprise Edition (EE) : aucune limite.
* Personal Edition (PE) : non disponible en version 12. Il s'agissait d'une sorte de EE mono-utilisateur.
Remarque : on peut télécharger et installer les versions payantes gratuitement, mais il faut décocher la case "Recevoir les mise à jour de sécurité".
Une fois téléchargé, il suffit de décompresser le ou les .zip, s'il y en a deux il faut les fusionner (dossier "database"), puis de lancer pour l'installer :
* Dans Linux, runInstaller.sh.
* Dans Windows, le setup.exe.

### Script de lancement

Oracle se lance ensuite automatiquement à chaque démarrage de la machine, ce qui la ralentit significativement.
Pour éviter cela :
* Dans Linux : voir /etc/init.d.
* Dans Windows : exécuter services.msc, puis passer les services OracleServiceXE et OracleXETNSListener en démarrage manuel. Ensuite pour lancer le service à souhait (en tant qu'administrateur), créer un script Oracle.cmd contenant les lignes suivantes :
** Pour XE : net start OracleServiceXE net start OracleXETNSListener pause net stop OracleXETNSListener net stop OracleServiceXE
** Pour SE : net start OracleServiceORCL net start OracleDB12Home1TNSListener pause net stop OracleDB12Home1TNSListener net stop OracleServiceORCL
Si le message "Accès refusé" survient, relancer le script avec un clic droit, en tant qu'administrateur.

### Prérequis

Le serveur de base de données doit avoir au moins :
* 1 Go d'espace libre sur le disque dur pour XE, 3,5 pour SE.
* 1 Go de RAM.
* Windows, Linux, Oracle Solaris, ou IBM AIX.
Depuis la version 12c il faut obligatoirement un processeur 64 bits.

## Références

* ↑ http://db-engines.com/en/ranking
* ↑ http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html
* ↑ https://docs.oracle.com/html/B13614_01/preinsta.htm#i1067829

## Voir aussi

* (anglais) Procédure d'installation
* (anglais) Cours officiels
* (français) Tutoriels developpez.com

# Interfaces
## SQL*Plus

SQL*Plus est une interface de commandes fournie avec le SGBD. Sous Windows elle peut se lancer soit :
* Depuis le menu démarrer, répertoire Oracle, raccourci Run SQL Command Line.
* Via C:\oraclexe\app\oracle\product\11.2.0\server\bin\sqlplus.exe.
* Mais le mieux est de passer par la variable d'environnement en se connectant au SGBD en même temps. Par défaut cela se fait en console shell avec :
Sinon si vous avez déjà un compte, la syntaxe est :
La première étape est de créer un utilisateur (ex : root), l'autoriser à se connecter, puis lui conférer les droits administrateur (sysdba).

### Sous 12c

Avec la version 12c sont apparues les CDB et PDB. Ainsi la commande ci-dessus renvoie l'erreur ORA-65096: nom utilisateur ou de rôle commun non valide.
Il faut donc distinguer les comptes qui commencent par "c##" qui fonctionnent sur toute la CDB mais qu'il est impossible de promouvoir administrateur, de ceux propres à une PDB.
Dans ce cas nous allons utiliser le compte "sys" dont le mot de passe a été défini à l'installation.

## Interface Web

Une deuxième interface est fournie avec le SGBD : l'interface web. On y accède soit :
* Pour SE 12c :
** https://localhost:5500/em/shell
* Pour XE 11g :
** Depuis le menu démarrer, répertoire Oracle, raccourci Get Started.
** Par l'URL http://localhost:8080/apex/f?p=4950.
* Pour XE 10g :
** Depuis le menu démarrer, Database control.
** http://localhost:1158/em/console/logon/logon.
Ensuite il pour se connecter au SGBD :
* User name : sys (parfois sysman pour system manager)
* Password : celui fourni à l'installation.
* Connect as : SYSDBA.
La console apparait alors, permettant de modifier la configuration de la base de données créée à l'installation (redémarrer le service, suivre l'architecture, les performances, gérer les sauvegardes...).
En cliquant sur Application Express, on peut éventuellement créer un nouvel utilisateur qui sera utilisé pour se connecter à Oracle. Une fois logué, celui-ci a accès à tous les outils de manipulation des données, par exemple SQL Workshop\SQL Commands pour entrer du code SQL.
Si vous préférez créer un premier compte par les interfaces graphiques, il faudra tout de même utiliser la connexion par défaut SQL*Plus pour le GRANT.

## Oracle SQL Developer

Oracle SQL Developer est un EDI conçu en Java. Il est fournit avec SE mais pour XE il faut télécharger son client lourd sur http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html.
Une fois installé et lancé, il faut lui configurer une connexion pour qu'il puisse s'authentifier auprès des bases de données Oracle. Remplir le compte créé par l'interface web, pour pouvoir accéder aux manipulations de données.
Pour commencer à exécuter du code, faire un clic droit sur la connexion, puis cliquer en bas sur Ouvrir une feuille de calcul SQL. Sinon il est possible de le travailler depuis un fichier (pour le sauvegarder) en cliquant en haut à gauche sur Nouveau (l'icône du plus ou CTRL + N), puis Fichier de base de données.

## DBCA

Database Configuration Assistant (DBCA) est une interface graphique disponible sur Windows ou les *nixes.

## Hello world

Une fois l'une des consoles SQL vues précédemment lancée, il devient possible d’exécuter du PL/SQL (Procedural Language/Structured Query Language) : le langage procédural propriétaire créé par Oracle, et spécifique à sa base de données relationnelle.
Le slash dit au programme de stopper l'instruction multiligne.

## Références

* ↑ http://www.snapdba.com/2013/05/creating-an-oracle-11g-database-using-dbca-non-asm/
* ↑ http://docs.oracle.com/cd/B16351_01/doc/server.102/b14196/install003.htm

# Gestion des utilisateurs
## Comptes
### Suppression

Par ailleurs, il est possible de supprimer en cascade tous les objets associés à un utilisateur :

## Rôles
### Création

Un rôle peut en contenir plusieurs autres. Par exemple celui ci-après permet de se connecter en administrateur :
Il suffit ensuite de l'assigner à un compte utilisateur :
Et il peut être révoqué ainsi :

### Modification

Par exemple pour changer de mot de passe :

### Suppression
# Tablespaces
## Architecture

L'architecture Oracle ne comprend qu'une seule base par serveur, dans laquelle peuvent se trouver plusieurs tablespaces, équivalents des objets bases de données d'autres SGBD comme MySQL et MS-SQL, contenant des tables et procédures stockées.
Dans la version Express Windows, ces données sont stockées dans C:\oraclexe\app\oracle\oradata\XE\.
Les variables et mots-clés sont insensibles à la casse.

## Créer des tablespaces

Une fois connecté, il est possible de commencer à créer directement des tables dans le tablespace par défaut (Nom de connexion Admin). Toutefois au préalable, on peut en créer d'autres dans des fichiers précis :
Pour lister ceux qui existent :
Il y en a plusieurs par défaut :
* SYSTEM : les objets du système.
* SYSAUX : depuis la version 10g, tablespace auxiliaire du précédent pour certains objets du système (ex : Statspack, Advisor, Scheduler).
* TEMP : tables temporaires pour les tris.
* UNDO : depuis la 9i, utilisé pour les transactions (commit, rollback)
* USERS : c'est le tablespace où sont créés les objets des utilisateurs par défaut.

## Supprimer des tablespaces

Le fichier .dbf ne disparait pas avec cette commande.

## Références

* ↑ http://www.tuto-dba-oracle.com/serveur-oracle.html

# Tables
## Lister les tables

Pour obtenir la liste des tables du tablespace courant :

## Créer des tables

En reprenant l'exemple du livre SQL :
En passant par un clic droit sur les tables, Nouvelle table..., SQL Developer permet de générer puis exécuter cette démarche :
Dans cette commande, on a précisé le tablespace dans lequel rattacher la nouvelle table avec le mot clé TABLESPACE dans la clause de création. Mais SQL Developer le permet en le sélectionnant dans l'interface graphique.

## Modifier la structure des tables

Exemple de renommage :
Ajout d'une contrainte sur les valeurs du premier champ :
Ajout d'une clé primaire :
Retrait d'une clé primaire :
Ajout d'une clé étrangère :

## Insérer des lignes

Plusieurs lignes :
Table crée :
| ID | PRENOM | NOM | ADRESSE |
| 1 | Sarah | Croche | Petaouchnoc |
| 2 | Sarah | Pelle | Clochemerle |
| 3 | Sarah | Porte | Cuges-les-Bains |

## Lire une table

Pour accéder à sa structure :
Si la table n'existe pas, l'erreur qui apparait est ORA-00923: FROM keyword not found where expected.
Pour son contenu :
Le nombre de tirets correspond à la taille du champ.

## Partitionner une table

Le partitionnement Oracle sert à diviser les données d'une table volumineuse dans plusieurs plus petites afin d'en augmenter les performances.

### Range

Exemple :

### Hash

Exemple :

### List

Exemple :

### Interval

Exemple :

## Schémas

Un schéma est un ensemble de permissions pour des tables ou procédures stockées. Le mot clé AUTHORIZATION permet de donner des droits à un utilisateur :

## Synonymes

Un synonyme est un alias d'un nom de table (ou d'autres objets). Il peut être utilisé pour la sécurité en masquant le nom du propriétaire de l'objet vers lequel il pointe, ou bien pour uniformiser les noms d'objets distants dans les bases de données distribuées.

## Références

* ↑ https://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_6013.htm
* ↑ https://docs.oracle.com/cd/B28359_01/server.111/b28310/views003.htm

# Vues
## Principe

Une vue est une table virtuelle, utilisée pour afficher le résultat d'une requête fréquente, selon des permissions précises (ex : afficher des colonnes seulement pour un utilisateur).

## Créer une vue

La vue suivante n'a pas grand intérêt car elle est redondante d'une table :

## Actualiser une vue

Les enregistrements de la vue s'actualisent automatiquement, mais si la structure d'une des tables appelées par la vue change, cette dernière renvoie une erreur. Il faut donc la mettre à jour avec :

## Lister les vues

La colonne TEXT affiche la requête SQL générant le vue.

## Vues temporaires

Depuis la version 10g, il est possible de définir une vue temporaire à la volée au milieu d'un script :
Exemple :

# Vues matérialisées

Les vues matérialisées sont des vues figées, c'est-à-dire le résultat d'une requête à un certain moment.

## Créer des vues matérialisées

Création basique :
Avec durée de rafraichissement quotidienne :
En effet, select SYSDATE from DUAL donne la date du jour.

## Références

* ↑ https://docs.oracle.com/cd/B10501_01/server.920/a96567/repmview.htm

# Index
## Principe

Un index sert à trouver les enregistrements résultats d'une requête plus rapidement que par un parcours séquentiel.

## Lister les index
# Procédures stockées
## Création

Une procédure stockée est un script enregistré dans la base de données sous un nom par lequel on peut l'exécuter depuis d'autres.

### Appel

ou

## Exemples
# Fonctions
## Création

Une fonction doit impérativement renvoyer quelque chose, par une clause RETURN.

# Packages
## Principe

Un package Oracle est un schéma regroupant divers objets tels que des types et des sous-programmes. Ces modules peuvent ensuite être appelés par différents scripts.
Appel :
L'avantage est que si un jour on décide d'augmenter la taille des noms de famille à 1 000 caractères, il suffit de le faire dans un seul package au lieu de parcourir toutes les fonctions, procédures et triggers.

## Références

* ↑ https://docs.oracle.com/cd/A97630_01/appdev.920/a96624/09_packs.htm

# Trigger
## Syntaxe

Désignations :
* :new : nouvelle ligne
* :old : ancienne ligne
* :parent : table parente

## Références

* ↑ http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm

# Séquences
## Syntaxe

Une séquence est un compteur prédéfini, utilisé par exemple pour incrémenter les clés uniques.
Cela évite d'insérer des lignes en déterminant la valeur d'un ID avec la couteuse clause select max(id)+1 from client1.
Pour l'utiliser, on a le choix de la valeur courante ou suivante :

## Exemples
# PL/SQL

Consultez également ces pages dans d’autres projets Wikimedia :
* Article encyclopédique sur Wikipédia.
* Définition sur Wiktionnaire.
PL/SQL pour Procedural Language SQL est un langage de programmation d'Oracle, spécialisé dans l'accès à ses bases de données. C'est donc une extension de la norme SQL.

## Structure d'un programme

Le code PL/SQL est structuré en "blocs" dont la structure générale est la suivante :

### Commentaires
## Fonctions natives

PL/SQL offre plusieurs packages prédéfini :
* DBMS_OUTPUT : utilisé pour afficher des messages pendant l'exécution du code
* DBMS_JOB : permet de lancer du code en tâche de fond
* DBMS_XPLAN : permet d'obtenir le plan d'exécution d'une commande SQL
* DBMS_SESSION
* DBMS_METADATA
* UTL_FILE : permet de gérer les fichiers sur le disque, en dehors de la base
* UTL_HTTP
* UTL_SMTP

## Types du langage
### Types natifs

Les principaux types de donnée en PL/SQL sont : NUMBER, INTEGER, CHAR (chaine de longueur fixe), VARCHAR2 (chaine de longueur variable), DATE, TIMESTAMP, TEXT, etc.
Le symbole « := » est utilisé pour l’affectation d'une valeur.
Les types de chaînes de caractères, il existe plusieurs familles de types de textes :
| codage | nombre fixé de caractères | nombre variable de caractères |
| caractère | CHAR | VARCHAR2 |
| caractère Unicode (cf À la découverte d'Unicode ) | NCHAR | NVARCHAR2 |

### Créer un type
## Variables Composées
### Tableaux
#### Méthodes disponibles pour/avec les variables tableau

* Tab.first
* Tab.count
* Tab.next(indice)
* Tab.last
* Tab.prior(indice)
* Tab.delete(indice)

### Enregistrements
## Structures de contrôle
### Exemples

* Exemples 1
Mettre la date à jour dans la db
* Exemples 2
Créer un record qui contient matricule, nom, prénom
* Exemples 3
Chercher dans une table ListeDeCourse
* Exemples 4
Relevé méteo
* Exemples 5
Créer un tableau de 10 nombres
* Exemples 6
Augmenter de 10 % tous les logiciels Photoshop
* Exemples 7
Insérer un élément dans la table locaux
* Exemples 8
Vérifie si le prix du logiciel encodé est supérieur à la moyenne

## Curseurs

* Explicite :
Un curseur explicite est un curseur déclaré explicitement avec le mot-clef CURSOR dans le bloc PLSQL.
* Implicite :
Un curseur implicite est un curseur généré automatiquement par Oracle pour une commande SQL incluse généralement dans un bloc PLSQL.
* Exemples :
* Explicite :
* Implicite :

## Exceptions
### Exception prédéfinie

* Exemples 1
* Exemples 2
Cherche l'employé n°555 et prévois le cas ou il n'existe pas.
* Exemples 3
demander un nom à l'utilisateur et prévoir le cas où il inscrit trop de lettres

### Types d'exceptions prédéfinie

* invalid_cursor
* invalid_number
* no_data_found
* too_many_rows
* value_error
* zero_divide
* dup_val_on_index

### Exceptions personnalisées

* Exemple 1 :

# Oracle ignore le type booléen

Oracle ne respecte pas totalement SQL:1999 et ne dispose pas de type booléen. Ce type doit être recréé suivant deux stratégies, dont aucune ne prévaut véritablement sur l'autre.

## Utilisation de CHAR

La première façon d'émuler le type booléen est d'utiliser les CHAR, notamment les char de dimension 1 : CHAR(1) 'Y'/'N'
L'inconvénient de la méthode est qu'il rend la notion dépendante de la langue utilisée. Et cela peut devenir perturbant pour un développeur récupérant un travail fait dans un autre pays.

## Utilisation de NUMBER

La deuxième façon d'émuler le type booléen est d'utiliser les NUMBER, de dimension 1 : NUMBER(1) 0/1
Cette méthode n'est pas toujours sans inconvénient. Les utilisateurs de Visual Basic, par exemple, sont habitués à donner à True la valeur -1 !

## Références

* http://www.developpez.net/forums/d165180/bases-donnees/oracle/oracle-8i-type-boolean/
* https://docs.oracle.com/cd/B19306_01/olap.102/b14346/dml_datatypes004.htm#CJACGBGE
* http://stackoverflow.com/questions/3726758/is-there-a-boolean-type-in-oracle-databases

# Oracle ignore l'autoincrement

La fonction AUTO_INCREMENT de MySQL est très pratique pour déléguer le calcul d'un nouvel identifiant (entier) d'une ligne au système. Malheureusement, cette fonction n'existe pas pour Oracle et il faut donc passer par la création d'une séquence pour obtenir le même résultat.

## Exemple pratique

La requête suivante illustre la création d'une table munie de l'équivalent de la fonction d'auto-incrémentation: Elle créé une sequence nommée "SQ_FOOTBALL_MATCH", commençant à 1, incrémentée automatiquement par pas de 1. Aucune valeur ne sera stockée en cache.
Pour insérer une nouvelle ligne dans la table ainsi créée:
Cette instruction va récupérer la prochaine valeur fournie par la séquence "SQ_FOOTBALL_MATCH" et proposer celle-ci comme valeur MATCH_ID de la ligne insérée.

# Quelques requêtes utiles/Dictionnaire de données

Le dictionnaire de données Oracle est un ensemble de tables système, qui contiennent les informations de fonctionnement de la base de données comme :
* Les utilisateurs
* Les tables
* Les contraintes d'intégrité
* etc.
Ces informations sur les informations sont appelées méta données.
Les informations du dictionnaire de données sont consultables par l'administrateur SYSTEM. De nombreuses vues permettent d'accéder à des contenus spécifiques (comme ceux énumérés précédemment).

## Afficher toutes les vues du dictionnaire

La requête suivante, adaptable en commentant/décommentant les éléments souhaités, permet de lister divers éléments du dictionnaire

## Afficher quelques vues dynamiques utiles au DBA

La requête suivante, adaptable en commentant/décommentant les éléments souhaités, permet d'obtenir quelques informations et statistiques

## Afficher toutes les tables dynamiques

Les tables dynamiques correspondent à des zones de la mémoire SGA lorsqu'Oracle est en activité (elles disparaissent à l'arrêt de la base)

## Travailler sur les méta-informations des tables

Le dictionnaire de données permet de collecter des informations par introspectif.

### Lister les colonnes d'une table
# Quelques requêtes utiles/Paramètres système

Il est possible de lire (et même modifier) des paramètres système par simple requêtage.

## Afficher les informations de version

Pour savoir quelles versions (et composants) on utilise.

## Afficher les paramètres système modifiables dans la session

La requête suivante, adaptable en commentant/décommentant les éléments souhaités, permet de lister divers paramètres système et d'ordonner ceux-ci selon qu'ils soient modifiables ou pas.

# Quelques requêtes utiles/Utiliser les dates

L'utilisation des dates dans une base de données réserve toujours son lot de surprises.
D'une manière générale, l'utilisation de l'égalité est une mauvaise idée pour les dates, celle-ci étant rarement vérifiée du fait de la précision des dates qui excède celle des usages courants. Mieux vaut utiliser les opérateurs de comparaison < et > et définir des intervalles.

## Exemple basique de requête utilisant les dates

La requête suivante illustre l'utilisation d'une date.

# Quelques requêtes utiles/Modifier une ligne

La mise à jour d'un enregistrement (ou plusieurs) se fait par l'intermédiaire de l'expression UPDATE.

## Exemple de mise à jour

La requête suivante illustre la modification d'une ligne (À noter aussi l'utilisation d'une double concaténation).

## Références

* ↑ http://www.w3schools.com/sql/sql_autoincrement.asp
* ↑ http://www.commentcamarche.net/contents/700-oracle-le-dictionnaire-de-donnees
* ↑ http://didier.deleglise.free.fr/dba/dictionnaire/dict_main.htm
* http://www.techonthenet.com/oracle/update.php
* https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions026.htm

# Quelques requêtes utiles/Analyse d'une table

Quelques fonctions utiles pour analyser les données d'une table.

## Nombre de valeurs distinctes par colonnes

La requête suivante permet de déterminer le nombre de valeurs distinctes pour chaque colonne : Les ";" en fin de titre de colonne permettent une segmentation plus facile.

# Utilisation de fonctions

Principe : utilisation de tables temporaires, créées pour l'exemple et non persistantes. Ainsi, un copier/coller de l'exemple permet de tester immédiatement le concept et sans risque d'altération de la base utilisée par le lecteur.

# Utilisation de fonctions/Fonction UNPIVOT

La méthode UNPIVOT permet de transformer des colonnes en lignes supplémentaires. Son principe est d'introduire 2 nouvelles colonnes liées, à la place des N colonnes spécifiées :
* la première colonne (N) dans le résultat indique le nom de la colonne
* la deuxième colonne (V) indique la valeur de la colonne indiquée
Cette méthode peut être utile pour réduire le nombre de colonnes, et/ou appliquer aux valeurs stockées en colonnes les traitements applicables aux lignes.
Syntaxe :

## colonne_valeur

    La nouvelle colonne (V) indiquant la valeur associée.

## colonne_nom

    La nouvelle colonne (N) indiquant le nom de la colonne transformée en ligne.

## colonne_1, colonne_2, ...

    Liste des colonnes à transformer en lignes.

## Illustration

La requête suivante illustre la modification d'une ligne (à noter aussi l'utilisation d'une double concaténation).
* Résultat sans rien décommenter :
| MESUREID | CAPTEUR1 | CAPTEUR2 | CAPTEUR3 | CAPTEUR4 | CAPTEUR5 |
| 1 | 4 | 3 | 5 | 4 | 4 |
| 2 | 4 | 1 | 5 | 51 | 5 |
| 3 | 4 | 3 | 5 | 9 | 4 |
| 4 | 3 | 91 | 5 | 5 | 4 |
| 5 | 4 | 1 | 5 | 5 | 5 |
* Résultat en décommenter la 1ère ligne UNPIVOT :
| MESUREID | CAPTEUR2 | CAPTEUR3 | CAPTEUR4 | CAPTEUR5 | COLONNE | VALEURCOLONNE |
| 1 | 3 | 5 | 4 | 4 | CAPTEUR1 | 4 |
| 2 | 1 | 5 | 51 | 5 | CAPTEUR1 | 4 |
| 3 | 3 | 5 | 9 | 4 | CAPTEUR1 | 4 |
| 4 | 91 | 5 | 5 | 4 | CAPTEUR1 | 3 |
| 5 | 1 | 5 | 5 | 5 | CAPTEUR1 | 4 |
* Résultat en décommenter la dernière ligne UNPIVOT :
| MESUREID | COLONNE | VALEURCOLONNE |
| 1 | CAPTEUR1 | 4 |
| 1 | CAPTEUR2 | 3 |
| 1 | CAPTEUR3 | 5 |
| 1 | CAPTEUR4 | 4 |
| 1 | CAPTEUR5 | 4 |
| 2 | CAPTEUR1 | 4 |
| 2 | CAPTEUR2 | 1 |
| 2 | CAPTEUR3 | 5 |
| 2 | CAPTEUR4 | 51 |
| 2 | CAPTEUR5 | 5 |
| 3 | CAPTEUR1 | 4 |
| 3 | CAPTEUR2 | 3 |
| 3 | CAPTEUR3 | 5 |
| 3 | CAPTEUR4 | 9 |
| 3 | CAPTEUR5 | 4 |
| 4 | CAPTEUR1 | 3 |
| 4 | CAPTEUR2 | 91 |
| 4 | CAPTEUR3 | 5 |
| 4 | CAPTEUR4 | 5 |
| 4 | CAPTEUR5 | 4 |
| 5 | CAPTEUR1 | 4 |
| 5 | CAPTEUR2 | 1 |
| 5 | CAPTEUR3 | 5 |
| 5 | CAPTEUR4 | 5 |
| 5 | CAPTEUR5 | 5 |
| 25 rows selected |||

## Cas pratique d'utilisation

Gardons de la table exemple précédente la 1ere et la dernière ligne seulement. Le but sera de recenser les colonnes pour lesquelles ces lignes ont des valeurs différentes. Pour ce faire, on va
* d'abord transformer les colonnes en lignes avec UNPIVOT
* Puis dénombrer les valeurs ainsi transformées.
* Filtrer les lignes créées, de couples (colonne, valeur), qui sont présentes une seule fois (ie les colonnes dont la valeur a changé)
* Et enfin distinguer les noms de colonnes du précédent ensemble
L'exemple sera plus parlant :
* Résultat en décommentant le premier select (« select * from Mesure ») :
| MESUREID | CAPTEUR1 | CAPTEUR2 | CAPTEUR3 | CAPTEUR4 | CAPTEUR5 |
| 1 | 4 | 3 | 5 | 4 | 4 |
| 5 | 4 | 1 | 5 | 5 | 5 |
* Résultat en décommentant le deuxième select (« select * from Denombrement ») :
| COLONNE | VALEURCOLONNE | NOMBRE |
| CAPTEUR2 | 3 | 1 |
| CAPTEUR5 | 4 | 1 |
| CAPTEUR2 | 1 | 1 |
| CAPTEUR1 | 4 | 2 |
| CAPTEUR3 | 5 | 2 |
| CAPTEUR5 | 5 | 1 |
| CAPTEUR4 | 4 | 1 |
| CAPTEUR4 | 5 | 1 |
* Résultat en décommentant le dernier select (« select distinct COLONNE from Denombrement where nombre=1 ») :
* COLONNE
* CAPTEUR5
* CAPTEUR2
* CAPTEUR4

### Généralisation de la requête précédente

Bien sûr, pour un exemple aussi simple que celui pris, il serait plus simple de recenser par soi même les colonnes variantes. Mais si la table considérée faisait 300 colonnes, avec des noms complexes, alors un recensement à la main serait extrêmement fastidieux et probablement source d'erreurs !
La démarche idéale supposerait d'agir en deux temps :
* Tout d'abord, [[../../Quelques requêtes utiles/Dictionnaire de données#Lister les colonnes d'une table|lister les colonnes]] de la table cible
* Copier coller le résultat de la requête précédente en lieu et place de "Capteur1, Capteur2, Capteur3, Capteur4, Capteur5"

# Utilisation de fonctions/fonction LISTAGG

La méthode LISTAGG permet de concaténer les valeurs d'une colonne, en gérant la séparation (typiquement, avec des "," qui est le choix par défaut). Cette fonction est disponible depuis la version Oracle 11g

## Illustration

La requête suivante illustre l'utilisation de cette fonction.

### Résultat du 1er select (« select * from GROUPE »)

| PRENOM | SEXE | AGE |
| Claire | F | 25 |
| Jean-Sebastien | M | 32 |
| Kevin | M | 19 |
| Marie | F | 23 |
| Natacha | F | 31 |

### Résultat du 2e select

* Membres féminins du groupe
* Claire, Marie, Natacha

### Résultat du 3e select

* Membres trentenaires du groupe
* Jean-Sebastien, Natacha

## Cas pratique d'utilisation

La requête suivante permet de lister les colonnes de type 'NUMBER' d'une table 'MA_TABLE', en concaténant les noms.
Cette requête peut s'avérer utile pour utiliser la fonction UNPIVOT.

# Utilisation de fonctions/fonction DECODE

La fonction DECODE correspond à une fonction (IF, EQUALS, THEN, ELSE), voire (IF,THEN,ELSIF,ELSIF,...,ELSIF,ELSE) dans son utilisation avec plus de quatre arguments.
Plusieurs utilisations sont possibles, selon le nombre de cas de figure prévues :
| Nombre de tests | Nombre d'arguments | Syntaxe |
| 1 | 4 | DECODE (Expression, Egalité, BlocTrue, BlocFalse) |
| 2 | 6 | DECODE (Expression, Egalité1, BlocTrue1, Egalité2, BlocTrue2, BlocFalse) |
| 3 | 8 | DECODE (Expression, Egalité1, BlocTrue1, Egalité2, BlocTrue2, Egalité3, BlocTrue3, BlocFalse) |
| etc... N | 4+2*(N-1) | DECODE (Expression, Egalité1, BlocTrue1, ...................................., EgalitéN, BlocTrueN, BlocFalse) |

## Exemple d'utilisation

La requête suivante illustre l'utilisation de cette fonction.

### Résultat en décommentant "SELECT * FROM Mesure"

| MESUREID | CAPTEUR1 | CAPTEUR2 | CAPTEUR3 | CAPTEUR4 | CAPTEUR5 |
| 1 | 4 | 3 | 5 | 4 | 4 |
| 2 | 4 | 1 | 5 | 51 | 5 |
| 3 | 4 | 3 | 5 | 9 | 4 |
| 4 | 3 | 91 | 5 | 5 | 4 |
| 5 | 4 | 1 | 5 | 5 | 5 |

### Résultat sans rien décommenter

| MESUREID | Capteur du Jardin | Capteur du parking | Capteur de la Cuisine | Capteur du toit | Capteur du Grenier |
| 1 | Quatre | RAS | Cinq | Plage faible | Quatre |
| 2 | Quatre | RAS | Cinq | Plage forte | Cinq |
| 3 | Quatre | RAS | Cinq | Plage moyenne | Quatre |
| 4 | Trois | NOTABLE | Cinq | Plage moyenne | Quatre |
| 5 | Quatre | RAS | Cinq | Plage moyenne | Cinq |

# Bases de données multimédia
## Description

Oracle Multimedia est une suite de services fournie avec Oracle Database (sauf la version Express où on ne peut pas l'ajouter) depuis la version 8 (en 1997), pour gérer des bases de données multimédia.
Elle est constituée d'un package ORDSYS ("ORD" pour object-relational data) permettant la gestion des objets multimédia dans la base. Il comprend plusieurs classes :
* ORDMultimedia : superclasse abstraite stockant les attributs et méthodes communs aux classes ORDAudio, ORDImage, et ORDVideo.
* ORDAudio : stockage des caractéristiques des sons.
* ORDDoc : stockage des caractéristiques des documents hétérogènes.
* ORDImage : stockage des caractéristiques des images.
* ORDVideo : stockage des caractéristiques des vidéos.
* ORDSource : stockage des sources multimédia dans des BLOB de la base, ou des BFILE accessibles en HTTP.
* DICOM (Digital Imaging and Communications in Medicine).
Attributs :
| ORDAudio | ORDDoc | ORDImage | ORDVideo |
| description | source | source | description |
| source | format | height | source |
| format | mimeType | width | format |
| mimeType | contentLength | contentLength | mimeType |
| comments | comments | fileFormat | comments |
| encoding | | contentFormat | width |
| numberOfChannels | | compressionFormat | height |
| sampleSize | | mimeType | frameResolution |
| compressionType | | | frameRate |
| audioDuration | | | videoDuration |
| | | | numberOfFrames |
| | | | compressionType |
| | | | numberOfColors |
| | | | bitRate |

## Utilisation

Oracle HTTP Server permet d'exécuter des requêtes PL/SQL depuis un navigateur.

## Références

* ↑ (en) « Managing Oracle Multimedia Installations »
* ↑ http://fildz.developpez.com/tutoriel/oracle-java/ordimage/
* ↑ (en) « Common Methods and Notes for Oracle Multimedia Object Types », sur Oracle.com
* ↑ (en) « Common Methods and Notes for Oracle Multimedia Object Types », sur Oracle.com
* ↑ (en) Oracle 10g Developing Media Rich Applications, 8 avril 2011 (lire en ligne)
* ↑ (en) « Medical Imaging and Communication », sur Oracle.com
* ↑ (en) « ORDAudio », sur Oracle.com
* ↑ (en) « ORDDoc », sur Oracle.com
* ↑ (en) « ORDImage », sur Oracle.com
* ↑ (en) « ORDVideo », sur Oracle.com
* (en) « Multimedia User's Guide », sur Oracle.com

# Bases de données spatiotemporelles
## Données spatiales

Lors du typage des champs, certains représentent des objets graphiques, et sont donc considérés comme étant de catégorie "Spatial" (cf. base de données spatiales). Par conséquent, ils se manipulent par des requêtes différentes que pour le texte.
Sous Oracle, c'est implémenté depuis la version 7 dans une extension de la version Enterprise Edition, fournissant des objets avec des préfixes SDO pour Spatial Data Option.

## Objets

Pour stocker les objets spatiaux, on utilise le type de champs SDO_GEOMETRY.
Ainsi que sept méthodes pour le manipuler :
* Get_Dims
* Get_GType
* Get_LRS_Dim
* Get_WKB
* Get_WKT
* ST_CoordDim
* ST_IsValid
Plus des opérateurs de requête :
* SDO_FILTER : liste les objets interagissant avec la cible.
* SDO_JOIN : jointure spatiale.
* SDO_NN (pour nearest neighbor) : renvoie le voisin le plus proche de la cible.
* SDO_NN_DISTANCE : la distance avec le voisin le plus proche.
* SDO_RELATE : liste les objets interagissant d'une certaine façon.
* SDO_WITHIN_DISTANCE : dit si deux objets sont à moins d'une certaine distance l'un de l'autre.

## Données spatiotemporelles

On utilise un prédicat pour prévoir le mouvement des objets stockés. Toutefois les bases de données spatiotemporelles nécessitent malgré tout des mises à jour fréquentes.

## Indexation

Les modes d'indexation choisis par Oracle pour les données spatiales sont l'arbre R, l'arbre Q, et le Z-order.

## Liaison avec des SIG

Pour représenter les données en base sur des cartes, on utilise un système d'information géographique (SIG). Par exemple :
* GRASS GIS
* QGIS
Si le logiciel a besoin d'une source de données ODBC pour accéder aux bases Oracle :
* Lancer %windir%\system32\odbcad32.exe.
* Ajouter une source de données système. Le driver Oracle peut être choisi dans la liste si le SGBD est installé.
* Remplir le champ Nom du service TNS avec le nom situé dans le fichier C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN\tnsnames.ora.
* Puis inscrire le mot de passe de la connexion crée dans SQL*Plus.

## Exemples

* http://download.oracle.com/otndocs/products/spatial/pdf/au_melbourne06_start.pdf
* http://download.oracle.com/otndocs/products/spatial/pdf/GeocodingInOracleUsing_HERE_MapContent.pdf

## Références

* ↑ (en) « Spatial Developer's Guide », sur Oracle.com
* ↑ (en) « SDO_GEOMETRY Object Type », sur Oracle.com
* ↑ (en) « Spatial Operators », sur Oracle.com
* ↑ (en) « Authorizing Access to Dynamic Spatial-Temporal Data », sur Oracle.com
* ↑ (en) « Spatial Concepts », sur Oracle.com
* ↑ (en) « ZOrder Method », sur Oracle.com
* ↑ (en) « Geographic Resources Analysis Support System (GRASS): More Than a Mapping Tool », sur Oracle.com

# Débogage
## Une erreur s'est produite lors de l'opération demandée
### Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor Code fournisseur 12505

Un processus est manquant, relancer les services Oracle.
Si cela ne change rien, vérifier le contenu de listener.ora avant de relancer le service listener.
Sinon, désinstaller puis réinstaller le logiciel.

## SP2-0734: commande inconnue au début de "..." - le reste de la ligne est ignoré

Essayer d'entourer la commande par BEGIN et END.

# Désinstaller

La désinstallation d'une base de données Oracle peut être complexe.
La procédure à suivre pour Oracle Database 12C est la suivante:
* Allez dans ORACLE_HOME\deintall\ exécutez deintaller.bat comme administrator ou propriétaire de la BDD
* Le désinstalleur s'affiche. Vérifiez le Listener name & appuyez sur Enter
* Vérifiez le SID & appuyez sur Enter
* Entrez ‘ Y ‘ et appuyez sur Enter
* La désinstallation de la base de données Oracle commence.
Du nettoyage manuel peut ensuite être nécessaire.
* Aller dans le dossier app et effacez ce qui ne l'a pas été
* Dans la variable d'environnement PATH, supprimez ce qui point sur le dossier précédemment supprimé
* Dans services.msc supprimez les services liés à Oracle (attention, certains peuvent être liés à d'autres produits Oracle comme VirtualBox et il ne faut pas y toucher, ceux que vous pouvez supprimer sans crainte sont ceux commençant par OracleService et OracleOraDB)