将 JSON Oracle 查询转换为 PostgreSQL 数据库

您所在的位置:网站首页 数据库数据转换为json格式 将 JSON Oracle 查询转换为 PostgreSQL 数据库

将 JSON Oracle 查询转换为 PostgreSQL 数据库

2023-07-04 16:07| 来源: 网络整理| 查看: 265

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 JSON Oracle 查询转换为 PostgreSQL 数据库

由 Pinesh Singal (AWS) 和 Lokesh Gurram (AWS) 创建

环境:PoC 或试点

来源:数据库:关系型

目标:亚马逊 RDS PostgreSQL

R 类型:重新架

工作负载:甲骨文

技术:数据库;迁移

AWS 服务:Amazon Aurora;亚马逊 RDS

摘要

此从本地迁移到Amazon Web Services (AWS) 云的迁移过程使用 AWS Schema Conversion Tool (AWS SCT) 将代码从 Oracle 数据库转换为 PostgreSQL 数据库。大部分代码由 AWS SCT 自动转换。但是,与 JSON 相关的 Oracle 查询不会自动转换。

从 Oracle 12.2 版本开始,Oracle 数据库支持各种 JSON 函数,这些函数有助于将基于 JSON 的数据转换为基于行的数据。但是,AWS SCT 不会自动将基于 JSON 的数据转换为 PostgreSQL 支持的语言。

这种迁移模式主要侧重于将具有JSON_OBJECT、JSON_ARRAYAGG和等函数的 JSON 相关的 Oracle 查询JSON_TABLE从 Oracle 数据库手动转换为 PostgreSQL 数据库。

先决条件和限制

先决条件

活跃的 AWS 账户

本地 Oracle 数据库实例(安装和传输)

Amazon Relational Database PostgreSQL 或 Amazon Amazon Relational Database SQL 或 Amazon Relational

限制

与 JSON 相关的查询需要固定的KEY和格式。VALUE不使用该格式会返回错误的结果。

如果 JSON 结构的任何更改在结果节中添加了新的KEY和VALUE对,则必须在 SQL 查询中更改相应的过程或函数。

早期版本的 Oracle 和 PostgreSQL 支持一些与 JSON 相关的函数,但功能较少。

产品版本

Oracle Database 和传输

适用于 PostgreSQL 或与 Aurora postgreSQL 兼容 9.5 及更高版本的亚马逊

AWS SCT 最新版本(使用版本 1.0.664 进行测试)

架构

源技术堆栈

版本为 19c 的 Oracle 数据库实例

目标技术堆栈

版本 13 的Amazon RDS for PostgreSQL 或 Aurora 的 PostgreSQL 兼容数据库实例

目标架构

将 AWS SCT 与 JSON 函数代码一起使用,将源代码从 Oracle 转换为 PostgreSQL。

转换会生成支持 PostgreSQL 的已迁移的.sql 文件。

手动将未转换的 Oracle JSON 函数代码转换为 PostgreSQL JSON 函数代码。

在目标 Aurora PostgreSQL 兼容的数据库实例上运行.sql 文件。

工具

AWS 服务

Amazon Aurora A batabase PostgreSQL。

适用的 Amazon Relational Datab ase PostgreSQL 或扩展关系数据库。

AWS Schema Conversion Tool (AWS SCT) 通过自动将源数据库架构和大部分自定义代码转换为与目标数据库兼容的格式来支持异构数据库迁移。

其他服务

Oracle SQL Developer 是一个集成的开发环境,可简化传统部署和基于云的部署中 Oracle 数据库的开发和管理。

pgAdmin 或 dBeaver。 pgAdmin gre SQL 和 PostgreSQL 的工具。它提供了一个图形界面,可帮助您创建、维护和使用数据库对象。dBeaver 是一个通用的数据库工具。

最佳实践

使用该JSON_TABLE函数时,Oracle 查询将类型CAST作为默认值。最佳做法是在 PostgreSQL CAST 中也使用,使用双大于字符 ()。>>

有关更多信息,请参阅 “其他信息” 部分中的 postgres_sql_read_ JSON。

史诗任务描述所需技能

将 JSON 数据存储在 Oracle 数据库中。

在 Oracle 数据库中创建一个表,然后将 JSON 数据存储在CLOB列中。 使用 “其他信息” 部分中的 Oracle_Table_Creation_Insert_Scri pt。

迁迁迁迁迁

将 JSON 数据存储在 PostgreSQL 数据库中。

在 PostgreSQL 数据库中创建一个表,然后将 JSON 数据存储在该列中。TEXT使用 “其他信息” 部分中的 Postgres_Table_Creation_Insert_Scri pt。

迁迁迁迁迁 任务描述所需技能

转换 Oracle 数据库上的 JSON 数据。

编写 Oracle SQL 查询,将 JSON 数据读取为 ROW 格式。有关更多详细信息和示例语法,请参阅 “其他信息” 部分中的 oracle_sql_read_ JSON。

迁迁迁迁迁

转换 PostgreSQL 数据库上的 JSON 数据。

编写 PostgreSQL 查询,将 JSON 数据读取为 ROW 格式。有关更多详细信息和示例语法,请参阅 “其他信息” 部分中的 postgres_sql_read_JS ON。

