1

ストアド プロシージャ内で再帰的な CTE を実行する必要がありますが、これを超えることができません: SQL0104N "SET count=count+1; " の後に "with" という予期しないトークンが見つかりました。予想されるトークンには次のものが含まれる場合があります: ""。行番号 = 26。

私の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
4

2 に答える 2

0

CTEクエリをカーソル内に囲むというrjbの提案に加えて、CTEをユーザー定義関数またはビューに詰め込み、そのオブジェクトに対する直接選択をストアドプロシージャにコーディングすることもできます。

于 2010-07-27T18:33:09.657 に答える
0

db2 の cte はクエリのスカラー結果を認識していないようで、選択を機能させません (Oracle または SQLServer では問題ではありません)...解決策は、カーソルを開いて FETCH INTO ( SELECT INTO の代わりに) 代わりに。

于 2010-07-21T20:44:50.353 に答える