You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -16,6 +16,8 @@ excerpt: "As modern multi-model databases increasingly support JSON, it's time t
16
16
17
17
As modern multi-model databases increasingly support JSON, it's time to explore what role [JSON schema](https://json-schema.org/) will play. In this post, we'll dive into the newly developed ["Database Vocabulary"](https://github.com/json-schema-org/vocab-database/blob/main/database.md), a proposed extension to the official JSON schema specification, developed by Oracle (with inputs from the MySQL and PostgreSQL teams). This vocabulary addresses key database tasks, including validation, type coercion/casting, and metadata preservation, making it easier to manage JSON in databases effectively and bridging the gap with existing relational data. Regardless of whether you are a JSON developer or a relational model developer, you'll learn something reading this post!
18
18
19
+

20
+
19
21
Oracle Database 23ai fully implements this new vocabulary, and we'll describe not only the concepts but we'll also see real-world examples of JSON schema validation in action and how to describe database objects in JSON schema.
20
22
21
23
## JSON Data Guide
@@ -566,6 +568,7 @@ BEGIN
566
568
'select getAnnotatedJSONSchema( ''PRODUCTS'' ) as schema');
567
569
568
570
COMMIT;
571
+
569
572
END;
570
573
/
571
574
```
@@ -593,13 +596,13 @@ With all this in place, our React frontend can now create the following form:
593
596
594
597

595
598
596
-
<Infobox> Interestingly, whenever you change the schema annotation in the database, it is immediately reflected inside your browser once you refreshed it. You can try with:
597
-
```sql
598
-
ALTERTABLE products MODIFY name ANNOTATIONS (
599
-
REPLACE "title"'Product name'
600
-
);
601
-
```
602
-
</Infobox>
599
+
> Interestingly, whenever you change the schema annotation in the database, it is immediately reflected inside your browser once you refreshed it. You can try with:
600
+
> ```sql
601
+
>ALTER TABLE products MODIFY name ANNOTATIONS (
602
+
> REPLACE "title"'Product name'
603
+
>);
604
+
>```
605
+
>
603
606
604
607
605
608
#### JSON Relational Duality View
@@ -720,7 +723,7 @@ Running the 2 queries above respectively returns the data in JSON format:
720
723
|Wooden spatula|4.99|42|
721
724
|Other nice product|5|10|
722
725
723
-
<Infobox>The `_metadata` object will contain additional information such as an `etag` that can be used for [optimistic concurrency control](https://docs.oracle.com/en/database/oracle/oracle-database/23/jsnvu/using-optimistic-concurrency-control-duality-views.html).</Infobox>
726
+
> The `_metadata` object will contain additional information such as an `etag` that can be used for [optimistic concurrency control](https://docs.oracle.com/en/database/oracle/oracle-database/23/jsnvu/using-optimistic-concurrency-control-duality-views.html).
724
727
725
728
#### POST method
726
729
@@ -742,7 +745,9 @@ BEGIN
742
745
end;');
743
746
744
747
COMMIT;
748
+
745
749
END;
750
+
746
751
/
747
752
```
748
753
@@ -752,7 +757,7 @@ With 23ai, a check constraint can now be marked as [`PRECHECK`](https://docs.ora
752
757
753
758
Once a check constraint is marked as `PRECHECK`, you have the choice whether or not to disable the check constraint on the table as the retrieved JSON schema with `dbms_json_schema.describe()` will contain the check constraints as well.
754
759
755
-
<Danger>We do **NOT** advise to disable check constraints as it would allow inserting bad data into the relational tables directly. The remark about `PRECHECK` constraints is here to provide as much information as possible.</Danger>
760
+
> We do **NOT** advise to disable check constraints as it would allow inserting bad data into the relational tables directly. The remark about `PRECHECK` constraints is here to provide as much information as possible.
756
761
757
762
```sql
758
763
-- Mark check constraints as PRECHECK
@@ -1013,7 +1018,7 @@ select p.content.publishedDate.timestamp() + interval '5' day
1013
1018
from posts p;
1014
1019
```
1015
1020
1016
-
<Infobox>We use the item method `timestamp()` in the last statement above because otherwise the SQL dot notation would return a SQL `JSON` (by default in 23ai) on which we cannot apply an interval operation. However, because the value is already stored as `TIMESTAMP` inside the binary JSON format, there will be *no conversion* from `JSON` to `timestamp` here.</Infobox>
1021
+
> We use the item method `timestamp()` in the last statement above because otherwise the SQL dot notation would return a SQL `JSON` (by default in 23ai) on which we cannot apply an interval operation. However, because the value is already stored as `TIMESTAMP` inside the binary JSON format, there will be *no conversion* from `JSON` to `timestamp` here.
1017
1022
1018
1023
Last but not least, by enabling type casting, native SQL data type checks are also performed ensuring 100% fidelity between stored binary values in the encoded JSON and SQL data types. As a result, we can store not just the standard JSON data types but also the SQL data types inside the encoded binary JSON such as `NUMBER`, `DATE`, `TIMESTAMP`, `TIMESTAMP WITH TIME ZONE`, `INTERVAL`, `RAW`, `VECTOR`, etc.
<Infobox>The trigger executes asynchronously, hence not delaying DML response times, however, because of it being asynchronous, it may take a second before you will see the new virtual column.</Infobox>
1106
+
> The trigger executes asynchronously, hence not delaying DML response times, however, because of it being asynchronous, it may take a second before you will see the new virtual column.
0 commit comments