Использовать рекурсивный CTE в хранимых процессах DB2 - PullRequest
1 голос
/ 20 июля 2010

Мне нужно запустить рекурсивный CTE внутри хранимого процесса, но я не могу справиться с этим: SQL0104N Неожиданный токен «with» был найден после «SET count = count + 1;».Ожидаемые токены могут включать: «».LINE NUMBER = 26.

Мой гугл-фу показал пару похожих тем, но ни одна с разрешением.

Запрос работает, как и ожидалось, за пределами хранимого процесса, поэтому я надеюсь, чтоя пропускаю какой-то синтаксический сахар, который позволит этой работе.Точно так же 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

Ответы [ 2 ]

0 голосов
/ 27 июля 2010

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

0 голосов
/ 22 июля 2010

cte в db2, по-видимому, не распознает скалярный результат запроса, и поэтому он не позволяет работать с выбором (не проблема для Oracle или SQLServer) ... решение состоит в том, чтобы открыть курсор иFETCH INTO (вместо SELECT INTO) вместо этого.

...