{"id":287,"date":"2023-09-15T10:59:30","date_gmt":"2023-09-15T14:59:30","guid":{"rendered":"https:\/\/ve2cuy.com\/?page_id=287"},"modified":"2024-09-18T10:07:31","modified_gmt":"2024-09-18T14:07:31","slug":"420-5d3-oracle-installation","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/index.php\/420-5d3-oracle-installation\/","title":{"rendered":"420-5D3 : Le SGBD Oracle"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/images-2.png\" alt=\"\" class=\"wp-image-636\" style=\"width:256px;height:228px\" width=\"256\" height=\"228\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">1 &#8211; Pr\u00e9sentation <\/h2>\n\n\n\n<p>Oracle est un incontournable dans les DB des grandes organisations.  Son SGBD occupe la troisi\u00e8me place dans les parts de march\u00e9 global.  On retrouve souvent le SGBD Oracle dans des entreprises de 10 000+ employ\u00e9s. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 &#8211; Oracle Multitenant<\/h3>\n\n\n\n<p>\u00ab\u00a0Oracle Multitenant permet \u00e0 une base de donn\u00e9es Oracle Database de fonctionner comme une base de donn\u00e9es de conteneurs (<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\"><a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/21\/cncpt\/CDBs-and-PDBs.html#GUID-5C339A60-2163-4ECE-B7A9-4D67D3D894FB\">CDB<\/a><\/mark><\/strong>). Une base de donn\u00e9es de conteneurs consolide plusieurs bases de donn\u00e9es enfichables (<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">PDB<\/mark><\/strong>), une collection portable de sch\u00e9mas, d\u2019objets de sch\u00e9ma et d\u2019objets autres que de sch\u00e9ma. Qu\u2019elles soient d\u00e9ploy\u00e9es on-premise ou dans le cloud, avec Oracle Multitenant, les applications s\u2019ex\u00e9cutent sans changement dans des bases de donn\u00e9es enfichables autonomes, ce qui permet d\u2019am\u00e9liorer l\u2019utilisation des ressources, la gestion et la s\u00e9curit\u00e9 globale.\u00a0\u00bb<\/p>\n\n\n\n<p><a href=\"https:\/\/www.oracle.com\/ca-fr\/database\/multitenant\/\">Source<\/a><\/p>\n\n\n\n<p>D\u00e9finition des concepts <a href=\"https:\/\/expertoracle.com\/2021\/03\/18\/oracle-multitenant-1-basics-of-oracle-multitenant-architecture\/\">ici<\/a> et <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/21\/cncpt\/CDBs-and-PDBs.html#GUID-5C339A60-2163-4ECE-B7A9-4D67D3D894FB\">l\u00e0<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1.2 &#8211; Part de march\u00e9 d&rsquo;Oracle<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-28-a-18.15.52-1024x177.png\" alt=\"\" class=\"wp-image-642\" style=\"width:556px;height:96px\" width=\"556\" height=\"96\" srcset=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-28-a-18.15.52-1024x177.png 1024w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-28-a-18.15.52-300x52.png 300w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-28-a-18.15.52-768x133.png 768w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-28-a-18.15.52-1536x266.png 1536w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-28-a-18.15.52.png 1986w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/figure>\n\n\n\n<p><a href=\"https:\/\/6sense.com\/tech\/relational-databases\/oracle-database-market-share\">Voir ici<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2 &#8211; Installation<\/h2>\n\n\n\n<p><a href=\"https:\/\/www.oracle.com\/ca-en\/database\/free\/get-started\/\">https:\/\/www.oracle.com\/ca-en\/database\/free\/get-started\/<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 &#8211; Lancer le SGBD Oracle via Docker<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker pull container-registry.oracle.com\/database\/free:latest\n\n# En date du 2023.09.28, latest correspond \u00e0 la version 23c.\n\ndocker run -d --name oracle -it -p 1521:1521 -p 5500:5500 -e ORACLE_PWD=password -e ORACLE_CHARACTERSET=AL32UTF8 container-registry.oracle.com\/database\/free:latest\n\n# M\u00e9thode avec un lien avec sur dossier local:\ndocker run -d --name oracle-db -it \\\n-p 1521:1521 -p 5500:5500 \\\n-e ORACLE_PWD=password \\\n-e ORACLE_CHARACTERSET=AL32UTF8 \\\n-v ${PWD}\/opt\/oracle\/oradata:\/opt\/oracle\/oradata \\\ncontainer-registry.oracle.com\/database\/free:latest <\/pre>\n\n\n\n<p>R\u00e9f\u00e9rence du <a href=\"https:\/\/blogs.oracle.com\/timesten\/post\/why-databasecharacterset-matters\">CHARACTERSET<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2.2 &#8211; D\u00e9ployer une VM<\/h2>\n\n\n\n<p>Suivre les instructions de cette <a href=\"https:\/\/www.oracle.com\/ca-en\/database\/free\/get-started\/\">page<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3 &#8211; Lancer le client SQL (sqlplus)<\/h3>\n\n\n\n<p>Pour la gestion du SGBD, plusieurs m\u00e9thodes de connexion au serveur Oracle sont disponibles.  <br><br>Commen\u00e7ons par utiliser un client de type CLI, propos\u00e9 par Oracle.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Pour se connecter \u00e0 la base de donn\u00e9es de conteneurs (CDB):\n$ docker exec -it oracle sqlplus sys\/password@localhost:1521\/FREE as sysdba\n\nSQL*Plus: Release 23.0.0.0.0 - Developer-Release on Wed Sep 20 15:56:38 2023\nVersion 23.2.0.0.0\n\nCopyright (c) 1982, 2023, Oracle.  All rights reserved.\n\n\nConnected to:\nOracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release\nVersion 23.2.0.0.0\n\nSQL><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 &#8211; Syntaxe de la commande de connexion<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">sqlplus<\/mark><\/strong> : nom de la commande.  Elle est fournit dans l&rsquo;image du conteneur<\/li>\n\n\n\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">sys\/password<\/mark><\/strong> : nom et mot de passe utilis\u00e9s pour le &lsquo;login&rsquo; au SGBD.  Note:  &lsquo;<em><strong>sys<\/strong><\/em>&lsquo; est un compte syst\u00e8me disponible par d\u00e9faut sur une installation du SGBD Oracle.<\/li>\n\n\n\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">@localhost:1521<\/mark><\/strong> : adresse et port du service Oracle SGBD.  Le SGBD pourrait \u00eatre install\u00e9 sur un autre ordinateur.  Nous aurions alors \u00e9crit, <em><strong>@adresseIP\/nomDomaine:1521<\/strong><\/em>.<\/li>\n\n\n\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">\/FREE<\/mark><\/strong> : le SID (<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\"><a href=\"https:\/\/ve2cuy.com\/index.php\/420-5d5-oracle-sid\/\" data-type=\"page\" data-id=\"628\">VOIR ICI<\/a><\/mark><\/strong>) ou bien le nom d&rsquo;un service (plugable database, PDB) sur lequel nous d\u00e9sirons nous connecter.  Le SID repr\u00e9sente la racine de l&rsquo;infrastructure.<\/li>\n\n\n\n<li><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">as sysdba<\/mark><\/strong> : indique le r\u00f4le \u00e0 assumer.  Le r\u00f4le &lsquo;<em><strong>sysdba<\/strong><\/em>&lsquo; donne acc\u00e8s \u00e0 toutes les fonctions de gestion de l&rsquo;infrastructure du SGBD.   Nous verrons plus tard, que plusieurs r\u00f4les sont pr\u00e9d\u00e9finis dans le syst\u00e8me de d\u00e9part. <\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">3.1.2 &#8211; Une base de donn\u00e9es enfichable &#8211; PDB &#8211; est aussi disponible avec l&rsquo;installation de base:<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Pour se connecter la premi\u00e8re BD enfichable (PDB):\nsqlplus sys@localhost:1521\/FREEPDB1 as sysdba<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 &#8211; Premiers pas avec le CLI sqlplus<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Afficher le nom du conteneur courant:\nSQL> show con_name;\nCON_NAME\n------------------------------\nCDB$ROOT\n# Note: CDB$ROOT est le conteneur racine d'une infrastructure Oracle.\n \n# Afficher les bases de donn\u00e9es enfichables PDBS\/PLUGGABLE DATABASES\nSQL> show pdbs;\n\n    CON_ID CON_NAME              OPEN MODE  RESTRICTED\n---------- ------------------------------ ---------- ----------\n     2 PDB$SEED                  READ ONLY  NO\n     3 FREEPDB1                  READ WRITE NO\n\n\n# Cr\u00e9er une base de donn\u00e9es enfichable\nSQL> CREATE PLUGGABLE DATABASE CSTJ4205D3 ADMIN USER etudiant IDENTIFIED BY password create_file_dest='\/home\/oracle';\n\nPluggable database created.\n\nSQL> show pdbs;\n\n    CON_ID CON_NAME              OPEN MODE  RESTRICTED\n---------- ------------------------------ ---------- ----------\n     2 PDB$SEED                  READ ONLY  NO\n     3 FREEPDB1                  READ WRITE NO\n     4 CSTJ4205D3                MOUNTED\n\n\n# Lister le contenu de la table des utilisateurs:\nSQL> select name from user$;\n\nNAME\n--------------------------------------------------------------------------------\nACCHK_READ\nADM_PARALLEL_EXECUTE_TASK\nANONYMOUS\n...\nAUDSYS\nAUTHENTICATEDUSER\n\nNAME\n--------------------------------------------------------------------------------\nAVTUNE_PKG_ROLE\nBDSQL_ADMIN\nBDSQL_USER\n...\nDATAPUMP_IMP_FULL_DATABASE\nDBA\n...\n\n# Rechercher ETUDIANT\nSQL> select name from user$ where name='ETUDIANT';\n\nno rows selected\n\n# Ou est ETUDIANT ??<\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">NOTE<\/mark><\/strong>: La requ\u00eate \u00ab\u00a0select name from user$ where name=&rsquo;etudiant&rsquo;;\u00a0\u00bb n&rsquo;a pas retourn\u00e9 d&rsquo;enregistrement, pourquoi?<\/p>\n\n\n\n<p>Nous avons pourtant cr\u00e9\u00e9 une nouvelle base de donn\u00e9es &lsquo;<strong>CSTJ4205D3<\/strong>&lsquo; avec un compte administrateur &lsquo;<strong>etudiant<\/strong>&lsquo;.<\/p>\n\n\n\n<p>Justement, le compte &lsquo;<strong>etudiant<\/strong>&lsquo; n&rsquo;est pas dans <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">la BD courante<\/mark> mais bien dans la BD &lsquo;<strong>CSTJ4205D3<\/strong>&lsquo;.<\/p>\n\n\n\n<p>Il faut se connecter sur cette derni\u00e8re pour pouvoir localiser l&rsquo;utilisateur &lsquo;etudiant&rsquo;.<\/p>\n\n\n\n<p>Proc\u00e9dons <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4 &#8211; Branchement \u00e0 une BD sp\u00e9cifique<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"25\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">docker exec -it oracle sqlplus sys\/password@localhost:1521\/CSTJ4205D3 as sysdba\n\n# Afficher le nom du conteneur courant:\nSQL> show con_name;\n\nCON_NAME\n------------------------------\nCSTJ4205D3\n\n\n# Afficher les bases de donn\u00e9es\nSQL> show pdbs;\n\n    CON_ID CON_NAME\t\t\t  OPEN MODE  RESTRICTED\n---------- ------------------------------ ---------- ----------\n\t 4 CSTJ4205D3\t\t\t  READ WRITE NO\n\n \n\n# Afficher la liste des utilisateurs:\nSQL> select name from user$;\n\nNAME\n--------------------------------------------------------------------------------\nACCHK_READ\nADM_PARALLEL_EXECUTE_TASK\nANONYMOUS\n...\n\nNAME\n--------------------------------------------------------------------------------\nDV_STREAMS_ADMIN\nDV_XSTREAM_ADMIN\nEJBCLIENT\nETUDIANT\n...\n\n# =============================================================================\n#                          NOTE: EN CAS D`ERREUR\n# =============================================================================\n\nSQL> select name from user$;\n                 *\nERROR at line 1:\nORA-01219: Database or pluggable database not open. Queries allowed on fixed\ntables or views only.\n\nIl faudra OUVRIR la base de donn\u00e9es:\n\nSQL> alter database open;\n\nDatabase altered.\n\nSQL> show pdbs;\n\n    CON_ID CON_NAME                       OPEN MODE  RESTRICTED\n---------- ------------------------------ ---------- ----------\n         4 CSTJ4205D3                     READ WRITE NO\nSQL>\n# =============================================================================\n# =============================================================================\n\n\n# Localiser ETUDIANT dans la table user$\nSQL> select name from user$ where name='ETUDIANT';\n\nNAME\n--------------------------------------------------------------------------------\nETUDIANT\n\nSQL><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 &#8211; Accorder des droits \u00e0 l&rsquo;utilisateur &lsquo;ETUDIANT&rsquo;<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SQL> GRANT create session TO etudiant;\nGrant succeeded.\n\nSQL> GRANT create table TO etudiant;\nGrant succeeded.\n\nSQL> GRANT unlimited tablespace TO ETUDIANT;\nGrant succeeded.\n\nSQL><\/pre>\n\n\n\n<p>L&rsquo;utilisateur va maintenant pour cr\u00e9er des sessions (login), cr\u00e9er des tables et ins\u00e9rer des enregistrements.  Par contre, <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">il ne pourra pas cr\u00e9er des s\u00e9quences<\/mark> (Champs de type AUTO-INCREMENT).  Il faudra, plus tard ajouter un privil\u00e8ge suppl\u00e9mentaire.<\/p>\n\n\n\n<p>Pour tester ses nouveaux privil\u00e8ges, il va falloir se connecter avec le compte &lsquo;etudiant&rsquo;.<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">NOTE<\/mark><\/strong>: La liste des privil\u00e8ges syst\u00e8mes est disponible <a href=\"https:\/\/ve2cuy.com\/index.php\/420-5d3-oracle-liste-des-privileges\/\" data-type=\"page\" data-id=\"613\">ici<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4.1.1 &#8211; Utilisation du compte &lsquo;etudiant&rsquo;<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"3\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SQL> exit\n\n# Noter le nom du compte dans la chaine de connexion:\ndocker exec -it oracle sqlplus etudiant\/password@localhost:1521\/CSTJ4205D3\n\nSQL*Plus: Release 23.0.0.0.0 - Developer-Release on Wed Sep 20 15:16:14 2023\nVersion 23.2.0.0.0\n\nCopyright (c) 1982, 2023, Oracle.  All rights reserved.\n\nLast Successful login time: Tue Sep 19 2023 23:47:32 +00:00\n\nConnected to:\nOracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release\nVersion 23.2.0.0.0\n\nSQL> SHOW CON_NAME;\n\nCON_NAME\n------------------------------\nCSTJ4205D3\n\nSQL> show user;\nUSER is \"ETUDIANT\"<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 &#8211; Cr\u00e9er un nouvelle table (via le compte ETUDIANT)<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SQL> CREATE TABLE TBL_COURS (NUMERO VARCHAR2(20) NOT NULL, NOM VARCHAR2(60) NOT NULL, PERIODES NUMBER NOT NULL, CONSTRAINT TBL_COURS_PK PRIMARY KEY (NUMERO)  ENABLE );\n\nTable created.\n\n# Lister les tables:\nSQL> SHOW TABLES;\nSP2-0158: unknown SHOW option \"TABLES\"\n# VOIR NOTE\n\nSQL> SELECT table_name FROM user_tables ORDER BY table_name;\n\nTABLE_NAME\n--------------------------------------------------------------------------------\nTBL_COURS<\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">NOTE<\/mark><\/strong>: Contrairement \u00e0 MySQL, il n&rsquo;est pas possible d&rsquo;utiliser la syntaxe &lsquo;<strong><em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">SHOW tables;<\/mark><\/em><\/strong>&lsquo; avec Oracle.  Il faut plut\u00f4t faire un &lsquo;<strong><em>select<\/em><\/strong>&lsquo; sur la table syst\u00e8me &lsquo;<strong><em>user_tables<\/em><\/strong>&lsquo;.  <a href=\"https:\/\/www.oracletutorial.com\/oracle-administration\/oracle-show-tables\/\">R\u00e9f\u00e9rence<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4.3 &#8211; Ajouter un enregistrement dans la table TBL_COURS:<\/h3>\n\n\n\n<p>Rappel de la syntaxe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT&nbsp;INTO&nbsp;<em>table_name<\/em>&nbsp;(<em>column1<\/em>,<em>&nbsp;column2<\/em>,<em>&nbsp;column3<\/em>, ...)<br>VALUES&nbsp;(<em>value1<\/em>,<em>&nbsp;value2<\/em>,<em>&nbsp;value3<\/em>, ...);<\/code><\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SQL> INSERT INTO tbl_cours VALUES ('420-5D3', 'S\u00e9curit\u00e9 des donn\u00e9es', 3);\n1 row created.\n\n\nSQL> select * from tbl_cours;\n\nNUMERO                NOM                             PERIODES\n-------------------- -------------------------------- ---------\n420-5D3              S\u00e9curit\u00e9 des donn\u00e9es\t      3\n\nSQL><\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">NOTE<\/mark><\/strong>: Une modification d&rsquo;une table dans une session, ne sera pas automatiquement disponible sur d&rsquo;autres sessions.  Pour synchroniser les changements, il faut faire :<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SQL> COMMIT WORK;\n\nCommit complete.<\/pre>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\">4.3.2 &#8211; <strong>\u00c0 FAIRE (D\u00c9FI) &#8211; Trouver une solution pour les caract\u00e8res \u00e9tendus non-affich\u00e9s.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Dans une autre le\u00e7on, nous apprendrons \u00e0 utiliser une application de type GUI, <em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">Oracle SQL Developer,<\/mark><\/em>  pour la gestion du SGBD d&rsquo;Oracle<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-20-a-12.28.18-1024x803.png\" alt=\"\" class=\"wp-image-338\" style=\"width:738px;height:579px\" width=\"738\" height=\"579\" srcset=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-20-a-12.28.18-1024x803.png 1024w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-20-a-12.28.18-300x235.png 300w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-20-a-12.28.18-768x602.png 768w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-20-a-12.28.18-1536x1205.png 1536w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/Capture-decran-le-2023-09-20-a-12.28.18-2048x1606.png 2048w\" sizes=\"auto, (max-width: 738px) 100vw, 738px\" \/><\/figure>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4.4 &#8211; Changer de contexte<\/h3>\n\n\n\n<p>Il est possible de changer de context (PDB) avec ALTER SESSION<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ALTER SESSION SET CONTAINER = bd_exemple;\nALTER SESSION SET CONTAINER = CSTJ4205D3;\nALTER SESSION SET CONTAINER = CDB$ROOT;  -- La racine de l'infrastructure\n\nAu besoin, se connecter au nouveau contexte\nconnect sys as sysdba;\n\nALTER DATABASE OPEN;\nCREATE USER OT IDENTIFIED BY password;\nGRANT CONNECT, RESOURCE, DBA TO OT;\nCONNECT ot@bd_exemple  -- le context doit-\u00eatre nomm\u00e9\n\n-- Pour ex\u00e9cuter un script SQL:\nSQL>@c:\\dbsample\\ot_schema.sql\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-red-color has-text-color\">5 &#8211; LABORATOIRE<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/tintin-motobike.png\" alt=\"\" class=\"wp-image-343\" style=\"width:344px;height:344px\" width=\"344\" height=\"344\" srcset=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/tintin-motobike.png 640w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/tintin-motobike-300x300.png 300w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/09\/tintin-motobike-150x150.png 150w\" sizes=\"auto, (max-width: 344px) 100vw, 344px\" \/><\/figure>\n<\/div>\n\n\n<p>Nous avons une grande collection des oeuvres d&rsquo;Herg\u00e9, plus pr\u00e9cis\u00e9ment des albums de Tintin.  Nous aimerions tenir une base de donn\u00e9es compl\u00e8te des ouvrages d&rsquo;Herg\u00e9 et pourvoir interroger la BD avec des requ\u00eates du type \u00ab\u00a0<em><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">Afficher les albums dans lesquels nous retrouvons le Capitaine Haddock<\/mark><\/em>\u00ab\u00a0.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-red-color has-text-color\">Suggestion avant de commencer, voir l&rsquo;annexe A02<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-green-cyan-color has-text-color\"> \u00c9tape 01<\/h2>\n\n\n\n<p>En utilisant le client &lsquo;<strong><em>sqlplus<\/em><\/strong>&lsquo; d&rsquo;Oracle,<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cr\u00e9er une base de donn\u00e9es nomm\u00e9e &lsquo;<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">HERGE<\/mark><\/strong>&lsquo; avec l&rsquo;utilisateur d&rsquo;administration &lsquo;<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">TINTIN<\/mark><\/strong>&lsquo;.<\/li>\n\n\n\n<li>Accorder \u00e0 l&rsquo;utilisateur <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">TINTIN<\/mark><\/strong>, les droits suivants:\n<ul class=\"wp-block-list\">\n<li>Ouverture de sessions,<\/li>\n\n\n\n<li>Cr\u00e9ation de tables,<\/li>\n\n\n\n<li>Aucune limite pour l&rsquo;ajout d&rsquo;enregistrements dans les tables.<\/li>\n\n\n\n<li>Cr\u00e9ation de s\u00e9quences &#8211; Requis pour les champs AUTO-INCREMENT<\/li>\n\n\n\n<li>Au besoin, cr\u00e9ation d&rsquo;index &#8211; \u00c0 vous de v\u00e9rifier si c&rsquo;est requis.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-pale-pink-color has-text-color\">\u00c9tape 02<\/h2>\n\n\n\n<p>A) En utilisant une session <strong><em>sqlplus<\/em><\/strong> avec l&rsquo;utilisateur TINTIN, cr\u00e9er les tables suivantes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>tbl_albums,\n<ul class=\"wp-block-list\">\n<li>Num\u00e9ro de l&rsquo;album (automatique) : cl\u00e9 primaire &#8211; Faites des recherches pour le champ AUTO.<\/li>\n\n\n\n<li>Ann\u00e9e de sortie : Nombre entier, obligatoire.<\/li>\n\n\n\n<li>Titre de l&rsquo;album, obligatoire.<\/li>\n\n\n\n<li>Nombre de page<\/li>\n\n\n\n<li>ID Auteur, obligatoire<\/li>\n\n\n\n<li>Lien vers une image de la page couverture<\/li>\n\n\n\n<li>ISBN<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>tbl_personnages,\n<ul class=\"wp-block-list\">\n<li>id_personnage (automatique) , cl\u00e9 primaire<\/li>\n\n\n\n<li>Nom du personnage : obligatoire<\/li>\n\n\n\n<li>Lien vers une image du personnage <\/li>\n\n\n\n<li>Description : <\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>tbl_perso_albums\n<ul class=\"wp-block-list\">\n<li>\u00c0 vous de d\u00e9terminer les champs<\/li>\n\n\n\n<li>Cette table permet de renseigner dans quel album nous retrouvons un personnage\n<ul class=\"wp-block-list\">\n<li>Par exemple, le personnage 1 apparait dans les albums 2 et 4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>tbl_auteurs\n<ul class=\"wp-block-list\">\n<li>id_auteur (Automatique)<\/li>\n\n\n\n<li>Nom de l&rsquo;auteur<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>B) Ins\u00e9rer les personnages suivants:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tintin<\/li>\n\n\n\n<li>Milou<\/li>\n\n\n\n<li>Haddock<\/li>\n\n\n\n<li>Tournesol<\/li>\n<\/ul>\n\n\n\n<p>C) Ins\u00e9rer les albums suivants:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Les Cigares du Pharaon<\/li>\n\n\n\n<li>Le Lotus bleu<\/li>\n\n\n\n<li>L&rsquo;Oreille cass\u00e9e<\/li>\n\n\n\n<li>L&rsquo;\u00cele noire<\/li>\n<\/ul>\n\n\n\n<p>D) Renseigner les informations suivantes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tintin apparait dans tous les albums<\/li>\n\n\n\n<li>Haddock dans l&rsquo;album 1 et 4<\/li>\n\n\n\n<li>Tournesol dans l&rsquo;album 2<\/li>\n<\/ul>\n\n\n\n<p>E) Afficher les personnages : Nom et description<\/p>\n\n\n\n<p>F) Afficher les albums : Ann\u00e9e, Titre, nombre de pages<\/p>\n\n\n\n<p>G) Afficher la liste des albums par personnage.  (Cela est un peu plus difficile \ud83d\ude09)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-cyan-blue-color has-text-color\">Annexe<\/h2>\n\n\n\n<p>Note: CTRL F7 = Mise en forme (format)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A01 &#8211; Renseigner un champ en mode &lsquo;AUTO INCREMENT&rsquo; Sous Oracle:<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Note, pas de clause 'IF EXISTS' sous Oracle 23c\n# Voir: https:\/\/stackoverflow.com\/questions\/1799128\/oracle-if-table-exists\n\nDROP TABLE IF EXISTS tbl_animaux;\n\nCREATE TABLE tbl_animaux (\n     id NUMBER GENERATED AS IDENTITY,\n     nom CHAR(30) NOT NULL,\n     PRIMARY KEY (id)\n);\n\n# Oui bien :\n\nCREATE TABLE tbl_animaux (\n     id NUMBER GENERATED AS IDENTITY (START WITH 1 INCREMENT BY 1 NOCACHE),\n     nom VARCHAR2(30) NOT NULL,\n     PRIMARY KEY (id)\n);\n\nINSERT INTO tbl_animaux (nom) VALUES\n    ('chien'),('chat'),('cheval'),\n    ('poisson'),('oiseau'),('serpent');\n\nSELECT * FROM tbl_animaux;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">A02 &#8211; Exemple d&rsquo;un schema pour un site de commerce<\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-vivid-red-color has-text-color\">A02.1 &#8211; Cr\u00e9ation du sch\u00e9ma &#8211; syntaxe &lsquo;legacy Oracle&rsquo;<br>Note: NE PAS UTILISER CETTE SYNTAXE DANS LE COURS.<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Exemple utilisant la syntaxe 'legacy' pour les valeurs de type AUTO-INCREMENT.  \n-- Fonctionne avec les versions plus anciennes d'Oracle\n\n-- Drop tables if they exist (to avoid conflicts)\nDROP TABLE OrderItems CASCADE CONSTRAINTS;\nDROP TABLE Orders CASCADE CONSTRAINTS;\nDROP TABLE Products CASCADE CONSTRAINTS;\nDROP TABLE Categories CASCADE CONSTRAINTS;\nDROP TABLE Customers CASCADE CONSTRAINTS;\n\n-- Create Customers Table\nCREATE TABLE Customers (\n    customer_id NUMBER PRIMARY KEY,\n    first_name VARCHAR2(50),\n    last_name VARCHAR2(50),\n    email VARCHAR2(100) UNIQUE,\n    password VARCHAR2(100), -- Hashed and salted password\n    address VARCHAR2(255),\n    phone_number VARCHAR2(20)\n);\n\n-- Create Categories Table\nCREATE TABLE Categories (\n    category_id NUMBER PRIMARY KEY,\n    category_name VARCHAR2(100) UNIQUE\n);\n\n-- Create Products Table\nCREATE TABLE Products (\n    product_id NUMBER PRIMARY KEY,\n    product_name VARCHAR2(100),\n    description CLOB,\n    price NUMBER(10, 2),\n    stock_quantity NUMBER,\n    category_id NUMBER REFERENCES Categories(category_id)\n);\n\n-- Create Orders Table\nCREATE TABLE Orders (\n    order_id NUMBER PRIMARY KEY,\n    customer_id NUMBER REFERENCES Customers(customer_id),\n    order_date TIMESTAMP,\n    status VARCHAR2(20) CHECK (status IN ('processing', 'shipped', 'delivered'))\n);\n\n-- Create OrderItems Table (to represent items in each order)\nCREATE TABLE OrderItems (\n    order_item_id NUMBER PRIMARY KEY,\n    order_id NUMBER REFERENCES Orders(order_id),\n    product_id NUMBER REFERENCES Products(product_id),\n    quantity NUMBER,\n    subtotal NUMBER(10, 2)\n);\n\n-- Create Indexes for Performance\nCREATE INDEX idx_customer_email ON Customers(email);\nCREATE INDEX idx_product_category ON Products(category_id);\nCREATE INDEX idx_order_customer ON Orders(customer_id);\nCREATE INDEX idx_order_product ON OrderItems(product_id);\n\n-- Create Sequences for Auto-Generating IDs\nCREATE SEQUENCE customer_seq START WITH 1 INCREMENT BY 1;\nCREATE SEQUENCE category_seq START WITH 1 INCREMENT BY 1;\nCREATE SEQUENCE product_seq START WITH 1 INCREMENT BY 1;\nCREATE SEQUENCE order_seq START WITH 1 INCREMENT BY 1;\nCREATE SEQUENCE order_item_seq START WITH 1 INCREMENT BY 1;\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">A02.2 &#8211; Cr\u00e9ation du sch\u00e9ma &#8211; syntaxe &lsquo;moderne&rsquo;<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Exemple utilisant la syntaxe 'moderne' pour les valeurs de type AUTO-INCREMENT. \n\n-- Drop tables if they exist (to avoid conflicts)\nDROP TABLE OrderItems CASCADE CONSTRAINTS;\nDROP TABLE Orders CASCADE CONSTRAINTS;\nDROP TABLE Products CASCADE CONSTRAINTS;\nDROP TABLE Categories CASCADE CONSTRAINTS;\nDROP TABLE Customers CASCADE CONSTRAINTS;\n\n-- Create Customers Table\nCREATE TABLE Customers (\n    customer_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    first_name VARCHAR2(50),\n    last_name VARCHAR2(50),\n    email VARCHAR2(100) UNIQUE,\n    password VARCHAR2(100), -- Hashed and salted password\n    address VARCHAR2(255),\n    phone_number VARCHAR2(20)\n);\n\n-- Create Categories Table\nCREATE TABLE Categories (\n    category_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    category_name VARCHAR2(100) UNIQUE\n);\n\n-- Create Products Table\nCREATE TABLE Products (\n    product_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    product_name VARCHAR2(100),\n    description CLOB,\n    price NUMBER(10, 2),\n    stock_quantity NUMBER,\n    category_id NUMBER REFERENCES Categories(category_id)\n);\n\n-- Create Orders Table\nCREATE TABLE Orders (\n    order_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    customer_id NUMBER REFERENCES Customers(customer_id),\n    order_date TIMESTAMP,\n    status VARCHAR2(20) CHECK (status IN ('processing', 'shipped', 'delivered'))\n);\n\n-- Create OrderItems Table (to represent items in each order)\nCREATE TABLE OrderItems (\n    order_item_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n    order_id NUMBER REFERENCES Orders(order_id),\n    product_id NUMBER REFERENCES Products(product_id),\n    quantity NUMBER,\n    subtotal NUMBER(10, 2)\n);\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">A02.3 &#8211; Ins\u00e9rer des donn\u00e9es dans la BD<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Ajout de donn\u00e9es dans la BD\n\n-- Insert data into Categories Table\nINSERT INTO Categories (category_name) VALUES\n    ('Electronics'),\n    ('Clothing'),\n    ('Books');\n\n-- Insert data into Customers Table\nINSERT INTO Customers (first_name, last_name, email, password, address, phone_number) VALUES\n    ('John', 'Doe', 'johndoe@example.com', 'hashed_password', '123 Main St, City, Country', '555-123-4567'),\n    ('Jane', 'Smith', 'janesmith@example.com', 'hashed_password', '456 Elm St, City, Country', '555-987-6543');\n\n-- Insert data into Products Table\nINSERT INTO Products (product_name, description, price, stock_quantity, category_id) VALUES\n    ('Smartphone', 'High-end smartphone with great features', 699.99, 100, 1),\n    ('Laptop', 'Powerful laptop for work and gaming', 1299.99, 50, 1),\n    ('T-shirt', 'Comfortable cotton T-shirt', 19.99, 200, 2),\n    ('Jeans', 'Stylish and durable jeans', 49.99, 150, 2),\n    ('Book: Introduction to SQL', 'Learn SQL programming', 29.99, 30, 3);\n\n-- Insert data into Orders Table\nINSERT INTO Orders (customer_id, order_date, status) VALUES\n    (1, TIMESTAMP '2023-09-26 10:00:00', 'processing'),\n    (2, TIMESTAMP '2023-09-27 14:30:00', 'shipped');\n\n-- Insert data into OrderItems Table\nINSERT INTO OrderItems (order_id, product_id, quantity, subtotal) VALUES\n    (1, 1, 2, 1399.98),\n    (1, 3, 3, 59.97),\n    (2, 2, 1, 1299.99);\n\n-- ---------------------------------------------------------------------\n-- Encore un peu plus ...\n-- ---------------------------------------------------------------------\n\n-- Insert data into Categories Table\nINSERT INTO Categories (category_name) VALUES\n    ('Toys'),\n    ('Sports Gear'),\n    ('Home Appliances');\n\n-- Insert data into Customers Table\nINSERT INTO Customers (first_name, last_name, email, password, address, phone_number) VALUES\n    ('Alice', 'Johnson', 'alice@example.com', 'hashed_password', '789 Oak St, City, Country', '555-555-5555'),\n    ('Bob', 'Smith', 'bob@example.com', 'hashed_password', '321 Cedar St, City, Country', '555-123-7890');\n\n-- Insert data into Products Table\nINSERT INTO Products (product_name, description, price, stock_quantity, category_id) VALUES\n    ('Action Figure', 'Collectible action figure', 24.99, 50, 1),\n    ('Soccer Ball', 'Official size and weight soccer ball', 19.99, 100, 2),\n    ('Coffee Maker', 'Programmable coffee maker', 49.99, 30, 3),\n    ('Dress', 'Elegant evening dress', 79.99, 70, 2),\n    ('Book: Python Programming', 'Learn Python programming', 39.99, 25, 3);\n\n-- Insert data into Orders Table\nINSERT INTO Orders (customer_id, order_date, status) VALUES\n    (3, TIMESTAMP '2023-09-28 11:15:00', 'processing'),\n    (4, TIMESTAMP '2023-09-29 16:45:00', 'delivered');\n\n-- Insert data into OrderItems Table\nINSERT INTO OrderItems (order_id, product_id, quantity, subtotal) VALUES\n    (3, 4, 1, 79.99),\n    (3, 5, 2, 79.98),\n    (4, 3, 1, 49.99),\n    (4, 1, 4, 99.96);\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">A02.4 &#8211; Quelques requ\u00eates<\/h3>\n\n\n\n<p>A02.4.1 &#8211; Obtenir la liste des commandes d\u00e9taill\u00e9es, par client:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SELECT\n    o.order_id,\n    c.customer_id,\n    c.first_name || ' ' || c.last_name AS customer_name,\n    o.order_date,\n    o.status,\n    p.product_name,\n    oi.quantity,\n    oi.subtotal\nFROM\n    Orders o\nJOIN\n    Customers c ON o.customer_id = c.customer_id\nJOIN\n    OrderItems oi ON o.order_id = oi.order_id\nJOIN\n    Products p ON oi.product_id = p.product_id\nORDER BY\n    o.order_id, oi.order_item_id;<\/pre>\n\n\n\n<p>A02.4.2 &#8211; Liste des status des commandes, incluent le nom des clients:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SELECT o.order_id,\n       c.first_name || ' ' || c.last_name AS customer_name,\n       o.status\nFROM Orders o\nJOIN Customers c ON o.customer_id = c.customer_id;\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>A02.4.3 &#8211; Liste des clients qui ont achet\u00e9 un produit plus d&rsquo;une fois:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">SELECT\n    c.customer_id,\n    c.first_name || ' ' || c.last_name AS customer_name,\n    p.product_id,\n    p.product_name\nFROM\n    Customers c\nJOIN\n    Orders o ON c.customer_id = o.customer_id\nJOIN\n    OrderItems oi ON o.order_id = oi.order_id\nJOIN\n    Products p ON oi.product_id = p.product_id\nGROUP BY\n    c.customer_id, c.first_name, c.last_name, p.product_id, p.product_name\nHAVING\n    COUNT(DISTINCT oi.product_id) > 1;\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">A03 &#8211; Gestion d&rsquo;une collection de bandes dessin\u00e9es<\/h2>\n\n\n\n<p>Voici un sch\u00e9ma de base de donn\u00e9es pour g\u00e9rer une collection de bandes dessin\u00e9es en utilisant Oracle Database. Le sch\u00e9ma comprendra des tables pour les titres de bandes dessin\u00e9es, les personnages, les citations par personnage, l&rsquo;ann\u00e9e de publication et les auteurs.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Supprimer la table Lecteurs_Albums si elle existe\nDROP TABLE Lecteurs_Albums;\n\n-- Supprimer la table Lecteurs si elle existe\nDROP TABLE Lecteurs;\n\n-- Supprimer la table Citations_Albums si elle existe\nDROP TABLE Citations_Albums;\n\n-- Supprimer la table Citations si elle existe\nDROP TABLE Citations;\n\n-- Supprimer la table Albums_Personnages si elle existe\nDROP TABLE Albums_Personnages;\n\n-- Supprimer la table Personnages si elle existe\nDROP TABLE Personnages;\n\n-- Supprimer la table Albums si elle existe\nDROP TABLE Albums;\n\n-- Supprimer la table Auteurs si elle existe\nDROP TABLE Auteurs;\n\n-- Cr\u00e9er la table Auteurs\nCREATE TABLE Auteurs (\n    auteur_id NUMBER PRIMARY KEY,\n    nom VARCHAR2(255)\n);\n\n-- Cr\u00e9er la table Albums\nCREATE TABLE Albums (\n    album_id NUMBER PRIMARY KEY,\n    titre VARCHAR2(255),\n    annee_publication NUMBER,\n    auteur_id NUMBER,\n    FOREIGN KEY (auteur_id) REFERENCES Auteurs(auteur_id),\n    nombre_pages NUMBER,\n    isbn VARCHAR2(20),\n    photo_couverture VARCHAR2(255)\n);\n\n-- Cr\u00e9er la table Personnages\nCREATE TABLE Personnages (\n    personnage_id NUMBER PRIMARY KEY,\n    nom VARCHAR2(100)\n);\n\n-- Cr\u00e9er la table Citations\nCREATE TABLE Citations (\n    citation_id NUMBER PRIMARY KEY,\n    texte CLOB,\n    personnage_id NUMBER,\n    FOREIGN KEY (personnage_id) REFERENCES Personnages(personnage_id)\n);\n\n-- Cr\u00e9er la table Albums_Personnages\nCREATE TABLE Albums_Personnages (\n    album_id NUMBER,\n    personnage_id NUMBER,\n    FOREIGN KEY (album_id) REFERENCES Albums(album_id),\n    FOREIGN KEY (personnage_id) REFERENCES Personnages(personnage_id)\n);\n\n-- Cr\u00e9er la table Citations_Albums\nCREATE TABLE Citations_Albums (\n    citation_id NUMBER,\n    album_id NUMBER,\n    page NUMBER,\n    FOREIGN KEY (citation_id) REFERENCES Citations(citation_id),\n    FOREIGN KEY (album_id) REFERENCES Albums(album_id)\n);\n\n-- Cr\u00e9er la table Lecteurs\nCREATE TABLE Lecteurs (\n    lecteur_id NUMBER PRIMARY KEY,\n    nom VARCHAR2(50),\n    prenom VARCHAR2(50),\n    email VARCHAR2(100)\n);\n\n-- Cr\u00e9er la table Lecteurs_Albums\nCREATE TABLE Lecteurs_Albums (\n    lecteur_id NUMBER,\n    album_id NUMBER,\n    FOREIGN KEY (lecteur_id) REFERENCES Lecteurs(lecteur_id),\n    FOREIGN KEY (album_id) REFERENCES Albums(album_id)\n);<\/pre>\n\n\n\n<p>Ce sch\u00e9ma comprend les tables suivantes :<\/p>\n\n\n\n<p><strong><br>Albums<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>album_id<\/code> (cl\u00e9 primaire)<\/li>\n\n\n\n<li><code>titre<\/code> (titre de l&rsquo;album)<\/li>\n\n\n\n<li><code>annee_publication<\/code> (ann\u00e9e de publication)<\/li>\n\n\n\n<li><code>auteur<\/code> (auteur de l&rsquo;album)<\/li>\n\n\n\n<li><code>nombre_pages<\/code> (nombre de pages)<\/li>\n\n\n\n<li><code>isbn<\/code> (ISBN de l&rsquo;album)<\/li>\n\n\n\n<li><code>photo_couverture<\/code> (chemin vers la photo de la page couverture)<\/li>\n<\/ul>\n\n\n\n<p><strong>Personnages<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>personnage_id<\/code> (cl\u00e9 primaire)<\/li>\n\n\n\n<li><code>nom<\/code> (nom du personnage)<\/li>\n<\/ul>\n\n\n\n<p><strong>Citations<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>citation_id<\/code> (cl\u00e9 primaire)<\/li>\n\n\n\n<li><code>texte<\/code> (texte de la citation)<\/li>\n\n\n\n<li><code>personnage_id<\/code> (cl\u00e9 \u00e9trang\u00e8re vers la table Personnages)<\/li>\n<\/ul>\n\n\n\n<p><strong>Albums_Personnages<\/strong> (table de liaison pour g\u00e9rer la relation entre les albums et les personnages) :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>album_id<\/code> (cl\u00e9 \u00e9trang\u00e8re vers la table Albums)<\/li>\n\n\n\n<li><code>personnage_id<\/code> (cl\u00e9 \u00e9trang\u00e8re vers la table Personnages)<\/li>\n<\/ul>\n\n\n\n<p><strong>Citations_Albums<\/strong> (table de liaison pour g\u00e9rer la relation entre les citations et les albums) :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>citation_id<\/code> (cl\u00e9 \u00e9trang\u00e8re vers la table Citations)<\/li>\n\n\n\n<li><code>album_id<\/code> (cl\u00e9 \u00e9trang\u00e8re vers la table Albums)<\/li>\n\n\n\n<li><code>page<\/code> (num\u00e9ro de page o\u00f9 la citation appara\u00eet dans l&rsquo;album)<\/li>\n<\/ul>\n\n\n\n<p><strong>Lecteurs<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>lecteur_id<\/code> (cl\u00e9 primaire)<\/li>\n\n\n\n<li><code>nom<\/code> (nom du lecteur)<\/li>\n\n\n\n<li><code>prenom<\/code> (pr\u00e9nom du lecteur)<\/li>\n\n\n\n<li><code>email<\/code> (adresse e-mail du lecteur)<\/li>\n<\/ul>\n\n\n\n<p><strong>Lecteurs_Albums<\/strong> (table de liaison pour enregistrer les albums que les lecteurs ont lus) :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>lecteur_id<\/code> (cl\u00e9 \u00e9trang\u00e8re vers la table Lecteurs)<\/li>\n\n\n\n<li><code>album_id<\/code> (cl\u00e9 \u00e9trang\u00e8re vers la table Albums)<\/li>\n<\/ul>\n\n\n\n<p>Ce sch\u00e9ma vous permettra de g\u00e9rer une collection de bandes dessin\u00e9es en enregistrant les d\u00e9tails des titres, des personnages, des citations, des ann\u00e9es de publication et des auteurs et des lecteurs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Ajouter dans la bases de donn\u00e9es, les auteurs, 10 albums de Tintin, les personnages suivants: Tintin, Milou, Capitaine Haddock, Allan, Professeur Tournesol, Le colonel Alvarez, Dupond, Dupont, Nestor et Bianca Castafiore. Les albums dans lesquels apparaissent ces personnages. Ajouter 10 citations du Capitaine Haddock avec l&rsquo;album et la page ou apparait la citation.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Ajouter 10 albums de Tintin\nINSERT INTO Albums (titre, annee_publication, auteur_id, nombre_pages, isbn, photo_couverture)\nVALUES\n    ('Tintin au pays des Soviets', 1929, 1, 144, '978-2203001016', 'tintin_soviets.jpg'),\n    ('Tintin au Congo', 1931, 1, 62, '978-2203001023', 'tintin_congo.jpg'),\n    ('Tintin en Am\u00e9rique', 1932, 1, 120, '978-2203001030', 'tintin_amerique.jpg'),\n    ('Les Cigares du Pharaon', 1934, 1, 128, '978-2203001047', 'tintin_cigares_pharaon.jpg'),\n    ('Le Lotus bleu', 1936, 1, 80, '978-2203001054', 'tintin_lotus_bleu.jpg'),\n    ('L''Oreille cass\u00e9e', 1943, 1, 62, '978-2203001061', 'tintin_oreille_cassee.jpg'),\n    ('L''\u00cele noire', 1938, 1, 62, '978-2203001078', 'tintin_ile_noire.jpg'),\n    ('L''\u00c9toile myst\u00e9rieuse', 1942, 1, 62, '978-2203001108', 'tintin_etoile_mysterieuse.jpg'),\n    ('Le Secret de La Licorne', 1943, 1, 62, '978-2203001115', 'tintin_secret_licorne.jpg'),\n    ('Le Tr\u00e9sor de Rackham le Rouge', 1944, 1, 62, '978-2203001122', 'tintin_tresor_rackham_rouge.jpg');\n\n\n-- Ajouter les personnages\nINSERT INTO Personnages (nom) VALUES\n    ('Tintin'),\n    ('Milou'),\n    ('Capitaine Haddock'),\n    ('Allan'),\n    ('Professeur Tournesol'),\n    ('Le colonel Alvarez'),\n    ('Dupond'),\n    ('Dupont'),\n    ('Nestor'),\n    ('Bianca Castafiore');\n\n-- Associer les personnages aux albums\nINSERT INTO Albums_Personnages (album_id, personnage_id) VALUES\n    (1, 1), (1, 2), (1, 3), -- Tintin, Milou, Capitaine Haddock dans Tintin au pays des Soviets\n    (2, 1), (2, 2), (2, 3), -- Tintin, Milou, Capitaine Haddock dans Tintin au Congo\n    (3, 1), (3, 2), (3, 3), -- Tintin, Milou, Capitaine Haddock dans Tintin en Am\u00e9rique\n    (4, 1), (4, 2), (4, 3), -- Tintin, Milou, Capitaine Haddock dans Les Cigares du Pharaon\n    (5, 1), (5, 2), (5, 3), -- Tintin, Milou, Capitaine Haddock dans Le Lotus bleu\n    (6, 1), (6, 2), (6, 3), -- Tintin, Milou, Capitaine Haddock dans L'Oreille cass\u00e9e\n    (7, 1), (7, 2), (7, 3), -- Tintin, Milou, Capitaine Haddock dans L'\u00cele noire\n    (8, 1), (8, 2), (8, 3), -- Tintin, Milou, Capitaine Haddock dans L'\u00c9toile myst\u00e9rieuse\n    (9, 1), (9, 2), (9, 3), -- Tintin, Milou, Capitaine Haddock dans Le Secret de La Licorne\n    (10, 1), (10, 2), (10, 3); -- Tintin, Milou, Capitaine Haddock dans Le Tr\u00e9sor de Rackham le Rouge\n\n-- Ajouter 10 citations du Capitaine Haddock avec l'album et la page\nINSERT INTO Citations (texte, personnage_id) VALUES\n    ('Mille milliards de mille sabords !', 3), -- Capitaine Haddock dans Tintin au pays des Soviets\n    ('Tonnerre de Brest !', 3), -- Capitaine Haddock dans Tintin au pays des Soviets\n    ('Mille milliards de mille tonnerres !', 3), -- Capitaine Haddock dans Tintin au pays des Soviets\n    ('Mille sabords !', 3), -- Capitaine Haddock dans Tintin au Congo\n    ('Tonnerre de Brest et de brume !', 3), -- Capitaine Haddock dans Tintin au Congo\n    ('Mille milliards de mille typhons !', 3), -- Capitaine Haddock dans Tintin en Am\u00e9rique\n    ('Mille milliards de mille boulons !', 3), -- Capitaine Haddock dans Les Cigares du Pharaon\n    ('Mille milliards de mille mille mille sabords !', 3), -- Capitaine Haddock dans Le Lotus bleu\n    ('Mille milliards de mille sabords de tonnerre !', 3), -- Capitaine Haddock dans L'Oreille cass\u00e9e\n    ('Mille milliards de mille tonnerres de Brest !', 3); -- Capitaine Haddock dans L'\u00cele noire\n\n-- Associer les citations aux albums et aux pages\n-- Utilisez les IDs des citations et des albums correspondants\nINSERT INTO Citations_Albums (citation_id, album_id, page) VALUES\n    (1, 1, 5),\n    (2, 1, 10),\n    (3, 1, 15),\n    (4, 2, 3),\n    (5, 2, 8),\n    (6, 3, 10),\n    (7, 4, 7),\n    (8, 5, 12),\n    (9, 6, 5),\n    (10, 7, 9);\n\n-- Ajouter les lecteurs \u00e0 la table Lecteurs\nINSERT INTO Lecteurs (nom, prenom, email)\nVALUES\n    ('D\u00e9vore', 'Page', 'page.devore@example.com'),\n    ('Chapitre', 'Premier', 'premier.chapitre@example.com'),\n    ('Spontan\u00e9e', 'Lecture', 'lecture.spontanee@example.com');\n<\/pre>\n\n\n\n<p>Ajoutons les lectures suivantes pour D\u00e9vore Page; Tintin en Am\u00e9rique, L&rsquo;\u00cele noire et Le Crabe aux pinces d&rsquo;or.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Ajout des lectures pour D\u00e9vore Page (lecteur_id = 1)\nINSERT INTO Lectures (lecteur_id, album_id) VALUES\n    (1, 3),  -- Tintin en Am\u00e9rique\n    (1, 7),  -- L'\u00cele noire\n    (1, 9);  -- Le Crabe aux pinces d'or\n\n-- -----------------------------------------------------------------\n-- Ou bien, \u00e0 partir du nom des albums:\n\n-- S\u00e9lectionner les identifiants d'album pour les albums sp\u00e9cifiques\nDECLARE\n    v_album_tintin_en_amerique NUMBER;\n    v_album_l_ile_noire NUMBER;\n    v_album_le_crabe_aux_pinces_d_or NUMBER;\nBEGIN\n    SELECT album_id INTO v_album_tintin_en_amerique FROM Albums WHERE titre = 'Tintin en Am\u00e9rique';\n    SELECT album_id INTO v_album_l_ile_noire FROM Albums WHERE titre = 'L''\u00cele noire';\n    SELECT album_id INTO v_album_le_crabe_aux_pinces_d_or FROM Albums WHERE titre = 'Le Crabe aux pinces d''or';\n\n    -- Ajout des lectures pour D\u00e9vore Page\n    INSERT INTO Lectures (lecteur_id, album_id) VALUES\n        (1, v_album_tintin_en_amerique),\n        (1, v_album_l_ile_noire),\n        (1, v_album_le_crabe_aux_pinces_d_or);\nEND;\n\/\n\n-- ---------------------------------------------------------------------\n-- Ou encore:\nDECLARE\n    v_lecteur_id NUMBER;\nBEGIN\n    SELECT lecteur_id INTO v_lecteur_id FROM Lecteurs WHERE nom = 'D\u00e9vore' AND prenom = 'Page';\n    \n    -- Ajouter les lectures pour \"D\u00e9vore Page\"\n    INSERT INTO Lecteurs_Albums (lecteur_id, album_id)\n    SELECT v_lecteur_id, album_id FROM Albums WHERE titre IN ('Tintin en Am\u00e9rique', 'L''\u00cele noire', 'Le Tr\u00e9sor de Rackham le Rouge');\n    \n    COMMIT;\nEXCEPTION\n    WHEN NO_DATA_FOUND THEN\n        DBMS_OUTPUT.PUT_LINE('Lecteur \"D\u00e9vore Page\" non trouv\u00e9.');\n    WHEN OTHERS THEN\n        DBMS_OUTPUT.PUT_LINE('Erreur lors de l''insertion des lectures : ' || SQLERRM);\n        ROLLBACK;\nEND;\n\/\n<\/pre>\n\n\n\n<p>Ajoutons les lectures suivantes pour Chapitre Premier; Le Secret de La Licorne, Tintin au pays des Soviets<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Obtenir l'identifiant du lecteur \"Chapitre Premier\"\nDECLARE\n    v_lecteur_id NUMBER;\nBEGIN\n    SELECT lecteur_id INTO v_lecteur_id FROM Lecteurs WHERE nom = 'Chapitre' AND prenom = 'Premier';\n\n    -- Obtenir les identifiants des albums\n    DECLARE\n        v_album_id_sl NUMBER;\n        v_album_id_tps NUMBER;\n    BEGIN\n        SELECT album_id INTO v_album_id_sl FROM Albums WHERE titre = 'Le Secret de La Licorne';\n        SELECT album_id INTO v_album_id_tps FROM Albums WHERE titre = 'Tintin au pays des Soviets';\n\n        -- Ajouter les lectures pour \"Chapitre Premier\"\n        INSERT INTO Lecteurs_Albums (lecteur_id, album_id)\n        VALUES\n            (v_lecteur_id, v_album_id_sl), -- Lecture de \"Le Secret de La Licorne\"\n            (v_lecteur_id, v_album_id_tps); -- Lecture de \"Tintin au pays des Soviets\";\n            \n        COMMIT;\n    EXCEPTION\n        WHEN NO_DATA_FOUND THEN\n            DBMS_OUTPUT.PUT_LINE('Album non trouv\u00e9.');\n        WHEN OTHERS THEN\n            DBMS_OUTPUT.PUT_LINE('Erreur lors de l''insertion des lectures : ' || SQLERRM);\n            ROLLBACK;\n    END;\nEND;\n\/<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Afficher toutes les citations du Capitaine Haddock\n\nSELECT\n    P.nom AS nom_personnage,\n    C.personnage_id,\n    C.texte AS citation_texte\nFROM\n    Citations C\nJOIN\n    Personnages P ON C.personnage_id = P.personnage_id\nWHERE\n    C.personnage_id = (\n        SELECT personnage_id\n        FROM Personnages\n        WHERE nom = 'Capitaine Haddock'\n    );<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Afficher le nom des lecteurs et le nom des albums lus tri\u00e9 par lecteur\nSELECT\n    l.nom    AS nom_lecteur,\n    l.prenom AS prenom_lecteur,\n    a.titre  AS titre_album\nFROM\n    lecteurs l\n    JOIN lecteurs_albums la ON l.lecteur_id = la.lecteur_id\n    JOIN albums          a  ON la.album_id = a.album_id\nORDER BY\n    l.nom,\n    l.prenom,\n    a.titre;<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Afficher le nombre de lectures des albums\nSELECT\n    substr(a.titre, 1, 40) AS titre_album,\n    COUNT(la.album_id)     AS nombre_de_lectures\nFROM\n    albums          a\n    LEFT JOIN lecteurs_albums la ON a.album_id = la.album_id\nGROUP BY\n    substr(a.titre, 1, 40)\nORDER BY\n    nombre_de_lectures DESC,\n    titre_album;<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><a href=\"https:\/\/www.oracletutorial.com\/oracle-basics\/oracle-identity-column\/\">Docum externe<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/chartio.com\/resources\/tutorials\/how-to-define-an-auto-increment-primary-key-in-oracle\/\">Auto Incr\u00e9ment avec Oracle pour les anciennes versions<\/a> <\/p>\n\n\n\n<p>NOTE:  L&rsquo;utilisateur doit poss\u00e9der le privil\u00e8ge syst\u00e8me &lsquo;CREATE SEQUENCE&rsquo; pour utiliser la clause &lsquo;GENERATED AS IDENTITY&rsquo;.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n","protected":false},"excerpt":{"rendered":"<p>1 &#8211; Pr\u00e9sentation Oracle est un incontournable dans les DB des grandes organisations. Son SGBD occupe la troisi\u00e8me place dans les parts de march\u00e9 global. On retrouve souvent le SGBD Oracle dans des entreprises de 10 000+ employ\u00e9s. 1.1 &#8211; Oracle Multitenant \u00ab\u00a0Oracle Multitenant permet \u00e0 une base de donn\u00e9es Oracle Database de fonctionner comme [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-287","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/287","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/comments?post=287"}],"version-history":[{"count":60,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/287\/revisions"}],"predecessor-version":[{"id":1028,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/287\/revisions\/1028"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/media?parent=287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}