Oracle PL/SQL中如何将逗号分隔的键值对拆分存入表(键值分列存储)
如何将键值对存入Oracle的Key-Value两列表中
嗨,针对你的需求,我会一步步教你怎么把这些键值对拆分成Oracle表的key和data两列存储,每一行对应一个键值对:
第一步:创建目标表
首先你需要先建一张用来存储键值对的表,比如命名为REQUEST_KEY_VALUE。考虑到值的类型有字符串、数值,还有空值,我们把DATA_VALUE设为VARCHAR2类型(如果有超长内容可以换成CLOB),KEY_NAME用来存键名:
CREATE TABLE REQUEST_KEY_VALUE ( KEY_NAME VARCHAR2(100) NOT NULL, -- 存储键名,长度按需调整 DATA_VALUE VARCHAR2(4000) -- 存储对应的值,支持字符串、数值转存,空值也能存 );
第二步:插入键值对数据
这里提供两种常用的批量插入方法,选你顺手的就行:
方法1:使用INSERT ALL(推荐,写法简洁)
这种方式可以一次性插入所有键值对,每个键值对对应一个INTO子句:
INSERT ALL INTO REQUEST_KEY_VALUE (KEY_NAME, DATA_VALUE) VALUES ('TaskType', 'SRC_Copay') INTO REQUEST_KEY_VALUE (KEY_NAME, DATA_VALUE) VALUES ('[BILLING_ACCOUNT_NUMBER]', '3124332') INTO REQUEST_KEY_VALUE (KEY_NAME, DATA_VALUE) VALUES ('[TOTAL_DESKTOP_COST]', '11423.1') INTO REQUEST_KEY_VALUE (KEY_NAME, DATA_VALUE) VALUES ('[TOTAL_WALKOUT_COST]', '5477.93') INTO REQUEST_KEY_VALUE (KEY_NAME, DATA_VALUE) VALUES ('STATUS', 'New Sundry Request') INTO REQUEST_KEY_VALUE (KEY_NAME, DATA_VALUE) VALUES ('Requestor', NULL) -- 空值直接用NULL SELECT 1 FROM DUAL; -- 必须加这句,Oracle要求INSERT ALL后面跟SELECT语句
方法2:使用SELECT ... UNION ALL
如果习惯用查询拼接行的方式,也可以这么写:
INSERT INTO REQUEST_KEY_VALUE (KEY_NAME, DATA_VALUE) SELECT 'TaskType', 'SRC_Copay' FROM DUAL UNION ALL SELECT '[BILLING_ACCOUNT_NUMBER]', '3124332' FROM DUAL UNION ALL SELECT '[TOTAL_DESKTOP_COST]', '11423.1' FROM DUAL UNION ALL SELECT '[TOTAL_WALKOUT_COST]', '5477.93' FROM DUAL UNION ALL SELECT 'STATUS', 'New Sundry Request' FROM DUAL UNION ALL SELECT 'Requestor', NULL FROM DUAL;
注意事项
- 如果你希望保留键名里的方括号(比如
[BILLING_ACCOUNT_NUMBER]),直接在KEY_NAME的字符串里带上就行,不需要额外处理; - 数值类型的值(比如
11423.1)转成字符串存储完全没问题,后续查询时可以用TO_NUMBER()转回数值; - 空值的
Requestor直接用NULL插入,避免插入空字符串(当然如果业务需要空字符串也可以换成'')。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

