情况如下:
我只有一行(来自查询)。该行中的数据必须以JSON格式发送到服务器,其中JSON文件中的每个数据条目都是
的组合 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="HeadWrap">
<header id="Header" class="MxW">
HEADER
</header>
<section id="SubHdr">
<div id="Logo">
LOGO
</div>
<nav>
<a href="#">LINK 1</a>
<a href="#">LINK 2</a>
<a href="#">LINK 3</a>
<a href="#">LINK 4</a>
<a href="#">LINK 5</a>
</nav>
</section>
</div>
<main>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut cursus tellus vitae lacus vestibulum, a consequat metus mattis. Cras viverra mollis finibus. Curabitur maximus purus leo, vitae pellentesque elit consequat at. Sed vestibulum purus fringilla ligula egestas aliquam. Morbi ac euismod neque. Duis egestas magna arcu, vitae porta leo mattis at. Donec non ante ligula. Morbi nec maximus libero. Curabitur euismod efficitur lorem at dignissim. Nulla imperdiet mi a est viverra congue.</p>
<p>Sed sit amet ornare enim. Sed vestibulum est id ligula auctor lobortis. Vivamus facilisis ligula sed risus laoreet aliquam. Vestibulum cursus accumsan fringilla. Donec consequat massa quis justo tempor malesuada. Quisque elementum viverra lorem, sed vestibulum ipsum efficitur eu. Pellentesque sagittis condimentum justo, eu tristique ante imperdiet et.</p>
<p>Integer mauris ipsum, dictum sit amet nulla eget, fermentum rhoncus nulla. Mauris id magna mattis, imperdiet est vel, laoreet nisi. Morbi blandit arcu et porttitor condimentum. Morbi lobortis, quam vitae pretium vehicula, nisl magna sagittis nisi, ac pellentesque ligula erat a nunc. Aenean interdum tempus ante in sollicitudin. Aliquam vitae vehicula ligula, bibendum blandit arcu. Integer euismod ullamcorper neque in posuere. Proin sit amet quam neque. Sed bibendum neque ipsum, ut sodales ante aliquet eu. Maecenas ante elit, rutrum eu suscipit at, fringilla eget justo. Cras eu vehicula sapien. Aenean ullamcorper, eros in fermentum tristique, nulla urna lobortis velit, sed semper libero arcu sit amet risus. Nulla luctus imperdiet leo at laoreet. Vivamus luctus ultrices nisi, non sodales mi gravida malesuada.</p>
In hac habitasse platea dictumst. Duis mi nulla, blandit id augue non, imperdiet laoreet odio. Nunc tempor lectus vel tincidunt rutrum. Praesent vel laoreet arcu. Aenean a tincidunt urna. Suspendisse rutrum tempus sem ut egestas. Nam malesuada tellus nibh, eget convallis dolor egestas in. Donec nec accumsan quam. Pellentesque ultrices, ex vel feugiat finibus, ex dui imperdiet elit, eget ultrices sapien tortor dictum lectus. Aliquam sapien metus, faucibus ut elementum euismod, pulvinar sed velit. Ut facilisis fermentum nunc, a sagittis nulla tincidunt in. Ut volutpat facilisis nunc. Aenean nisl nisl, congue nec scelerisque in, euismod vitae libero. Mauris vehicula porta mattis.
</main>
。
在这种情况下,输入为
"{column_name}": "{column_value}"
,输出应该是
nr | a | b |
---|----|------|
1 | 10 | text |
如何基于一组未知的列在PL / SQL中动态生成JSON对象?这需要换行吗?如果可以,怎么办?
答案 0 :(得分:1)
在使用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.