迁迁迁迁迁 任务描述所需技能

对 Oracle SQL 查询执行聚合和验证。

要手动转换 JSON 数据,请对 Oracle SQL 查询执行联接、聚合和验证,并以 JSON 格式报告输出。使用 “其他信息” 部分中 oracle_sql_json_Aggregation_Join 下的代码。

JOIN — JSON 格式的数据作为输入参数传递给查询。在此静态数据和 Oracle 数据库表中的 JSON 数据之间建立了内部连接aws_test_table。

带验证的聚合-JSON 数据具有KEYVALUE参数值,如accountNumberparentAccountNumberpositionId、businessUnitId和,用于SUM和COUNT聚合。

JSON 格式-在连接和聚合之后,使用JSON_OBJECT和以 JSON 格式报告数据JSON_ARRAYAGG。

迁迁迁迁迁

对 Postgres SQL 查询进行聚合和验证。

要手动转换 JSON 数据,请对 PostgreSQL 查询执行联接、聚合和验证,并以 JSON 格式报告输出。使用 “其他信息” 部分中 po stgres_sql_json_Aggregation_J oin 下的代码。

JOIN — JSON 格式的数据 (tab1) 作为输入参数传递给WITH子句查询。在此静态数据和tab表中的 JSON 数据之间建立 JOIN。还使用子句生成 JOIN,该WITH子句在aws_test_pg_table表中包含 JSON 数据。

聚合-JSON 数据具有KEY和VALUE参数accountNumber,parentAccountNumber其值如positionId、、和,用于SUM和COUNT聚合。businessUnitId

JSON 格式-在连接和聚合之后,使用JSON_BUILD_OBJECT和以 JSON 格式报告数据JSON_AGG。

迁迁迁迁迁 任务描述所需技能

将 Oracle 过程中的 JSON 查询转换为行。

在 Oracle 过程示例中,使用之前的 Oracle 查询和 “其他信息” 部分中 oracle_procedure_with_json_ Query 下的代码。

迁迁迁迁迁

将具有 JSON 查询的 PostgreSQL 函数转换为基于行的数据。

在 PostgreSQL 函数示例中,使用之前的 PostgreSQL 查询以及其他信息部分中 postgres_Function_with_json _ Query 下的代码。

迁迁迁迁迁相关资源

甲骨文 JSON

PostgreSQL JSO

甲骨 JSON 函数示例

PostgreSQL JSON 函数

AWS Schema Conversion Tool

其他信息

要将 JSON 代码从 Oracle 数据库转换为 PostgreSQL 数据库,请按顺序使用以下脚本。

1。oracle_Table_creat_Insert_Script

create table aws_test_table(id number,created_on date default sysdate,modified_on date,json_doc clob); REM INSERTING into EXPORT_TABLE SET DEFINE OFF; Insert into aws_test_table (ID,CREATED_ON,MODIFIED_ON,json_doc) values (1,to_date('02-AUG-2022 12:30:14','DD-MON-YYYY HH24:MI:SS'),to_date('02-AUG-2022 12:30:14','DD-MON-YYYY HH24:MI:SS'),TO_CLOB(q'[{   "metadata" : {     "upperLastNameFirstName" : "ABC XYZ",     "upperEmailAddress" : "[email protected]",     "profileType" : "P"   },   "data" : {     "onlineContactId" : "032323323",     "displayName" : "Abc, Xyz",     "firstName" : "Xyz",     "lastName" : "Abc",     "emailAddress" : "[email protected]",     "productRegistrationStatus" : "Not registered",     "positionId" : "0100",     "arrayPattern" : " -'",     "a]') || TO_CLOB(q'[ccount" : {       "companyId" : "SMGE",       "businessUnitId" : 7,       "accountNumber" : 42000,       "parentAccountNumber" : 32000,       "firstName" : "john",       "lastName" : "doe",       "street1" : "retOdertcaShr ",       "city" : "new york",       "postalcode" : "XY ABC",       "country" : "United States"     },     "products" : [       {         "appUserGuid" : "i0acc4450000001823fbad478e2eab8a0",         "id" : "0000000046", ]') || TO_CLOB(q'[        "name" : "ProView",         "domain" : "EREADER",         "registrationStatus" : false,         "status" : "11"       }     ]   } }]')); Insert into aws_test_table (ID,CREATED_ON,MODIFIED_ON,json_doc) values (2,to_date('02-AUG-2022 12:30:14','DD-MON-YYYY HH24:MI:SS'),to_date('02-AUG-2022 12:30:14','DD-MON-YYYY HH24:MI:SS'),TO_CLOB(q'[{   "metadata" : {     "upperLastNameFirstName" : "PQR XYZ",     "upperEmailAddress" : "[email protected]",     "profileType" : "P"   },   "data" : {     "onlineContactId" : "54534343",     "displayName" : "Xyz, pqr",     "firstName" : "pqr",     "lastName" : "Xyz",     "emailAddress" : "[email protected]",     "productRegistrationStatus" : "Not registered",     "positionId" : "0090",     "arrayPattern" : " -'",     "account" : {       "companyId" : "CARS",       "busin]') || TO_CLOB(q'[essUnitId" : 6,       "accountNumber" : 42001,       "parentAccountNumber" : 32001,       "firstName" : "terry",       "lastName" : "whitlock",       "street1" : "UO  123",       "city" : "TOTORON",       "region" : "NO",       "postalcode" : "LKM 111",       "country" : "Canada"     },     "products" : [       {         "appUserGuid" : "ia744d7790000016899f8cf3f417d6df6",         "id" : "0000000014",         "name" : "ProView eLooseleaf",       ]') || TO_CLOB(q'[  "domain" : "EREADER",         "registrationStatus" : false,         "status" : "11"       }     ]   } }]')); commit;

