1

Мне нужно запустить рекурсивный CTE в сохраненном proc, но я не могу его пропустить: SQL0104N Неожиданный токен «с» был найден следующим образом: «SET count = count +1; ". Ожидаемые жетоны могут включать: "". НОМЕР ЛИНИИ = 26.Использовать рекурсивный CTE в DB2 хранимой proc

В моем google-fu было несколько подобных тем, но ни один с разрешением.

Запрос функционирует так, как ожидалось, вне хранимого процесса, поэтому я надеюсь, что есть какой-то синтаксический сахар, который я пропускаю, что позволит этой работе. Аналогично, proc компилируется и работает без запроса.

Вот надуманный пример:

--setup 
create table tree (id integer, name varchar(50), parent_id integer); 
insert into tree values (1, 'Alice', null); 
insert into tree values (2, 'Bob', 1); 
insert into tree values (3, 'Charlie', 2); 

-

- the proc 
create or replace procedure testme() RESULT SETS 1 LANGUAGE SQL 
BEGIN 
DECLARE SQLSTATE CHAR(5); 
DECLARE SQLCODE integer default 0; 
DECLARE count INTEGER; 
DECLARE sum INTEGER; 
DECLARE total INTEGER; 
DECLARE id INTEGER; 
DECLARE curs CURSOR WITH RETURN FOR 
select count,sum from sysibm.sysdummy1; 

DECLARE hiercurs CURSOR FOR 
select id from tree order by id; 
SET bomQuery=''; 
PREPARE stmt FROM bomQuery; 
SET count = 0; 
SET sum = 0; 
set total = 0; 
OPEN hiercurs; 
FETCH hiercurs INTO id; 
WHILE (SQLCODE <> 100) DO 
SET count=count+1; 

with org (level,id,name,parent_id) as 
(select 1 as level,root.id,root.name,root.parent_id from tree root where root.id=id 
union all 
select level+1,employee.id,employee.name,employee.parent_ id from org boss, tree employee 
where level < 5 and employee.parent_id=boss.id) 
select count(1) into sum from org; 

SET total=total+sum; 
FETCH hiercurs INTO id; 
END WHILE; 
CLOSE hiercurs; 
OPEN curs; 
END 

ответ

0

КТР в db2, кажется, не признают скалярный результат запроса, и поэтому он не позволит выбрать (не проблема на Oracle или SQLServer) ... решение заключается в том, чтобы открыть курсор и FETCH INTO (вместо SELECT INTO).

0

В дополнение к предложению rjb, содержащему запрос CTE внутри курсора, вы также можете нанести CTE на пользовательскую функцию или представление, а затем закодировать прямой выбор объекта, который будет храниться в этой хранимой процедуре.

Смежные вопросы