{"id":680,"date":"2023-09-30T13:08:11","date_gmt":"2023-09-30T17:08:11","guid":{"rendered":"https:\/\/ve2cuy.com\/?page_id=680"},"modified":"2024-09-18T10:07:10","modified_gmt":"2024-09-18T14:07:10","slug":"420-5d3-bd-vues","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/index.php\/420-5d3-bd-vues\/","title":{"rendered":"420-5D3 : BD &#8211; Vues"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"225\" height=\"225\" src=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/vue.png\" alt=\"\" class=\"wp-image-685\" srcset=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/vue.png 225w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/vue-150x150.png 150w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">D\u00e9finition<\/h2>\n\n\n\n<p>Dans une base de donn\u00e9es, une vue (ou \u00ab\u00a0view\u00a0\u00bb en anglais) est une repr\u00e9sentation virtuelle d&rsquo;une ou plusieurs tables de la base de donn\u00e9es. Elle est utilis\u00e9e pour simplifier l&rsquo;acc\u00e8s aux donn\u00e9es en permettant aux utilisateurs de r\u00e9cup\u00e9rer, manipuler et interroger les donn\u00e9es de mani\u00e8re plus conviviale, sans avoir besoin de conna\u00eetre la structure interne des tables sous-jacentes. Les vues offrent plusieurs avantages, notamment la s\u00e9curit\u00e9, la simplification des requ\u00eates et la r\u00e9duction de la complexit\u00e9 pour les utilisateurs.<\/p>\n\n\n\n<p>Voici le r\u00f4le principal des vues dans une base de donn\u00e9es Oracle :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Simplification de l&rsquo;acc\u00e8s aux donn\u00e9es : Les vues permettent de regrouper des donn\u00e9es de plusieurs tables en une seule entit\u00e9 logique. Cela facilite l&rsquo;acc\u00e8s aux informations et rend les requ\u00eates plus simples \u00e0 \u00e9crire et \u00e0 comprendre.<\/li>\n\n\n\n<li>S\u00e9curit\u00e9 : Les vues peuvent \u00eatre utilis\u00e9es pour limiter l&rsquo;acc\u00e8s aux donn\u00e9es sensibles en ne permettant aux utilisateurs d&rsquo;acc\u00e9der qu&rsquo;aux donn\u00e9es autoris\u00e9es. Par exemple, vous pouvez cr\u00e9er une vue qui masque certaines colonnes ou lignes de donn\u00e9es confidentielles.<\/li>\n\n\n\n<li>Abstraction de la structure sous-jacente : Les vues masquent la complexit\u00e9 de la structure sous-jacente de la base de donn\u00e9es, ce qui permet aux d\u00e9veloppeurs d&rsquo;applications de travailler avec des donn\u00e9es de mani\u00e8re plus intuitive, sans avoir besoin de conna\u00eetre les d\u00e9tails de la base de donn\u00e9es.<\/li>\n\n\n\n<li>R\u00e9utilisation : Vous pouvez cr\u00e9er des vues r\u00e9utilisables pour simplifier les op\u00e9rations courantes. Par exemple, une vue peut \u00eatre cr\u00e9\u00e9e pour afficher uniquement les donn\u00e9es des employ\u00e9s actifs, que vous pouvez utiliser dans de nombreuses requ\u00eates sans avoir \u00e0 sp\u00e9cifier les crit\u00e8res de s\u00e9lection \u00e0 chaque fois.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Syntaxe<\/h2>\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=\"\">CREATE [OR REPLACE] VIEW view_name [(column_aliases)] AS\n    defining-query\n[WITH READ ONLY]\n[WITH CHECK OPTION]<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Exemple d&rsquo;utilisation d&rsquo;une vue<\/h2>\n\n\n\n<p>Supposons que vous ayez une base de donn\u00e9es contenant deux tables : une table \u00ab\u00a0Employ\u00e9s\u00a0\u00bb et une table \u00ab\u00a0D\u00e9partements\u00a0\u00bb. <\/p>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color\"><strong>Table \u00ab\u00a0Employes\u00a0\u00bb :<\/strong><\/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=\"\">CREATE TABLE Employes (\n    ID NUMBER(5) PRIMARY KEY,\n    Nom VARCHAR2(50),\n    Prenom VARCHAR2(50),\n    Salaire NUMBER(10, 2),\n    IDDepartement NUMBER(5),\n    DateEmbauche DATE\n);<\/pre>\n\n\n\n<p>Dans cette table, nous avons les colonnes suivantes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00ab\u00a0ID\u00a0\u00bb : Une cl\u00e9 primaire num\u00e9rique unique pour chaque employ\u00e9.<\/li>\n\n\n\n<li>\u00ab\u00a0Nom\u00a0\u00bb : Le nom de l&#8217;employ\u00e9.<\/li>\n\n\n\n<li>\u00ab\u00a0Prenom\u00a0\u00bb : Le pr\u00e9nom de l&#8217;employ\u00e9.<\/li>\n\n\n\n<li>\u00ab\u00a0Salaire\u00a0\u00bb : Le salaire de l&#8217;employ\u00e9 avec deux d\u00e9cimales.<\/li>\n\n\n\n<li>\u00ab\u00a0IDDepartement\u00a0\u00bb : Une r\u00e9f\u00e9rence vers le d\u00e9partement auquel l&#8217;employ\u00e9 appartient.<\/li>\n\n\n\n<li>\u00ab\u00a0DateEmbauche\u00a0\u00bb : La date \u00e0 laquelle l&#8217;employ\u00e9 a \u00e9t\u00e9 embauch\u00e9.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-vivid-cyan-blue-color has-text-color\"><strong>Table \u00ab\u00a0Departements\u00a0\u00bb :<\/strong><\/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=\"\">CREATE TABLE Departements (\n    ID NUMBER(5) PRIMARY KEY,\n    Nom VARCHAR2(50),\n    Localisation VARCHAR2(50)\n);<\/pre>\n\n\n\n<p>Dans la table \u00ab\u00a0Departements\u00a0\u00bb, nous avons les colonnes suivantes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00ab\u00a0ID\u00a0\u00bb : Une cl\u00e9 primaire num\u00e9rique unique pour chaque d\u00e9partement.<\/li>\n\n\n\n<li>\u00ab\u00a0Nom\u00a0\u00bb : Le nom du d\u00e9partement.<\/li>\n\n\n\n<li>\u00ab\u00a0Localisation\u00a0\u00bb : La localisation ou l&#8217;emplacement du d\u00e9partement.<\/li>\n<\/ul>\n\n\n\n<p>Ces deux tables sont li\u00e9es par la colonne \u00ab\u00a0IDDepartement\u00a0\u00bb dans la table \u00ab\u00a0Employes\u00a0\u00bb, qui fait r\u00e9f\u00e9rence \u00e0 la cl\u00e9 primaire \u00ab\u00a0ID\u00a0\u00bb dans la table \u00ab\u00a0Departements\u00a0\u00bb. Cette relation permet de relier chaque employ\u00e9 \u00e0 un d\u00e9partement sp\u00e9cifique dans la base de donn\u00e9es.<\/p>\n\n\n\n<p>Vous pouvez cr\u00e9er une <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">vue<\/mark><\/strong> appel\u00e9e \u00ab\u00a0<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">VueEmploy\u00e9s<\/mark><\/strong>\u00a0\u00bb qui regroupe des informations sur les employ\u00e9s et leurs d\u00e9partements respectifs. <\/p>\n\n\n\n<p>Voici comment utiliser cette vue :<\/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=\"\">-- Cr\u00e9er la vue VueEmploy\u00e9s\nCREATE VIEW VueEmployes AS\nSELECT E.Nom, E.Prenom, E.Salaire, D.Nom AS Departement\nFROM Employes E\nINNER JOIN Departements D ON E.IDDepartement = D.ID;\n\n-- S\u00e9lectionner des donn\u00e9es \u00e0 partir de la vue\nSELECT * FROM VueEmployes;\n\n-- S\u00e9lectionner uniquement les employ\u00e9s d'un d\u00e9partement sp\u00e9cifique\nSELECT * FROM VueEmployes WHERE Departement = 'Ventes';\n\n-- Mettre \u00e0 jour les informations sur les employ\u00e9s via la vue\nUPDATE VueEmployes SET Salaire = Salaire * 1.10 WHERE Departement = 'Ventes';<\/pre>\n\n\n\n<p>Dans cet exemple, la vue \u00ab\u00a0VueEmployes\u00a0\u00bb regroupe les donn\u00e9es des employ\u00e9s et des d\u00e9partements, ce qui permet aux utilisateurs de r\u00e9cup\u00e9rer facilement des informations sur les employ\u00e9s et de mettre \u00e0 jour leur salaire, le tout sans avoir \u00e0 acc\u00e9der directement aux tables sous-jacentes \u00ab\u00a0<strong>Employes<\/strong>\u00a0\u00bb et \u00ab\u00a0<strong>Departements<\/strong>\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\">Exp\u00e9rimentation avec la base de donn\u00e9es d\u00e9mo<\/h2>\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>:  \u00c0 partir de cette \u00e9tape, la <a href=\"https:\/\/www.oracletutorial.com\/getting-started\/create-oracle-sample-database-for-practice\/\">base de donn\u00e9es DEMO<\/a> doit \u00eatre install\u00e9e.<\/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=\"\">-- Avec Alias\nCREATE OR REPLACE VIEW employee_yos AS\nSELECT\n    employee_id,\n    first_name || ' ' || last_name full_name,\n    FLOOR( months_between( CURRENT_DATE, hire_date )\/ 12 ) yos,\n    EMAIL courriel\nFROM\n    employees;\n\n\n-- Sans Alias\nCREATE VIEW employee_yos (employee_id, full_name, yos) AS\nSELECT\n    employee_id,\n    first_name || ' ' || last_name,\n    FLOOR( months_between( CURRENT_DATE, hire_date )\/ 12 )\nFROM\n    employees;<\/pre>\n\n\n\n<p>Utilisation de la vue<\/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=\"\">column full_name format a30\n\nSELECT\n    *\nFROM\n    employee_yos\nWHERE\n    yos > 6\nORDER BY\n    full_name; \n    <\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9ation d&rsquo;une vue en lecture seule<\/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=\"\">CREATE OR REPLACE VIEW customer_credits(\n        customer_id,\n        name,\n        credit\n    ) AS \nSELECT\n        customer_id,\n        name,\n        credit_limit\n    FROM\n        customers WITH READ ONLY;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple d&rsquo;un vue avec une <a href=\"https:\/\/sql.sh\/cours\/jointures\">jointure<\/a><\/h3>\n\n\n\n<p>Nous allons ici cr\u00e9er une vue qui lit trois tables ensembles: &nbsp;<code>orders<\/code>,&nbsp;<code>order_items<\/code>, and&nbsp;<code>products<\/code>.  Elle permettra d&rsquo;obtenir les commandes qui sont en attentes de traitement.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.oracletutorial.com\/wp-content\/uploads\/2017\/08\/orders_order_items_products_tables.png\" alt=\"orders, order_items, and products tables\" class=\"wp-image-648\" style=\"width:441px;height:129px\" width=\"441\" height=\"129\" title=\"orders, order_items, and products tables\"\/><\/figure>\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=\"\">--- Cr\u00e9ation d'une vue \u00e0 partir de trois tables.\n\nCREATE OR REPLACE VIEW backlogs AS\nSELECT\n    product_name,\n    EXTRACT(\n        YEAR\n    FROM\n        order_date\n    ) YEAR,\n    SUM( quantity * unit_price ) amount\nFROM\n    orders\nINNER JOIN order_items\n        USING(order_id)\nINNER JOIN products\n        USING(product_id)\nWHERE\n    status = 'Pending'\nGROUP BY\n    EXTRACT(\n        YEAR\n    FROM\n        order_date\n    ),\n    product_name;\n\n---\nselect TRIM(product_name) as Nom, amount Montant from backlogs where amount > 200000;<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">DROP VIEW<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-oracle-tutorial wp-block-embed-oracle-tutorial\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"uzas2Xtgzv\"><a href=\"https:\/\/www.oracletutorial.com\/oracle-view\/oracle-drop-view\/\">Oracle DROP VIEW<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Oracle DROP VIEW&#8221; &#8212; Oracle Tutorial\" src=\"https:\/\/www.oracletutorial.com\/oracle-view\/oracle-drop-view\/embed\/#?secret=7uURSGLhIW#?secret=uzas2Xtgzv\" data-secret=\"uzas2Xtgzv\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Updatable View<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-oracle-tutorial wp-block-embed-oracle-tutorial\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"q9QdZX7woX\"><a href=\"https:\/\/www.oracletutorial.com\/oracle-view\/oracle-updatable-view\/\">Oracle Updatable View<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Oracle Updatable View&#8221; &#8212; Oracle Tutorial\" src=\"https:\/\/www.oracletutorial.com\/oracle-view\/oracle-updatable-view\/embed\/#?secret=0dv8KQcUzR#?secret=q9QdZX7woX\" data-secret=\"q9QdZX7woX\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">JSON-Relational Duality Views<\/h2>\n\n\n\n<p>La version 23c d&rsquo;Oracle introduit un nouveau type de vue qui permet d&rsquo;utiliser le format JSON pour le traitement des donn\u00e9es.  Il sera possible soit d&rsquo;obtenir les enregistrements dans ce format ou d&rsquo;utiliser JSON pour leur cr\u00e9ation ou leur mise \u00e0 jour.  <\/p>\n\n\n\n<p>Il est possible d&rsquo;utiliser deux syntaxes pour repr\u00e9senter la structure de donn\u00e9es dans la vue:<\/p>\n\n\n\n<p>1  &#8211; JSON, par exemple:<\/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=\"\">--- Repr\u00e9sentation de la table COUNTRIES en utilisant JSON:\n{       \n    'idPays'   : COUNTRY_ID,\n    'pNom'     : COUNTRY_NAME, \n    'idRegion' : REGION_ID\n}<\/pre>\n\n\n\n<p>2 &#8211; GraphQL, par exemple<\/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=\"\">--- Repr\u00e9sentation de la table COUNTRIES en utilisant GraphQL:\n{\n    idPays   : COUNTRY_ID\n    pNom     : COUNTRY_NAME \n    idRegion : REGION_ID\n};   <\/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>: \u00c9tant donn\u00e9 que GraphQL propose une syntaxe moins rigide, c&rsquo;est ce que nous utiliserons dans les exemples suivants.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Vue JS &#8211; Exemple GraphQL<\/h2>\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=\"\">create or replace json relational duality view pays_dv as\n    countries @insert @update @delete\n    {\n        idPays   : COUNTRY_ID\n        pNom     : COUNTRY_NAME \n        idRegion : REGION_ID\n    \n    };  \n\n--- Exemple d'utilisation\n\nselect * from pays_dv fetch first 5 rows only;<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"128\" src=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/Capture-decran-le-2023-10-07-a-10.44.33-1024x128.png\" alt=\"\" class=\"wp-image-834\" srcset=\"https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/Capture-decran-le-2023-10-07-a-10.44.33-1024x128.png 1024w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/Capture-decran-le-2023-10-07-a-10.44.33-300x38.png 300w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/Capture-decran-le-2023-10-07-a-10.44.33-768x96.png 768w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/Capture-decran-le-2023-10-07-a-10.44.33-1536x192.png 1536w, https:\/\/ve2cuy.com\/wp-content\/uploads\/2023\/10\/Capture-decran-le-2023-10-07-a-10.44.33.png 1932w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\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 * from pays_dv fetch first 5 rows only;\n\n--- R\u00e9sultat:\n{\"idPays\":\"AR\",\"pNom\":\"Argentina\",\"idRegion\":2,\"_metadata\":{\"etag\":\"27952F8C7AB11845D42FCFA0440B9B69\",\"asof\":\"0000000000A628E2\"}}\n\n-- Avec json_serialize(d.data pretty)\nselect json_serialize(d.data pretty)from pays_dv d;\n\n\n--- R\u00e9sultat:\n\"{\n  \"_metadata\" :\n  {\n    \"etag\" : \"27952F8C7AB11845D42FCFA0440B9B69\",\n    \"asof\" : \"0000000000A6292F\"\n  },\n  \"idPays\" : \"AR\",\n  \"pNom\" : \"Argentina\",\n  \"idRegion\" : 2\n}\"<\/pre>\n\n\n\n<p><strong>NOTE<\/strong>: Voir la section 3.2 de ce <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/23\/jsnvu\/updatable-json-relational-duality-views.html\">document<\/a> pour comprendre le r\u00f4le du champ &lsquo;etag&rsquo;. Le &lsquo;asof&rsquo; est le num\u00e9ro de la derni\u00e8re modification. <\/p>\n\n\n\n<p>Utilisation de la fonction json_serialize(d.data pretty), pour repr\u00e9senter la structure JSON sur plusieurs ligne:<\/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=\"\">-- S\u00e9lectionner les champs \u00e0 retourner:\n\n-- Exemple 01\nSELECT dv.DATA.pNom FROM pays_dv dv\nSELECT dv.DATA.pNom FROM pays_dv dv where dv.data.idPays LIKE 'C%';\n\n-- Exemple 02\nSELECT json_transform(data, KEEP '$.pNom', '$.idRegion') FROM pays_dv;\nSELECT json_serialize(json_transform(data, KEEP '$.pNom', '$.idRegion') PRETTY) FROM pays_dv;\n\n-- R\u00e9sultat:\n\n\"{\n  \"pNom\" : \"Argentina\",\n  \"idRegion\" : 2\n}\"\n\"{\n  \"pNom\" : \"Australia\",\n  \"idRegion\" : 3\n}\"\n...\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Vue JS &#8211; Exemple JSON<\/h2>\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=\"\">create or replace json relational duality view pays_dv2 as\n    select json {       \n                    'idPays'   : c.COUNTRY_ID,\n                    'pNom'     : c.COUNTRY_NAME, \n                    'idRegion' : c.REGION_ID\n    }\nfrom COUNTRIES c with insert update delete;\n\n--- Utilisation\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Insertion avec une Duality View<\/h2>\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=\"\">INSERT INTO pays_dv VALUES ('\n                                {   idPays : \"QC\",\n                                    pNom : \"Qu\u00e9bec\",\n                                    idRegion   : 2\n                                }\n                            ');<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Mise \u00e0 jour d&rsquo;un enregistrement<\/h2>\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=\"\">UPDATE pays_dv dv\n  SET data = json_transform(data, SET '$.pNom' = 'Quebec n''est pas vraiment un pays') WHERE dv.data.idPays = 'QC';\nCOMMIT;     \n\nSELECT json_serialize(data PRETTY)\n  FROM pays_dv WHERE json_value(data, '$.pNom') LIKE 'Qu%';<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Exp\u00e9rimentation avec la BD d&rsquo;Oracle<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Construire le sch\u00e9ma<\/h2>\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=\"\">SET ECHO ON\nSET FEEDBACK 1\nSET NUMWIDTH 10\nSET LINESIZE 80\nSET TRIMSPOOL ON\nSET TAB OFF\nSET PAGESIZE 100\nSET LONG 20000\n\nprompt\nprompt ** Working with JSON Relational Duality Views using SQL **\nprompt\n\n-- Do cleanup for previous run (if any).\n--\ndrop view  if exists team_dv;\ndrop view  if exists race_dv;\ndrop view  if exists driver_dv;\ndrop table if exists driver_race_map;\ndrop table if exists race;\ndrop table if exists driver;\ndrop table if exists team;\n\n\n--------------------------------------------------\n-- Step 1: Create JSON Relational Duality Views --\n--------------------------------------------------\n\n-- Create base tables for the duality views.\n--\nCREATE TABLE team\n  (team_id INTEGER GENERATED BY DEFAULT ON NULL AS IDENTITY,\n   name    VARCHAR2(255) NOT NULL UNIQUE,\n   points  INTEGER NOT NULL,\n   CONSTRAINT team_pk PRIMARY KEY(team_id));\n\nCREATE TABLE driver\n  (driver_id INTEGER GENERATED BY DEFAULT ON NULL AS IDENTITY,\n   name      VARCHAR2(255) NOT NULL UNIQUE,\n   points    INTEGER NOT NULL,\n   team_id   INTEGER,\n   CONSTRAINT driver_pk PRIMARY KEY(driver_id),\n   CONSTRAINT driver_fk FOREIGN KEY(team_id) REFERENCES team(team_id));\n\nCREATE TABLE race\n  (race_id   INTEGER GENERATED BY DEFAULT ON NULL AS IDENTITY,\n   name      VARCHAR2(255) NOT NULL UNIQUE,\n   laps      INTEGER NOT NULL,\n   race_date DATE,\n   podium    JSON,\n   CONSTRAINT   race_pk PRIMARY KEY(race_id));\n  \nCREATE TABLE driver_race_map\n  (driver_race_map_id INTEGER GENERATED BY DEFAULT ON NULL AS IDENTITY,\n   race_id            INTEGER NOT NULL,\n   driver_id          INTEGER NOT NULL,\n   position           INTEGER,\n   CONSTRAINT     driver_race_map_uk  UNIQUE (race_id, driver_id),\n   CONSTRAINT     driver_race_map_pk  PRIMARY KEY(driver_race_map_id),\n   CONSTRAINT     driver_race_map_fk1 FOREIGN KEY(race_id)   REFERENCES race(race_id),\n   CONSTRAINT     driver_race_map_fk2 FOREIGN KEY(driver_id) REFERENCES driver(driver_id));\n\n-- Create a trigger on the driver_race_map table to populate\n-- the points fields in team and driver based on race results.\n--\n--- NOTE: Les d\u00e9clencheurs seront couverts plus tard.\nCREATE OR REPLACE TRIGGER driver_race_map_trigger\n  BEFORE INSERT ON driver_race_map\n  FOR EACH ROW\n  DECLARE\n    v_points  INTEGER;\n    v_team_id INTEGER;\nBEGIN\n  SELECT team_id INTO v_team_id FROM driver WHERE driver_id = :NEW.driver_id;\n\n  IF :NEW.position = 1 THEN\n    v_points := 25;\n  ELSIF :NEW.position = 2 THEN\n    v_points := 18;\n  ELSIF :NEW.position = 3 THEN\n    v_points := 15;\n  ELSIF :NEW.position = 4 THEN\n    v_points := 12;\n  ELSIF :NEW.position = 5 THEN\n    v_points := 10;\n  ELSIF :NEW.position = 6 THEN\n    v_points := 8;\n  ELSIF :NEW.position = 7 THEN\n    v_points := 6;\n  ELSIF :NEW.position = 8 THEN\n    v_points := 4;\n  ELSIF :NEW.position = 9 THEN\n    v_points := 2;\n  ELSIF :NEW.position = 10 THEN\n    v_points := 1;\n  ELSE\n    v_points := 0;\n  END IF;\n\n  UPDATE driver SET points = points + v_points\n    WHERE driver_id = :NEW.driver_id;\n  UPDATE team SET points = points + v_points\n    WHERE team_id = v_team_id;\nEND;\n\/\n<\/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>: Les d\u00e9clencheurs seront couverts plus tard.<\/p>\n\n\n\n<p><a href=\"https:\/\/oracle-base.com\/articles\/23c\/json-relational-duality-views-23c\">https:\/\/oracle-base.com\/articles\/23c\/json-relational-duality-views-23c<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/blogs.oracle.com\/database\/post\/json-relational-duality-app-dev?source=:so:ch:or:awr::::OCW23cbeta\">https:\/\/blogs.oracle.com\/database\/post\/json-relational-duality-app-dev?source=:so:ch:or:awr::::OCW23cbeta<\/a><\/p>\n\n\n\n<p>&#8211;> <a href=\"https:\/\/medium.com\/@liana.lixandru\/exploring-json-relational-duality-views-in-oracle-database-23c-free-developer-release-5f57555157f8\">https:\/\/medium.com\/@liana.lixandru\/exploring-json-relational-duality-views-in-oracle-database-23c-free-developer-release-5f57555157f8<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9finition Dans une base de donn\u00e9es, une vue (ou \u00ab\u00a0view\u00a0\u00bb en anglais) est une repr\u00e9sentation virtuelle d&rsquo;une ou plusieurs tables de la base de donn\u00e9es. Elle est utilis\u00e9e pour simplifier l&rsquo;acc\u00e8s aux donn\u00e9es en permettant aux utilisateurs de r\u00e9cup\u00e9rer, manipuler et interroger les donn\u00e9es de mani\u00e8re plus conviviale, sans avoir besoin de conna\u00eetre la structure [&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-680","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/680","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=680"}],"version-history":[{"count":14,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/680\/revisions"}],"predecessor-version":[{"id":1025,"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/pages\/680\/revisions\/1025"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/index.php\/wp-json\/wp\/v2\/media?parent=680"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}