2。Postgres_Table_creat_insert_Scri

create table aws_test_pg_table(id int,created_on date ,modified_on date,json_doc text); insert into aws_test_pg_table(id,created_on,modified_on,json_doc) values(1,now(),now(),'{   "metadata" : {     "upperLastNameFirstName" : "ABC XYZ",     "upperEmailAddress" : "[email protected]",     "profileType" : "P"   },   "data" : {     "onlineContactId" : "032323323",     "displayName" : "Abc, Xyz",     "firstName" : "Xyz",     "lastName" : "Abc",     "emailAddress" : "[email protected]",     "productRegistrationStatus" : "Not registered",     "positionId" : "0100",     "arrayPattern" : " -",     "account" : {       "companyId" : "SMGE",       "businessUnitId" : 7,       "accountNumber" : 42000,       "parentAccountNumber" : 32000,       "firstName" : "john",       "lastName" : "doe",       "street1" : "retOdertcaShr ",       "city" : "new york",       "postalcode" : "XY ABC",       "country" : "United States"     },     "products" : [       {         "appUserGuid" : "i0acc4450000001823fbad478e2eab8a0",         "id" : "0000000046",         "name" : "ProView",         "domain" : "EREADER",         "registrationStatus" : false,         "status" : "11"       }     ]   } }'); insert into aws_test_pg_table(id,created_on,modified_on,json_doc) values(2,now(),now(),'{   "metadata" : {     "upperLastNameFirstName" : "PQR XYZ",     "upperEmailAddress" : "[email protected]",     "profileType" : "P"   },   "data" : {     "onlineContactId" : "54534343",     "displayName" : "Xyz, pqr",     "firstName" : "pqr",     "lastName" : "Xyz",     "emailAddress" : "a*b**@h**.k**",     "productRegistrationStatus" : "Not registered",     "positionId" : "0090",     "arrayPattern" : " -",     "account" : {       "companyId" : "CARS",       "businessUnitId" : 6,       "accountNumber" : 42001,       "parentAccountNumber" : 32001,       "firstName" : "terry",       "lastName" : "whitlock",       "street1" : "UO  123",       "city" : "TOTORON",       "region" : "NO",       "postalcode" : "LKM 111",       "country" : "Canada"     },     "products" : [       {         "appUserGuid" : "ia744d7790000016899f8cf3f417d6df6",         "id" : "0000000014",         "name" : "ProView eLooseleaf",         "domain" : "EREADER",         "registrationStatus" : false,         "status" : "11"       }     ]   } }');

3。oracle_sql_read_JSON

以下代码块显示了如何将 Oracle JSON 数据转换为行格式。

查询和语法示例

