怎么用Oracle 存过中执行多个查询SQL 并返回结果,SQL和返回结果都存在一张表里面

2024-11-25 16:54:11
推荐回答(3个)
回答1:

你这种要求不应该这么设计,首先你十几条的SQL的结果集字段类型和个数不一定一样,所以没法存储,只有你的SQL返回的结果集都一样或者可以枚举且字段类型均一样,这样就可以用自定义类型作为B字段。

解决方案一:单表存储结果

思路:要求所有的SQL返回结果集列数不多于N个,然后创建一个N个字段的TYPE,此处假设N=5,代码如下:

--创建多个字段的type
create or replace type test_column_type as object (
col_1     varchar2(300),
col_2     varchar2(300),
col_3     varchar2(300),
col_4     varchar2(300),
col_5     varchar2(300)
);
--创建引用多个字段的type
create or replace type test_tab_column_type as table of test_column_type;

--创建表
create table test_tab (
a     varchar2(300),
b     test_tab_column_type)
nested table b store as nested_tab return as value;


--写数据的语句
insert into test_tab
values
('1',test_tab_column_type(test_column_type(1,1,1,1,1),test_column_type(2,2,2,2,2)));

解决方案二:多表存储结果

思路:主子表,先创建一个表只用来存SQL,另外一个表存SQL的结果,大致如下:

create t_sql(
id   number,
a    varchar2(3000)
);
create t_sql_result(
id       number,
col1     varchar2(400),
col2     varchar2(400),
...
colN     varchar2(400)
);

如果所有SQL返回的列数都一样,那很简单,直接写到 t_sql_result 表里面即可。

如果SQL返回的列数不一样,则需要判断每个sql返回的列数,然后拼接动态SQL,将结果写入 t_sql_result 表。

回答2:

set feedback off heading off term off
set pages 0 trim on trims on lines 32767 long 999999
set echo off
spool result.sql
Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
spool off
把以上部分放入一个脚本文件中再执行,会在当前目录下生成你要的文件result.sql

回答3:

直接用spool轻轻松松, 不要把简单的问题想复杂