1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Oracle Database 23c Free - Developer ReleaseでPL/SQLでのJSON型のデータ変換を試す

Last updated at Posted at 2023-06-23

はじめに

Oracle Database 23c Free - Developer ReleaseでJSON constructorとJSON_VALUEがJSON型の変換をサポートするようになったので試してみたいと思います。

Oracle Database 23c Free - Developer Releaseのインストール

こちらを参考にインストールします。

Setting Oracle Database Free Environment Variablesまで実行できたら完了です。

データベースへの接続

SQL*Plusからsysdbaとしてコンテナ・データベースに接続します。

[oracle@instance-20230605-1511-db23c ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Fri Jun 9 02:57:37 2023
Version 23.2.0.0.0

Copyright (c) 1982, 2023, Oracle.  All rights reserved.


Connected to:
Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release
Version 23.2.0.0.0

ALTER SESSION SET CONTAINER文でPDB(FREEPDB1)に接続します。

SQL> ALTER SESSION SET CONTAINER=FREEPDB1;

Session altered.

SQL> 

確認用にPL/SQLの標準出力を表示に変えておきます。

set serveroutput on

これで検証の準備が整いました。

文字列のJSONデータをJSON型に変換する

最初に文字列のJSONデータをJSON型に変換してみます。
以下のSQLを実行します。

WITH JTAB AS (
    SELECT
        JSON( '{ "name" : "Alexis Bill",
        "Address": { "street" : "200 Sporting Green",
                     "city" : "South San Francisco",
                     "state" : "CA",
                     "zipCode" : 99236,
                     "country" : "United States of America" } }') AS JCOL
    FROM
        DUAL
)
SELECT
    J.JCOL.Address.city
FROM
    JTAB J;

以下の結果が出力され文字列のJSONデータがJSON型に変換されていることが確認できます。

ADDRESS
--------------------------------------------------------------------------------
"South San Francisco"

VARRAY型をJSON型に変換する

次にVARRAY型をJSON型に変換してみます。
以下のPL/SQLを実行します。

DECLARE
	TYPE theVarray IS VARRAY(4) OF NUMBER;
	myVarray theVarray := theVarray(1, 2, 3, null);
	myJSON JSON;
BEGIN
	myJSON := JSON(myVarray);
	DBMS_OUTPUT.PUT_LINE(JSON_SERIALIZE(myJSON));
END;
/

以下の結果が出力されます。VARRAY型をJSON型に変換してjson_serializeでテキスト表記にして出力しています。正しく出力されていることで変換されていることが確認できます。

[1,2,3,null]

JSON型をVARRAY型に変換する

次は逆にJSON型をVARRAY型に変換します。
以下のPL/SQLを実行します。

DECLARE
	TYPE theVarray IS VARRAY(5) OF NUMBER;
	myVarray theVarray;
BEGIN
	myVarray := JSON_VALUE(JSON('[1, 2, 3, 4, 5]'), '$' RETURNING theVarray);

	DBMS_OUTPUT.PUT_LINE('COUNT = ' || myVarray.COUNT);

	FOR i IN 1..myVarray.COUNT LOOP
		DBMS_OUTPUT.PUT_LINE(myVarray(i));
	END LOOP;
END;
/

以下のように出力されJSON型をVARRAY型に変換されていることが確認できます。

COUNT = 5
1
2
3
4
5

連想配列をJSON型に変換する

次は連想配列をJSON型に変換してみます。
以下のPL/SQLを実行します。

DECLARE
	TYPE AsscArray IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);
	myAsscArray AsscArray := AsscArray('FIRST_NAME' => 'Bob', 'LAST_NAME' => 'Jones');
	myJson JSON;
BEGIN
	myJson := JSON(myAsscArray);
	DBMS_OUTPUT.PUT_LINE(JSON_SERIALIZE(myJson));
END;
/

以下の結果が出力され、連想配列からJSON型に変換されていることが確認できます。

{"FIRST_NAME":"Bob","LAST_NAME":"Jones"}

JSON型を連想配列に変換する

次は逆にJSON型から連想配列に変換します。
以下のPL/SQLを実行します。

DECLARE
	TYPE theAsscArray IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
	myAsscArray theAsscArray;
BEGIN
	myAsscArray := JSON_VALUE(JSON('{"Key1":10, "Key2":20}'), '$' RETURNING theAsscArray);
	DBMS_OUTPUT.PUT_LINE('COUNT = ' || myAsscArray.COUNT);
	DBMS_OUTPUT.PUT_LINE(myAsscArray('Key1'));
	DBMS_OUTPUT.PUT_LINE(myAsscArray('Key2'));
END;
/

以下の結果が出力されJSON型から連想配列に変換されていることが確認できます。

COUNT = 2
10
20

まとめ

試してみたところ、JSON型からVARRAY、連想配列などの型に変換できることが確認できました。変換できることでPL/SQLとJSONをサポートする言語間でのデータ交換がしやすくなるように思います。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?