基本上,我的问题是我需要在Oracle中运行一个查询静态值列表('静态'意味着它是从我无法从数据库获取的其他地方获得的,但实际上是一个任意的值列表我使用从查询返回的动态值列表插入查询。
所以,我的初始查询如下:
select * from (select ('18776') as instanceid from dual) union (<more complex query>)
我想,万岁!然后尝试使用更长的静态值列表。事实证明,如果我试图运行,我会得到'Missing Right Parenthesis':
select ('18776','18775') as instanceid from dual
所以,我的基本问题是如何将静态值列表集成到此联合中?
注意:这是问题的简化示例。在生成查询之前,实际列表是从API生成的,因此这个“静态”值列表是不可预测且任意大的。我不是只处理2个静态值,而是任意列表。
答案 0 :(得分:6)
select '18776' as instanceid from dual union all
select '18775' as instanceid from dual
或
select column_value from table(sys.odcivarchar2list('18776', '18775'))
或某种分层查询,可以将逗号分隔为字符串并将其拆分为一组varchars。
将这些与您的初始查询联系起来。
更新:“我只处理2个静态值,它是一个任意列表。”
仍然可以作为集合传递给查询(下面只是众多可能的方法之一)
23:15:36 LKU@sandbox> ed
Wrote file S:\spool\sandbox\BUFFER_LKU_39.sql
1 declare
2 cnt int := 10;
3 coll sys.odcivarchar2list := sys.odcivarchar2list();
4 begin
5 coll.extend(cnt);
6 for i in 1 .. cnt loop
7 coll(i) := dbms_random.string('l', i);
8 end loop;
9 open :result for 'select * from table(:c)' using coll;
10* end;
23:37:03 11 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.50
23:37:04 LKU@sandbox> print result
COLUMN_VALUE
-------------------------------------------------------------
g
kd
qdv
soth
rvwnq
uyfhbq
xxvxvtw
eprralmd
edbcajvfq
ewveyljsjn
10 rows selected.
Elapsed: 00:00:00.01
答案 1 :(得分:2)
我想你想把它分成两个子查询:
select *
from ((select '18776' as instanceid from dual)
union
(select '18775' as instanceid from dual)
union
(<more complex query>)
) t;
请注意,union all
的效果优于union
。如果您知道没有重复项(或重复项无关紧要),请改用union all
。
答案 2 :(得分:0)
如果您具有创建表类型的能力/权限,则可以执行以下操作:
CREATE OR REPLACE
TYPE TYP_NUMBER_TABLE AS TABLE OF NUMBER(11);
然后你可以使用TABLE函数从你在SQL中动态初始化的那个类型的实例中进行选择:
SELECT COLUMN_VALUE FROM TABLE(TYP_NUMBER_TABLE(1, 2, 3));
结果:
COLUMN_VALUE
------------
1
2
3