我一直在挑战根据参数选择不同的表格。 我的问题与this非常相似,但这是我的情况:
假设我有一个前端参数列表[1,2,3,4]
基于此参数,如何在sql上的不同表上进行选择?
在Java中,我可以这样做:
StringBuffer sql = new StringBuffer();
if ( parameter == 1)
sql.append("Select * from TABLEA");
else if ( parameter == 2)
sql.append("Select * from TABLEB");
else if ( parameter == 3)
sql.append("Select * from TABLEC");
else if ( parameter == 4)
sql.append("Select * from TABLED");
我如何在SQL本身上执行此操作?
答案 0 :(得分:1)
在Oracle PLSQL
中,你可以这样做:
PROCEDURE TEST(
o_retcd OUT NUMBER,
o_errmsg OUT VARCHAR2,
o_currStatus IN OUT SYS_REFCURSOR,
i_type IN VARRAY --your parameters
)
BEGIN
FOR i IN i_type.FIRST..i_type.LAST
LOOP
if i_type(i) = 1 then
OPEN o_currStatus FOR
select * from TABLEA;
elsif i_type(i) = 2 then
OPEN o_currStatus FOR
select * from TABLEB;
elsif i_type(i) = 3 then
OPEN o_currStatus FOR
select * from TABLEC;
elsif i_type(i) = 4 then
OPEN o_currStatus FOR
select * from TABLED;
end if;
END LOOP;
EXCEPTION
--Exception handling
WHEN OTHERS THEN
o_retcd := 100;
END;
答案 1 :(得分:0)
阅读 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