SELECT  JSON_OBJECT( 'accountCounts' VALUE JSON_ARRAYAGG(              JSON_OBJECT(                  'businessUnitId' VALUE business_unit_id,                          'parentAccountNumber' VALUE parent_account_number,                          'accountNumber' VALUE account_number,                          'totalOnlineContactsCount' VALUE online_contacts_count,                          'countByPosition' VALUE                      JSON_OBJECT(                          'taxProfessionalCount' VALUE tax_count,                          'attorneyCount' VALUE attorney_count,                         'nonAttorneyCount' VALUE non_attorney_count,                          'clerkCount' VALUE clerk_count                                ) ) ) ) FROM      (SELECT   tab_data.business_unit_id,              tab_data.parent_account_number,              tab_data.account_number,              SUM(1) online_contacts_count,              SUM(CASE WHEN tab_data.position_id = '0095' THEN  1 ELSE 0 END) tax_count,              SUM(CASE    WHEN tab_data.position_id = '0100' THEN 1 ELSE 0 END) attorney_count,           SUM(CASE    WHEN tab_data.position_id = '0090' THEN 1 ELSE 0 END) non_attorney_count,                                                   SUM(CASE    WHEN tab_data.position_id = '0050' THEN 1 ELSE 0 END) clerk_count         FROM aws_test_table scco,JSON_TABLE ( json_doc, '$' ERROR ON ERROR         COLUMNS (            parent_account_number NUMBER PATH '$.data.account.parentAccountNumber',             account_number NUMBER PATH '$.data.account.accountNumber',             business_unit_id NUMBER PATH '$.data.account.businessUnitId',             position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'    )             ) AS tab_data              INNER JOIN JSON_TABLE ( '{          "accounts": [{            "accountNumber": 42000,            "parentAccountNumber": 32000,            "businessUnitId": 7          }, {            "accountNumber": 42001,            "parentAccountNumber": 32001,            "businessUnitId": 6          }]  }', '$.accounts[*]' ERROR ON ERROR       COLUMNS (       parent_account_number PATH '$.parentAccountNumber',       account_number PATH '$.accountNumber',       business_unit_id PATH '$.businessUnitId')       ) static_data        ON ( static_data.parent_account_number = tab_data.parent_account_number             AND static_data.account_number = tab_data.account_number              AND static_data.business_unit_id = tab_data.business_unit_id )         GROUP BY              tab_data.business_unit_id,              tab_data.parent_account_number,              tab_data.account_number );

JSON 文档将数据存储为集合。每个集合可以有KEY和VALUE配对。每个VALUE都可以嵌套KEY和VALUE成对。下表提供了有关VALUE从JSSon 文档中读与传输。

密钥

用于获取值的层次结构或 PATH

价值

profileType

metadata -> profileType

“P”

positionId

data -> positionId

“0100"

accountNumber

data-> 账户-> accountNumber

42000

在前面的表格中,KEYprofileType是VALUE的metadataKEY。KEYpositionId是VALUE其中之一 dataKEY. KEYaccountNumber是VALUE其中的 accountKEY,accountKEY也是VALUE的 data 0。KEY

JSON 文档示例

{   "metadata" : {     "upperLastNameFirstName" : "ABC XYZ",     "upperEmailAddress" : "[email protected]", "profileType" : "P"   },   "data" : {     "onlineContactId" : "032323323",     "displayName" : "Abc, Xyz",     "firstName" : "Xyz",     "lastName" : "Abc",     "emailAddress" : "[email protected]",     "productRegistrationStatus" : "Not registered", "positionId" : "0100",     "arrayPattern" : " -",     "account" : {       "companyId" : "SMGE",       "businessUnitId" : 7, "accountNumber" : 42000,       "parentAccountNumber" : 32000,       "firstName" : "john",       "lastName" : "doe",       "street1" : "retOdertcaShr ",       "city" : "new york",       "postalcode" : "XY ABC",       "country" : "United States"     },     "products" : [       {         "appUserGuid" : "i0acc4450000001823fbad478e2eab8a0",         "id" : "0000000046",         "name" : "ProView",         "domain" : "EREADER",         "registrationStatus" : false,         "status" : "11"       }     ]   } }

用于从 JSON 文档中获取所选字段的 SQL 查询

select parent_account_number,account_number,business_unit_id,position_id from aws_test_table aws,JSON_TABLE ( json_doc, '$' ERROR ON ERROR COLUMNS ( parent_account_number NUMBER PATH '$.data.account.parentAccountNumber', account_number NUMBER PATH '$.data.account.accountNumber', business_unit_id NUMBER PATH '$.data.account.businessUnitId', position_id VARCHAR2 ( 4 ) PATH '$.data.positionId' )) as sc

在前面的查询中,JSON_TABLE是 Oracle 中的一个内置函数,可将 JSON 数据转换为行格式。JSON 和 Table 函数需要使用 JSSON 格式的参数。

中的每个项目COLUMNS都有预定义的PATH,并且以行格式返回VALUEKEY适合给定值的项目。

上一次查询的结果

家长账户号码

账号_号码

业务单位_ID

位置_ID

32000

42000

7

0100

32001

42001

6

0090

4。postgres_sql_read_json

查询和语法示例

select * from (  select (json_doc::json->'data'->'account'->>'parentAccountNumber')::INTEGER as parentAccountNumber,  (json_doc::json->'data'->'account'->>'accountNumber')::INTEGER as accountNumber,  (json_doc::json->'data'->'account'->>'businessUnitId')::INTEGER as businessUnitId,  (json_doc::json->'data'->>'positionId')::VARCHAR as positionId  from aws_test_pg_table) d ;

在 Oracle 中,PATH用于标识特定的KEY和VALUE。但是,PostgreSQL 使用HIERARCHY模型来读取 JSON KEY 和VALUE从 JSON 读取。以下示例中使用了下Oracle_SQL_Read_JSON文提到的相同 JSON 数据。

不允许使用 CAST 类型的 SQL 查询

(如果您强制输入CAST,则查询会因语法错误而失败。)

select * from ( select (json_doc::json->'data'->'account'->'parentAccountNumber') as parentAccountNumber, (json_doc::json->'data'->'account'->'accountNumber')as accountNumber, (json_doc::json->'data'->'account'->'businessUnitId') as businessUnitId, (json_doc::json->'data'->'positionId')as positionId from aws_test_pg_table) d ;

使用单个大于运算符 (>) 将返回为此VALUE定义的运算符。KEY例如positionId,KEY: 和VALUE:"0100"。

当您使用单个大于运算符 () > 时,不允许输入CAST。

允许使用 CAST 类型的 SQL 查询

select * from (  select (json_doc::json->'data'->'account'->>'parentAccountNumber')::INTEGER as parentAccountNumber,  (json_doc::json->'data'->'account'->>'accountNumber')::INTEGER as accountNumber,  (json_doc::json->'data'->'account'->>'businessUnitId')::INTEGER as businessUnitId,  (json_doc::json->'data'->>'positionId')::varchar as positionId  from aws_test_pg_table) d ;

要使用类型CAST,必须使用双大于运算符。如果您使用单个大于运算符,则查询将返回VALUE已定义的运算符(例如KEY:positionId和VALUE:"0100")。使用双大于运算符 (>>) 将返回为此定义的实际值KEY(例如,KEY: 和VALUE:positionId0100,不带双引号)。

在前面的例子中,parentAccountNumber是键入CAST到INT,accountNumber是键入CAST到INT,businessUnitId是键入CAST到INT,0 是键入 1 到 2。positionIdCASTVARCHAR

下表显示的查询结果解释了单个大于运算符 (>) 和双大于运算符 () 的作用。>>

在第一个表中,查询使用单个大于运算符 () >。每列都是 JSON 类型,无法转换为另一种数据类型。

parentAccountNumber

账号

businessUnitId

位置 ID

2003565430

2003564830

7

“0100”

2005284042

2005284042

6

“0090”

2000272719

2000272719

1

“0100”

在第二个表中,查询使用双大于运算符 () >>。每列都支持CAST基于列值的类型。例如,INTEGER在这种情况下。

parentAccountNumber

账号

businessUnitId

位置 ID

2003565430

2003564830

7

0100

2005284042

2005284042

6

0090

2000272719

2000272719

1

0100

5。oracle_sql_json_聚合_加入

查询示例

SELECT    JSON_OBJECT(         'accountCounts' VALUE JSON_ARRAYAGG(              JSON_OBJECT(                  'businessUnitId' VALUE business_unit_id,                          'parentAccountNumber' VALUE parent_account_number,                          'accountNumber' VALUE account_number,                          'totalOnlineContactsCount' VALUE online_contacts_count,                          'countByPosition' VALUE                      JSON_OBJECT(                          'taxProfessionalCount' VALUE tax_count,                          'attorneyCount' VALUE attorney_count,                          'nonAttorneyCount' VALUE non_attorney_count,                          'clerkCount' VALUE clerk_count                                ) ) ) )  FROM      (SELECT              tab_data.business_unit_id,              tab_data.parent_account_number,              tab_data.account_number,              SUM(1) online_contacts_count,              SUM(CASE WHEN tab_data.position_id = '0095' THEN  1 ELSE 0 END) tax_count,              SUM(CASE    WHEN tab_data.position_id = '0100' THEN 1 ELSE 0 END) attorney_count,                                                                    SUM(CASE    WHEN tab_data.position_id = '0090' THEN 1 ELSE 0 END) non_attorney_count,                                                                SUM(CASE    WHEN tab_data.position_id = '0050' THEN 1 ELSE 0 END) clerk_count                                                                    FROM aws_test_table scco,JSON_TABLE ( json_doc, '$' ERROR ON ERROR         COLUMNS (            parent_account_number NUMBER PATH '$.data.account.parentAccountNumber',             account_number NUMBER PATH '$.data.account.accountNumber',             business_unit_id NUMBER PATH '$.data.account.businessUnitId',             position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'    )             ) AS tab_data              INNER JOIN JSON_TABLE ( '{          "accounts": [{            "accountNumber": 42000,            "parentAccountNumber": 32000,            "businessUnitId": 7          }, {            "accountNumber": 42001,            "parentAccountNumber": 32001,            "businessUnitId": 6          }]  }', '$.accounts[*]' ERROR ON ERROR           COLUMNS (       parent_account_number PATH '$.parentAccountNumber',       account_number PATH '$.accountNumber',       business_unit_id PATH '$.businessUnitId')       ) static_data        ON ( static_data.parent_account_number = tab_data.parent_account_number             AND static_data.account_number = tab_data.account_number                            AND static_data.business_unit_id = tab_data.business_unit_id )         GROUP BY              tab_data.business_unit_id,              tab_data.parent_account_number,              tab_data.account_number  );

要将行级数据转换为 JSON 格式,Oracle 内置了诸如JSON_OBJECT、JSON_ARRAYJSON_OBJECTAGG、和之类的函数。JSON_ARRAYAGG

JSON_OBJECT接受两个参数:KEY和VALUE。该KEY参数本质上应该是硬编码的或静态的。该VALUE参数源自表输出。

JSON_ARRAYAGG接受JSON_OBJECT作为参数。这有助于将JSON_OBJECT元素集合分组为列表。例如,如果您的JSON_OBJECT元素有多条记录(数据集中有多条记录KEY和VALUE成对JSON_ARRAYAGG记录),则会追加数据集并创建列表。根据数据结构语言,LIST是一组元素。在这种情况下,LIST是一组JSON_OBJECT元素。

以下示例显示了一个JSON_OBJECT元素。

{   "taxProfessionalCount": 0,   "attorneyCount": 0,   "nonAttorneyCount": 1,   "clerkCount": 0 }

下一个示例显示了两个JSON_OBJECT元素,用方括号 ([ ]) LIST 表示。

[     {         "taxProfessionalCount": 0,         "attorneyCount": 0,         "nonAttorneyCount": 1,         "clerkCount": 0       } ,     {         "taxProfessionalCount": 2,         "attorneyCount": 1,         "nonAttorneyCount": 3,         "clerkCount":4       } ]

SQL 查询示例

SELECT      JSON_OBJECT(          'accountCounts' VALUE JSON_ARRAYAGG(              JSON_OBJECT(                  'businessUnitId' VALUE business_unit_id,                          'parentAccountNumber' VALUE parent_account_number,                          'accountNumber' VALUE account_number,                          'totalOnlineContactsCount' VALUE online_contacts_count,                          'countByPosition' VALUE                      JSON_OBJECT(                          'taxProfessionalCount' VALUE tax_count,                          'attorneyCount' VALUE attorney_count,                          'nonAttorneyCount' VALUE non_attorney_count,                          'clerkCount' VALUE clerk_count                                )                          )                                             )                )  FROM      (SELECT              tab_data.business_unit_id,              tab_data.parent_account_number,              tab_data.account_number,              SUM(1) online_contacts_count,              SUM(CASE WHEN tab_data.position_id = '0095' THEN  1 ELSE   0 END              )      tax_count,              SUM(CASE    WHEN tab_data.position_id = '0100' THEN        1    ELSE        0 END              )      attorney_count,                                                                    SUM(CASE    WHEN tab_data.position_id = '0090' THEN        1    ELSE        0 END              )      non_attorney_count,                                                                SUM(CASE    WHEN tab_data.position_id = '0050' THEN        1    ELSE        0 END              )      clerk_count                                                                    FROM              aws_test_table scco,  JSON_TABLE ( json_doc, '$' ERROR ON ERROR                 COLUMNS (              parent_account_number NUMBER PATH '$.data.account.parentAccountNumber',             account_number NUMBER PATH '$.data.account.accountNumber',             business_unit_id NUMBER PATH '$.data.account.businessUnitId',             position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'    )             ) AS tab_data              INNER JOIN JSON_TABLE ( '{          "accounts": [{            "accountNumber": 42000,            "parentAccountNumber": 32000,            "businessUnitId": 7          }, {            "accountNumber": 42001,            "parentAccountNumber": 32001,            "businessUnitId": 6          }]  }', '$.accounts[*]' ERROR ON ERROR           COLUMNS (       parent_account_number PATH '$.parentAccountNumber',       account_number PATH '$.accountNumber',       business_unit_id PATH '$.businessUnitId')       ) static_data ON ( static_data.parent_account_number = tab_data.parent_account_number                           AND static_data.account_number = tab_data.account_number                                          AND static_data.business_unit_id = tab_data.business_unit_id )          GROUP BY              tab_data.business_unit_id,              tab_data.parent_account_number,              tab_data.account_number      );

上一个 SQL 查询的输出示例

{   "accountCounts": [     {       "businessUnitId": 6,       "parentAccountNumber": 32001,       "accountNumber": 42001,       "totalOnlineContactsCount": 1,       "countByPosition": {         "taxProfessionalCount": 0,         "attorneyCount": 0,         "nonAttorneyCount": 1,         "clerkCount": 0       }     },     {       "businessUnitId": 7,       "parentAccountNumber": 32000,       "accountNumber": 42000,       "totalOnlineContactsCount": 1,       "countByPosition": {         "taxProfessionalCount": 0,         "attorneyCount": 1,         "nonAttorneyCount": 0,         "clerkCount": 0       }     }   ] }

6。 postgres_sql_json_聚合_加入

PostgreSQL 内置函数JSON_BUILD_OBJECT可将行级数据JSON_AGG转换为 JSON 格式。 PostgreSQL JSON_BUILD_OBJECT 和等同JSON_AGG于 Oracle JSON_OBJECT 和。JSON_ARRAYAGG

查询示例

select     JSON_BUILD_OBJECT ('accountCounts',      JSON_AGG(          JSON_BUILD_OBJECT ('businessUnitId',businessUnitId          ,'parentAccountNumber',parentAccountNumber          ,'accountNumber',accountNumber          ,'totalOnlineContactsCount',online_contacts_count,          'countByPosition',             JSON_BUILD_OBJECT (             'taxProfessionalCount',tax_professional_count              ,'attorneyCount',attorney_count              ,'nonAttorneyCount',non_attorney_count              ,'clerkCount',clerk_count              )          )       )  )  from (  with tab as (select * from (  select (json_doc::json->'data'->'account'->>'parentAccountNumber')::INTEGER as parentAccountNumber,  (json_doc::json->'data'->'account'->>'accountNumber')::INTEGER as accountNumber,  (json_doc::json->'data'->'account'->>'businessUnitId')::INTEGER as businessUnitId,  (json_doc::json->'data'->>'positionId')::varchar as positionId  from aws_test_pg_table) a ) ,  tab1 as ( select    (json_array_elements(b.jc -> 'accounts') ->> 'accountNumber')::integer accountNumber,  (json_array_elements(b.jc -> 'accounts') ->> 'businessUnitId')::integer businessUnitId,  (json_array_elements(b.jc -> 'accounts') ->> 'parentAccountNumber')::integer parentAccountNumber  from (  select '{          "accounts": [{            "accountNumber": 42001,            "parentAccountNumber": 32001,            "businessUnitId": 6          }, {            "accountNumber": 42000,            "parentAccountNumber": 32000,            "businessUnitId": 7          }]  }'::json as jc) b)  select   tab.businessUnitId::text,  tab.parentAccountNumber::text,  tab.accountNumber::text,  SUM(1) online_contacts_count,  SUM(CASE WHEN tab.positionId::text = '0095' THEN 1 ELSE 0  END)      tax_professional_count,   SUM(CASE WHEN tab.positionId::text = '0100' THEN 1 ELSE 0  END)      attorney_count,  SUM(CASE  WHEN tab.positionId::text = '0090' THEN      1  ELSE      0 END)      non_attorney_count,  SUM(CASE  WHEN tab.positionId::text = '0050' THEN      1  ELSE      0 END)      clerk_count from tab1,tab   where tab.parentAccountNumber::INTEGER=tab1.parentAccountNumber::INTEGER   and tab.accountNumber::INTEGER=tab1.accountNumber::INTEGER  and tab.businessUnitId::INTEGER=tab1.businessUnitId::INTEGER  GROUP BY      tab.businessUnitId::text,              tab.parentAccountNumber::text,              tab.accountNumber::text) a;

前面查询的输出示例

来自 Oracle 和 PostgreSQL 的输出完全相同。

{   "accountCounts": [     {       "businessUnitId": 6,       "parentAccountNumber": 32001,       "accountNumber": 42001,       "totalOnlineContactsCount": 1,       "countByPosition": {         "taxProfessionalCount": 0,         "attorneyCount": 0,         "nonAttorneyCount": 1,         "clerkCount": 0       }     },     {       "businessUnitId": 7,       "parentAccountNumber": 32000,       "accountNumber": 42000,       "totalOnlineContactsCount": 1,       "countByPosition": {         "taxProfessionalCount": 0,         "attorneyCount": 1,         "nonAttorneyCount": 0,         "clerkCount": 0       }     }   ] }

7.oracle_procedure_with_json_Query

此代码将 Oracle 过程转换为具有 JSON SQL 查询的 PostgreSQL 函数。它显示了查询如何将 JSON 转换为行,反之亦然。

CREATE OR REPLACE PROCEDURE p_json_test(p_in_accounts_json IN varchar2,   p_out_accunts_json  OUT varchar2) IS BEGIN /* p_in_accounts_json paramter should have following format:        {          "accounts": [{            "accountNumber": 42000,            "parentAccountNumber": 32000,            "businessUnitId": 7          }, {            "accountNumber": 42001,            "parentAccountNumber": 32001,            "businessUnitId": 6          }]        } */ SELECT      JSON_OBJECT(          'accountCounts' VALUE JSON_ARRAYAGG(              JSON_OBJECT(                  'businessUnitId' VALUE business_unit_id,                          'parentAccountNumber' VALUE parent_account_number,                          'accountNumber' VALUE account_number,                          'totalOnlineContactsCount' VALUE online_contacts_count,                          'countByPosition' VALUE                      JSON_OBJECT(                          'taxProfessionalCount' VALUE tax_count,                          'attorneyCount' VALUE attorney_count,                          'nonAttorneyCount' VALUE non_attorney_count,                          'clerkCount' VALUE clerk_count                                ) ) ) )  into p_out_accunts_json FROM      (SELECT              tab_data.business_unit_id,              tab_data.parent_account_number,              tab_data.account_number,              SUM(1) online_contacts_count,              SUM(CASE WHEN tab_data.position_id = '0095' THEN  1 ELSE 0 END) tax_count,              SUM(CASE    WHEN tab_data.position_id = '0100' THEN 1 ELSE 0 END) attorney_count,                                                                    SUM(CASE    WHEN tab_data.position_id = '0090' THEN 1 ELSE 0 END) non_attorney_count,                                                                SUM(CASE    WHEN tab_data.position_id = '0050' THEN 1 ELSE 0 END) clerk_count                                                                    FROM aws_test_table scco,JSON_TABLE ( json_doc, '$' ERROR ON ERROR                 COLUMNS (              parent_account_number NUMBER PATH '$.data.account.parentAccountNumber',             account_number NUMBER PATH '$.data.account.accountNumber',             business_unit_id NUMBER PATH '$.data.account.businessUnitId',             position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'    )             ) AS tab_data              INNER JOIN JSON_TABLE ( p_in_accounts_json, '$.accounts[*]' ERROR ON ERROR           COLUMNS (       parent_account_number PATH '$.parentAccountNumber',       account_number PATH '$.accountNumber',       business_unit_id PATH '$.businessUnitId')       ) static_data        ON ( static_data.parent_account_number = tab_data.parent_account_number             AND static_data.account_number = tab_data.account_number                            AND static_data.business_unit_id = tab_data.business_unit_id )          GROUP BY              tab_data.business_unit_id,              tab_data.parent_account_number,              tab_data.account_number      );  EXCEPTION  WHEN OTHERS THEN   raise_application_error(-20001,'Error while running the JSON query'); END; /

运行程序

以下代码块解释了如何使用该过程的示例 JSON 输入来运行先前创建的 Oracle 过程。它还为您提供此过程的结果或输出。

set serveroutput on; declare v_out varchar2(30000); v_in varchar2(30000):= '{          "accounts": [{            "accountNumber": 42000,            "parentAccountNumber": 32000,            "businessUnitId": 7          }, {            "accountNumber": 42001,            "parentAccountNumber": 32001,            "businessUnitId": 6          }]        }'; begin   p_json_test(v_in,v_out);   dbms_output.put_line(v_out); end; /

过程输出

{   "accountCounts": [     {       "businessUnitId": 6,       "parentAccountNumber": 32001,       "accountNumber": 42001,       "totalOnlineContactsCount": 1,       "countByPosition": {         "taxProfessionalCount": 0,         "attorneyCount": 0,         "nonAttorneyCount": 1,         "clerkCount": 0       }     },     {       "businessUnitId": 7,       "parentAccountNumber": 32000,       "accountNumber": 42000,       "totalOnlineContactsCount": 1,       "countByPosition": {         "taxProfessionalCount": 0,         "attorneyCount": 1,         "nonAttorneyCount": 0,         "clerkCount": 0       }     }   ] }

8.postgres_function_with_json_Quer

示例函数

CREATE OR REPLACE  FUNCTION f_pg_json_test(p_in_accounts_json  text) RETURNS text   LANGUAGE plpgsql   AS   $$   DECLARE    v_out_accunts_json   text;   BEGIN   SELECT     JSON_BUILD_OBJECT ('accountCounts',     JSON_AGG(         JSON_BUILD_OBJECT ('businessUnitId',businessUnitId         ,'parentAccountNumber',parentAccountNumber         ,'accountNumber',accountNumber         ,'totalOnlineContactsCount',online_contacts_count,         'countByPosition',             JSON_BUILD_OBJECT (             'taxProfessionalCount',tax_professional_count             ,'attorneyCount',attorney_count             ,'nonAttorneyCount',non_attorney_count             ,'clerkCount',clerk_count             )))) INTO v_out_accunts_json FROM ( WITH tab AS (SELECT * FROM ( SELECT (json_doc::json->'data'->'account'->>'parentAccountNumber')::INTEGER AS parentAccountNumber, (json_doc::json->'data'->'account'->>'accountNumber')::INTEGER AS accountNumber, (json_doc::json->'data'->'account'->>'businessUnitId')::INTEGER AS businessUnitId, (json_doc::json->'data'->>'positionId')::varchar AS positionId FROM aws_test_pg_table) a ) , tab1 AS ( SELECT   (json_array_elements(b.jc -> 'accounts') ->> 'accountNumber')::integer accountNumber, (json_array_elements(b.jc -> 'accounts') ->> 'businessUnitId')::integer businessUnitId, (json_array_elements(b.jc -> 'accounts') ->> 'parentAccountNumber')::integer parentAccountNumber FROM ( SELECT p_in_accounts_json::json AS jc) b) SELECT   tab.businessUnitId::text, tab.parentAccountNumber::text, tab.accountNumber::text, SUM(1) online_contacts_count, SUM(CASE WHEN tab.positionId::text = '0095' THEN 1 ELSE 0  END)      tax_professional_count,   SUM(CASE WHEN tab.positionId::text = '0100' THEN 1 ELSE 0  END)      attorney_count, SUM(CASE  WHEN tab.positionId::text = '0090' THEN      1  ELSE      0 END)      non_attorney_count, SUM(CASE  WHEN tab.positionId::text = '0050' THEN      1  ELSE      0 END)      clerk_count FROM tab1,tab   WHERE tab.parentAccountNumber::INTEGER=tab1.parentAccountNumber::INTEGER   AND tab.accountNumber::INTEGER=tab1.accountNumber::INTEGER AND tab.businessUnitId::INTEGER=tab1.businessUnitId::INTEGER GROUP BY      tab.businessUnitId::text,             tab.parentAccountNumber::text,             tab.accountNumber::text) a; RETURN v_out_accunts_json;           END;   $$;

运行该函数

select    f_pg_json_test('{         "accounts": [{            "accountNumber": 42001,            "parentAccountNumber": 32001,            "businessUnitId": 6          }, {            "accountNumber": 42000,            "parentAccountNumber": 32000,            "businessUnitId": 7          }]        }')   ;

函数输出

以下输出类似于Oracle 的过程输出的形式与传输。不同之处在于此输出采用文本格式。

{   "accountCounts": [     {       "businessUnitId": "6",       "parentAccountNumber": "32001",       "accountNumber": "42001",       "totalOnlineContactsCount": 1,       "countByPosition": {         "taxProfessionalCount": 0,         "attorneyCount": 0,         "nonAttorneyCount": 1,         "clerkCount": 0       }     },     {       "businessUnitId": "7",       "parentAccountNumber": "32000",       "accountNumber": "42000",       "totalOnlineContactsCount": 1,       "countByPosition": {         "taxProfessionalCount": 0,         "attorneyCount": 1,         "nonAttorneyCount": 0,         "clerkCount": 0       }     }   ] }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3