【发布时间】:2018-01-18 11:09:24
【问题描述】:
在存储过程中,我试图根据通过 WITH 和递归 CTE 语句创建的虚拟数据集来设置声明的 varchar(100) 变量“my_path”的值。
首先我尝试“SELECT INTO”,但出现“缺少关键字”错误。
我也可以考虑从 WITH 语句中更新值为 'path' 的表行,但随后出现“缺少选择关键字”错误,并且我了解到我无法在 Oracle SQL Server 中使用 CTE 进行更新。但是有什么方法可以访问递归 CTE 的输出呢?我稍后在我的存储过程中需要它。
declare mypath varchar(100);
begin
with CTE (toN,path,done)
as
(
-- anchor
select
cap.toN,
concat(concat(CAST(cap.fromN as varchar(10)) , ',') , CAST(cap.toN as varchar(10))),
case when cap.toN = 10000 then 1 else 0 end
from cap
where
(fromN = 1) and (cap.cap_up > 0)
union all
-- recursive
select
cap.toN,
concat(concat(path,','), CAST(cap.toN as varchar(10)) ),
case when cap.toN=10000 then 1 else 0 end
from cap join cte on
cap.fromN = cte.toN
where
(cap.cap_up > 0) and (cte.done = 0)
)
select path into mypath from cte where done=1
);
end;
【问题讨论】:
-
使用 CTE 时,一个语句可能会引用先前的语句。但是您的陈述是在引用自己 - 不确定这是否合法。
-
FROM是 Oracle 中的关键字 - 您不应在关键字之后命名列,但如果必须,您需要将它们括在双引号中(并确保使用正确的大小写)(即 @ 987654323@). -
@ChristianPalmer 这是一个 recursive 子查询分解子句 - 它是合法的。
-
@user1777530 : 我认为问题是最后的')'
-
在声明部分在
mypath varchar(100)之后添加分号。
标签: sql oracle select-into