胖头鱼的技术专栏-446 26ai新特性实战:JSON关系二元性内联写增强(20260715)

📅 2026/7/16 3:46:42
胖头鱼的技术专栏-446 26ai新特性实战:JSON关系二元性内联写增强(20260715)
数据库管理446期 2026-07-15胖头鱼的技术专栏-446 26ai新特性实战20260715特性介绍语法介绍使用场景实战演示创建测试表测试1无条件生成测试2输入中存在生成字段时报错无条件测试3条件生成IF MISSING测试4在路径表达式中使用case()进行条件生成测试5从其他field派生值总结胖头鱼的技术专栏-446 26ai新特性实战20260715作者胖头鱼的鱼缸尹海文 Oracle ACE Pro: Database PostgreSQL ACE 10年数据库行业经验 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVPITPUB认证专家 圈内拥有“总监”称号非著名社恐社交恐怖分子 全网同名胖头鱼的鱼缸 ITPUByhw1809 除授权转载并标明出处外均为“非法”抄袭特性介绍Oracle AI Database 23.26.2 引入了JSON Relational Duality ViewJSON关系二元性视图内联写增强Inline Write Augmentation功能。当通过 Duality View 插入或更新文档时该功能可以自动创建输入文档中不存在的额外字段并为其赋值。这意味着开发者可以为缺失的字段自动提供默认值对传入的值进行自动转换根据文档中其他字段的值动态计算生成字段的值两种生成模式无条件生成Unconditional字段始终被生成如果输入文档中已包含该字段则报错适用于审计字段、计算字段、不允许用户修改的系统字段错误码ORA-42727 / JZN-00695字段已存在时条件生成IF MISSING仅当字段在输入文档中缺失时才生成否则使用输入文档中的值适用于默认值、可选的派生字段生成表达式支持常量值PATH ‘1000’派生值PATH ‘$.otherField[0]’从其他字段提取case() 条件PATH ‘case(.salary60000, 1000, 500)’decode() 匹配PATH ‘decode(.tips, 0, 0, 100)’字符串操作PATH ‘$.creditCard.substr(15)’语法介绍SQL DDLfield:columnGENERATEDONWRITEUSINGPATHexpressionfield:columnGENERATEDONWRITEIFMISSINGUSINGPATHexpression还可与读增强READ augmentation组合使用以及将字段设为 HIDDEN不出现在返回的文档中但值持久化到列。GraphQLfield:columngenerated(path:expression,on:write)-- 无条件field:columngenerated(path:expression,on:missing)-- 条件field:columngenerated(path:expression,on:write)hidden使用场景下面是一些可以使用该特性的实际生产业务场景薪酬管理根据薪资水平自动计算奖金case/decode 条件逻辑。例如salary 60000 的员工 bonus 1000否则 500数据脱敏从信用卡号中提取最后四位存储前端展示时重新拼接掩码。creditCard 字段写入时自动提取 ccLast4HIDDEN 字段默认值填充新员工未指定部门时自动分配默认部门计算字段从 JSON 数组中提取首元素作为优先级标记。例如shiftPref 数组的第一个元素作为 shiftPrio审计追踪自动为每条记录填充创建时间、版本号等系统字段API 后端REST API 接收部分字段的文档数据库自动补全其他字段实战演示同之前一样使用用户NFTEST已授权DB_DEVELOPER_ROLE角色测试操作均在NFTEST用户下执行。创建测试表CREATETABLEdva_employees(emp_id NUMBERPRIMARYKEY,emp_name VARCHAR2(100),salary NUMBER,bonus NUMBER,dept_code VARCHAR2(10),shift_pref JSON,shift_prio VARCHAR2(50));测试1无条件生成插入数据是“bonus”字段不指定值自动生成值500。CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW dva_emp_const AS SELECT JSON {_id : emp_id, name : emp_name, salary : salary, bonus : bonus GENERATED ON WRITE USING PATH 500} FROM dva_employees WITH (INSERT, UPDATE, DELETE); INSERT INTO dva_emp_const VALUES ({_id:1, name:Alice, salary:50000}); SELECT data FROM dva_emp_const WHERE JSON_VALUE(data, $._id RETURNING NUMBER) 1; SELECT * FROM dva_employees;bouns列均赋值500。测试2输入中存在生成字段时报错无条件INSERTINTOdva_emp_constVALUES({_id:2, name:Bob, salary:60000, bonus:1000});因为无条件的限制无法在bonus字段有值时成功插入数据。测试3条件生成IF MISSINGCREATEORREPLACEJSON RELATIONAL DUALITYVIEWdva_emp_missingASSELECTJSON {_id: emp_id,name: emp_name,salary: salary,bonus: bonus GENERATEDONWRITEIFMISSINGUSINGPATH500}FROMdva_employeesWITH(INSERT,UPDATE,DELETE);INSERTINTOdva_emp_missingVALUES({_id:3, name:Carol, salary:70000});INSERTINTOdva_emp_missingVALUES({_id:4, name:Dave, salary:80000, bonus:2000});SELECTdataFROMdva_emp_missingWHEREJSON_VALUE(data,$._idRETURNINGNUMBER)IN(3,4)ORDERBYJSON_VALUE(data,$._idRETURNINGNUMBER);bonus字段指定与否都可以插入。测试4在路径表达式中使用case()进行条件生成当salary60000时bonus为1000否则为500。CREATEORREPLACEJSON RELATIONAL DUALITYVIEWdva_emp_caseASSELECTJSON {_id: emp_id,name: emp_name,salary: salary,bonus: bonus GENERATEDONWRITEUSINGPATHcase(.salary60000,1000,500)}FROMdva_employeesWITH(INSERT,UPDATE,DELETE);INSERTINTOdva_emp_caseVALUES({_id:10, name:Eve, salary:45000});INSERTINTOdva_emp_caseVALUES({_id:11, name:Frank, salary:75000});SELECTdataFROMdva_emp_caseWHEREJSON_VALUE(data,$._idRETURNINGNUMBER)IN(10,11)ORDERBYJSON_VALUE(data,$._idRETURNINGNUMBER);测试5从其他field派生值shiftPri是从shiftPref属组的第一个值派生CREATEORREPLACEJSON RELATIONAL DUALITYVIEWdva_emp_derivedASSELECTJSON {_id: emp_id,name: emp_name,salary: salary,shiftPref: shift_pref,shiftPrio: shift_prio GENERATEDONWRITEUSINGPATH$.shiftPref[0]}FROMdva_employeesWITH(INSERT,UPDATE,DELETE);INSERTINTOdva_emp_derivedVALUES({_id:20, name:Grace, salary:90000, shiftPref:[night,day,flex]});SELECTdataFROMdva_emp_derivedWHEREJSON_VALUE(data,$._idRETURNINGNUMBER)20;-- 验证关系表中数据SELECTemp_id,emp_name,shift_pref,shift_prioFROMdva_employeesWHEREemp_id20;总结本期对Oracle AI Database 26ai23.26.2版本新引入的JSON关系二元性内联写增强新特性进行了完整介绍与实战演示。老规矩知道写了些啥。