我以前从未见过这个......我的查询开头就是这样:
with q1 as
(select a.V_ID, a.D_ID, a.C_ID,
case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
a.C_val
from ab_a_table a
where a.C_ID = '00000003' -- '00000007' -- test values
and a.B_VAL = '6010001'
and a.Q = '11234567')
select case
when ... /* rest of query omitted */
当我尝试运行时,Oracle抱怨table or view does not exist
。但它突出显示第3行的',',而不是实际的表/视图名称:
case when a.percent > 0 THEN 'Y' ELSE 'N' end L_VAL, * ERROR at line 3: ORA-00942: table or view does not exist
我省略的其余查询是相当漫长而复杂的 - 我会清理并在必要时发布它 - 现在我只是说这个错误只在我添加引用{{1}的第三个子查询时才开始}。事实上,似乎我可以删除3个子查询中的任何一个,并且整个事情将执行(虽然结果不正确)所以感觉我遇到了某种Oracle错误而不是纯SQL错误。同样有趣的是,我可以将q1
的主体作为一个独立的查询运行,当我这样做时它没有问题。只有当我运行整个查询时,它才会在q1
中的案例后抱怨逗号。
有没有人经历过这个?
(使用Oracle 10g)。
修改:尝试添加了q1
个关键字。结果现在是:
case when a.perc_fault > 0 THEN 'Y' ELSE 'N' end AS L_VAL, a.C_VAL * ERROR at line 3: ORA-00942: table or view does not exist
看起来星号位于相同的位置,但在AS
下,因为单词V
已移动了3个字符。很奇怪......
答案 0 :(得分:0)
我不确定我是否遇到Oracle错误5130732,但确实感觉就像这样。无论如何,我重写了这样的查询:
select case ...
from
(select ...
from (select a.V_ID, a.D_ID, a.C_ID,
case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
a.C_val
from ab_a_table a
where a.C_ID = '00000003' -- '00000007' -- test values
and a.B_VAL = '6010001'
and a.Q = '11234567') q1, <other tables>
where ...) subquery1,
(select ...
from (select a.V_ID, a.D_ID, a.C_ID,
case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
a.C_val
from ab_a_table a
where a.C_ID = '00000003' -- '00000007' -- test values
and a.B_VAL = '6010001'
and a.Q = '11234567') q1, <other tables>
where ...) subquery2,
(select ...
from (select a.V_ID, a.D_ID, a.C_ID,
case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
a.C_val
from ab_a_table a
where a.C_ID = '00000003' -- '00000007' -- test values
and a.B_VAL = '6010001'
and a.Q = '11234567') q1, <other tables>
where ...) subquery3, <other tables>
where....
是的,我在每个使用它的子查询中都包含了q1
的副本,现在一切正常。一个真实的观点也会起作用,但这更容易(政治上,就是 - 没有代码升级请求到需要进行分析的环境,没有关于数据库中最近添加的对象的会议等等)< / p>
<强>更新强>
现在我已经将查询添加到我的PL / SQL脚本中,Oracle给了我ORA-00600 [qcscpqbTxt], [600]
,这似乎与Oracle bug#5765958有关.... *叹气* ...任何人都可以建议一个解决方法?我没有metalink访问权限(好吧,我可以通过DBA,如果这可以以某种方式进入他们的雷达)。
答案 1 :(得分:0)
假设您遇到Oracle错误且无法修补数据库,您可以尝试将子查询移动到函数中。不完全确定这会起作用,并假设你的PL / SQL版本在一个包中,或者有一个可以添加一个功能:
在包规范中:
type q1_rec is record(
d_id ab_a_table.v_id%TYPE,
v_id ab_a_table.d_id%TYPE,
c_id ab_a_table.c_id%TYPE,
l_val char(1),
c_val ab_a_table.c_val%TYPE);
type q1_arr is varray(9999); -- assuming you can pick a max size
function q1 return q1_arr pipelined;
pragma restrict_references(q1, wnds);
在包体中:
function q1 return q1_arr pipelined is
cursor c is
select a.V_ID, a.D_ID, a.C_ID,
case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
a.C_val
from ab_a_table a
where a.C_ID = '00000003' -- '00000007' -- test values
and a.B_VAL = '6010001'
and a.Q = '11234567');
begin
for r in c loop
pipe row(r);
end loop;
end;
然后在主查询中将子查询替换为table(q1())
。
使用引用游标或嵌套表可能有点整洁,但需要在包外部构建一个表类型,我想根据你对使用视图的额外对象评论来避免这种情况。