Skip to content

Commit 9777f3c

Browse files
loiclefevrebenjagm
andauthored
Fix for PR1386 (#1401)
* Oracle case study * Oracle case study, minor fixes * JSON format inside tables, InfoBox and Warning components, Markdown imdage component * Title modification * Banner change, JSON in table format * Banner change, JSON in table format, InfoBox, Danger * Banner change, JSON in table format * Banner change * Applying blog style * Rollback to previous version * Oracle case study with right blog style. --------- Co-authored-by: Benjamin Granados <[email protected]>
1 parent 7e78fe8 commit 9777f3c

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

pages/blog/posts/oracle-case-study.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ tags:
55
- database
66
- relational
77
type: Case Study
8-
cover: /img/posts/2025/oracle-case-study/blog_frontpage.webp
8+
cover: /img/posts/2025/oracle-case-study/banner.webp
99
authors:
1010
- name: Loïc Lefèvre
1111
photo: /img/avatars/loiclefevre.webp
@@ -594,13 +594,13 @@ With all this in place, our React frontend can now create the following form:
594594

595595
![React frontend with input form generated from an annotated Oracle Database 23ai JSON schema.](/img/posts/2025/oracle-case-study/form.webp)
596596

597-
> 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:
598-
> ```sql
599-
> ALTER TABLE products MODIFY name ANNOTATIONS (
600-
> REPLACE "title" 'Product name'
601-
> );
602-
> ```
603-
>
597+
<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:
598+
```sql
599+
ALTER TABLE products MODIFY name ANNOTATIONS (
600+
REPLACE "title" 'Product name'
601+
);
602+
```
603+
</Infobox>
604604

605605

606606
#### JSON Relational Duality View
@@ -721,7 +721,7 @@ Running the 2 queries above respectively returns the data in JSON format:
721721
|Wooden spatula|4.99|42|
722722
|Other nice product|5|10|
723723

724-
> 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+
<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>
725725

726726
#### POST method
727727

@@ -755,7 +755,7 @@ With 23ai, a check constraint can now be marked as [`PRECHECK`](https://docs.ora
755755

756756
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.
757757

758-
> 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.
758+
<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>
759759

760760
```sql
761761
-- Mark check constraints as PRECHECK
@@ -1016,7 +1016,7 @@ select p.content.publishedDate.timestamp() + interval '5' day
10161016
from posts p;
10171017
```
10181018

1019-
> 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.
1019+
<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>
10201020

10211021
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.
10221022

@@ -1101,7 +1101,7 @@ Results:
11011101
| {<br/>&nbsp;&nbsp;"firstName": "Bob",<br/>&nbsp;&nbsp;"address": "Paris",<br/>&nbsp;&nbsp;"vat": false<br/>} |Paris|Bob|false|null|
11021102
| {<br/>&nbsp;&nbsp;"firstName": "Bob",<br/>&nbsp;&nbsp;"address": "Paris",<br/>&nbsp;&nbsp;"vat": false,<br/>&nbsp;&nbsp;"tableEvolve": true<br/>} |Paris|Bob|false|true|
11031103

1104-
> 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.
1104+
<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>
11051105

11061106
## Conclusion
11071107

0 commit comments

Comments
 (0)