阅读有关Dynamic SQL
.
基本上,这将是类似的东西
l_query := 'select * from '
|| case l_param
when 1 then 'table1'
when 2 then 'table2'
end;
然后您使用此字符串打开一个游标,根据您的查询实际执行的操作,有几个选项可以执行此操作。
没有仔细阅读你的问题。如果您想要一个纯 sql解决方案,那么可能没有。好吧,也许仅union all
用于连接来自不同表的结果集(假设它们具有相似的结构),然后根据您的参数值对其进行过滤。
更新:另一种选择是这样的 - 生成 XML 并查询它,但我不完全确定这是一个好习惯 :)
10:54:40 SYSTEM@dwh-prod> l
1 select *
2 from xmltable(
3 '/ROWSET/*'
4 passing xmltype(
5 dbms_xmlgen.getxml(
6 'select * from '
7 || case :param
8 when 1 then 'all_objects'
9 when 2 then 'user_objects'
10 else 'dba_objects'
11 end
12 ||' where rownum < 10'
13 )
14 )
15 columns
16 object_name varchar2(100) path '//ROW/OBJECT_NAME',
17 object_type varchar2(100) path '//ROW/OBJECT_TYPE',
18 status varchar2(100) path '//ROW/STATUS'
19* )
10:54:40 SYSTEM@dwh-prod> exec :param := 1;
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.01
10:55:00 SYSTEM@dwh-prod> /
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- -------------------- --------------------
CON$ TABLE VALID
I_COL2 INDEX VALID
I_USER# INDEX VALID
C_TS# CLUSTER VALID
I_OBJ# INDEX VALID
I_CON2 INDEX VALID
I_OBJ5 INDEX VALID
IND$ TABLE VALID
BOOTSTRAP$ TABLE VALID
9 rows selected.
Elapsed: 00:00:00.04
10:55:01 SYSTEM@dwh-prod> exec :param := 2;
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
10:55:06 SYSTEM@dwh-prod> /
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- -------------------- --------------------
AQ$DEF$_AQCALL VIEW VALID
AQ$DEF$_AQERROR VIEW VALID
AQ$_DEF$_AQCALL_E QUEUE VALID
AQ$_DEF$_AQCALL_F VIEW VALID
AQ$_DEF$_AQERROR_E QUEUE VALID
AQ$_DEF$_AQERROR_F VIEW VALID
AQ$_INTERNET_AGENTS TABLE VALID
AQ$_INTERNET_AGENT_P TABLE VALID
AQ$_QUEUES TABLE VALID
9 rows selected.
Elapsed: 00:00:00.04