You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中如何将表行数据转换为列名与对应值的键值对列表?

针对你的需求,我整理了几个在Oracle中实现的方案,根据你的Oracle版本和实际使用场景来选就行:

方案1:利用Oracle 12c+的JSON函数(推荐)

如果你的Oracle版本是12c及以上,直接用内置的JSON生成函数就能轻松得到想要的格式,语法简洁还能避免手动拼接的错误:

SELECT 
  JSON_ARRAY(
    JSON_OBJECT('Name' VALUE t.Name),
    JSON_OBJECT('Age' VALUE t.Age),
    JSON_OBJECT('Country' VALUE t.Country)
  ) AS row_key_value_list
FROM your_table t
WHERE t.Id = 1; -- 替换成你需要查询的Id,去掉WHERE可查所有行

执行后,Id=1的行就会返回:[{"Name":"AAAA"},{"Age":12},{"Country":"AU"}],和你要的格式几乎一致(JSON标准会给字符串值加双引号,更规范)。

方案2:手动拼接字符串(兼容低版本Oracle)

如果你的Oracle版本低于12c,没有JSON函数,可以手动拼接字符串生成目标格式。注意对字符串类型的列用QUOTE()函数处理,避免特殊字符破坏格式:

SELECT 
  '[' ||
  '{Name:' || QUOTE(t.Name) || '},' ||
  '{Age:' || t.Age || '},' ||
  '{Country:' || QUOTE(t.Country) || '}' ||
  ']' AS row_key_value_list
FROM your_table t
WHERE t.Id = 1;

执行后会返回:[{Name:'AAAA'}, {Age:12}, {Country:'AU'}],完全符合你给出的示例格式。

方案3:PL/SQL函数封装(适合重复调用场景)

如果需要多次生成这种格式的结果,把逻辑封装成PL/SQL函数会更方便,还能处理异常情况。

3.1 返回字符串格式的结果

CREATE OR REPLACE FUNCTION get_row_as_keyval_list(p_id NUMBER) RETURN VARCHAR2 IS
  v_name your_table.Name%TYPE;
  v_age your_table.Age%TYPE;
  v_country your_table.Country%TYPE;
  v_result VARCHAR2(1000);
BEGIN
  -- 查询目标行的数据
  SELECT Name, Age, Country 
  INTO v_name, v_age, v_country
  FROM your_table 
  WHERE Id = p_id;
  
  -- 拼接成目标格式字符串
  v_result := '[' ||
              '{Name:' || QUOTE(v_name) || '},' ||
              '{Age:' || v_age || '},' ||
              '{Country:' || QUOTE(v_country) || '}' ||
              ']';
  RETURN v_result;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    RETURN '[]'; -- 没有找到对应Id时返回空列表
END;
/

调用方式:

SELECT get_row_as_keyval_list(1) FROM DUAL;

3.2 返回集合类型的结果(适合PL/SQL内部使用)

如果需要在PL/SQL程序中直接使用这个键值对列表(而不是字符串),可以定义自定义对象和集合类型:

-- 先定义键值对对象类型
CREATE OR REPLACE TYPE kv_pair_obj AS OBJECT(
  col_name VARCHAR2(50),
  col_value VARCHAR2(100)
);
-- 再定义集合类型(存储多个键值对)
CREATE OR REPLACE TYPE kv_pair_list AS TABLE OF kv_pair_obj;
/

然后编写返回集合的函数:

CREATE OR REPLACE FUNCTION get_row_as_collection(p_id NUMBER) RETURN kv_pair_list IS
  v_name your_table.Name%TYPE;
  v_age your_table.Age%TYPE;
  v_country your_table.Country%TYPE;
  v_result kv_pair_list := kv_pair_list();
BEGIN
  SELECT Name, Age, Country 
  INTO v_name, v_age, v_country
  FROM your_table 
  WHERE Id = p_id;
  
  -- 初始化集合并添加键值对
  v_result.EXTEND(3);
  v_result(1) := kv_pair_obj('Name', v_name);
  v_result(2) := kv_pair_obj('Age', TO_CHAR(v_age)); -- 数字转字符串统一类型
  v_result(3) := kv_pair_obj('Country', v_country);
  
  RETURN v_result;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    RETURN v_result; -- 无数据时返回空集合
END;
/

调用方式(在SQL中查看结果):

SELECT * FROM TABLE(get_row_as_collection(1));

执行后会返回三行数据,每行对应一个键值对的列名和值。

内容的提问来源于stack exchange,提问作者Dhakchianandan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:04:57