由于您使用的是 12cR1,因此您无法使用 12cR2 中添加的 JSON 生成功能。有可用的包 (PL/JSON),但如果您只有这一项任务,您可能会使用 dbms_sql 包自行开发。
作为一个相当简单 (!) 的示例,并假设问题中提到的单行,您可以执行以下操作:
declare
-- for query text
l_query varchar2(4000);
-- for fetching query results
l_varchar2 varchar2(4000);
l_number number;
l_date date;
l_timestamp timestamp;
-- for generated JSON string
l_json varchar2(4000);
-- for dbms_sql calls
l_c pls_integer;
l_col_cnt pls_integer;
l_desc_t dbms_sql.desc_tab3;
l_rc pls_integer;
begin
-- arbitrary query
l_query := 'select a, b, c from your_table where nr = 1';
l_c := dbms_sql.open_cursor;
dbms_sql.parse(l_c, l_query, dbms_sql.native);
dbms_sql.describe_columns3(c => l_c, col_cnt => l_col_cnt, desc_t => l_desc_t);
for i in 1..l_col_cnt loop
case l_desc_t(i).col_type
when 1 then
dbms_sql.define_column(l_c, i, l_varchar2, 4000);
when 2 then
dbms_sql.define_column(l_c, i, l_number);
when 12 then
dbms_sql.define_column(l_c, i, l_date);
when 180 then
dbms_sql.define_column(l_c, i, l_timestamp);
-- more types as needed
else raise_application_error(-20001, 'Unknown data type ' || l_desc_t(i).col_type);
end case;
end loop;
l_rc := dbms_sql.execute(l_c);
l_rc := dbms_sql.fetch_rows(l_c);
l_json := '{' || chr(10);
for i in 1..l_col_cnt loop
-- name
l_json := l_json || ' "' || l_desc_t(i).col_name || '": ';
-- value
case l_desc_t(i).col_type
when 1 then
dbms_sql.column_value(l_c, i, l_varchar2);
l_json := l_json || '"' || l_varchar2 || '"';
when 2 then
dbms_sql.column_value(l_c, i, l_number);
l_json := l_json || l_number;
when 12 then
dbms_sql.column_value(l_c, i, l_date);
l_json := l_json || '"' || to_char(l_date, 'YYYY-MM-DD"T"HH24:MI:SS') || '"';
when 180 then
dbms_sql.column_value(l_c, i, l_timestamp);
l_json := l_json || '"' || to_char(l_timestamp, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') || '"';
-- more types as needed
else raise_application_error(-20001, 'Unknown data type ' || l_desc_t(i).col_type);
end case;
if i < l_col_cnt then
l_json := l_json || ',';
end if;
l_json := l_json || chr(10);
end loop;
l_json := l_json || '}';
dbms_sql.close_cursor(l_c);
-- for debugging, to see generated value
dbms_output.put_line(l_json);
end;
/
您可能会使用类似的机制将查询传递到函数或过程并从函数或过程中取回 JSON。你可能需要一个 CLOB 来保存生成的 JSON;和错误检查等...
为了好玩,添加了一个带有日期列的示例表:
create table your_table (nr, a, b, c) as
select 1, 10, cast('text' as varchar2(30)), sysdate from dual;
得到:
{
"A": 10,
"B": "text",
"C": "2019-01-23T07:14:43"
}
PL/SQL procedure successfully completed.