gpt4 book ai didi

sql - 表或 View 不存在 - Oracle 提示逗号而不是实际的表或 View 名称

转载 作者:行者123 更新时间:2023-12-01 06:45:45 25 4
gpt4 key购买 nike

我以前从未见过这个......我有一个这样的查询:

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 行的“,”,而不是实际的表/ View 名称:
当 a.percent > 0 THEN 'Y' ELSE 'N' end L_VAL,
*
第 3 行的错误:
ORA-00942: 表或 View 不存在

我省略的查询的其余部分相当长且复杂 - 我会在必要时清理并发布它 - 现在我只想说这个错误仅在我添加引用 q1 的第三个子查询时才开始。事实上,似乎我可以删除 3 个子查询中的任何一个,并且整个过程都会执行(尽管结果不正确),所以感觉就像我遇到了某种 Oracle 错误而不是纯粹的 SQL 错误。有趣的是,我可以将 q1 的主体作为独立查询运行,并且在我这样做时没有问题。只有当我运行整个查询时,它才会提示 q1 中的 case 后面的逗号。

有没有人经历过这种情况?

(使用 Oracle 10g)。

编辑:尝试添加 AS 关键字。现在的结果是:

当 a.perc_fault > 0 THEN 'Y' ELSE 'N' end AS L_VAL, a.C_VAL
*
第 3 行的错误:
ORA-00942: 表或 View 不存在

看起来星号在相同的位置,但是在 V 之下,因为 L_VAL 一词已经移动了 3 个字符。很奇怪...

最佳答案

假设您遇到了 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()) 替换子查询。

使用引用游标或嵌套表可能会更简洁一些,但需要在包外部构建表类型,我猜您想根据有关使用 View 的额外对象注释来避免这种情况。

关于sql - 表或 View 不存在 - Oracle 提示逗号而不是实际的表或 View 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5636720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com