2013-09-26 2 views
0

У меня есть таблица emp (eid, ename, bossid, eloc), мое требование - написать процедуру для отображения всех сотрудников и их имени босса всех сотрудников, которые находятся в в том же месте, что и для заданных аргументов (заданного emp id). Выше запрос может быть просто решена (для Ид = 10) с использованием «с» пункта, как показано нижеИспользование предложения with в курсорах в DB2

with t (id, name, loc, bsid, bsname) as 
    (select a.eid, a.ename, a.eloc, b.eid, b.ename 
    from emp a, emp b 
    where a.bossid = b.eid) 
select y.id, y.bsname 
from t x, t y 
where x.loc = y.loc and <b> x.id = 10; 

но когда я пишу процедуру DB2, как показано ниже процедура не может скомпилировать с ошибкой, как «SQL0104N Неожиданный маркера» как "было найдено следующее" bsid, bsname) "."

create or replace procedure test with (
    in argid varchar(100), 
) 
LANGUAGE SQL 
COMMIT ON RETURN NO 
BEGIN 
    for rec as (
     with t (id, name, loc, bsid, bsname) as 
       (select a.eid, a.ename, a.eloc, b.eid, b.ename 
       from emp a, emp b 
       where a.bossid = b.eid) 
     select y.id, y.bsname 
     from t x, t y 
     where x.loc = y.loc and x.id = **argid**) 
    do 
     call dbms_output.put_line('ID = ' || rec.id || ', Name = ' || rec.bsname); 
    end for; 
END 

ответ

0

Я не уверен, если это ваш реальный код процедуры: procedure test with ( и **argid** выглядят очень подозрительными.

Если это так, то вы не должны использовать круглые скобки вокруг ЗЕЬЕСТА в ФОРЕ:

BEGIN 
    for rec as -- parenthesis removed (
    with t (id, name, loc, bsid, bsname) as 
    ... 
    where x.loc = y.loc and x.id = **argid** -- parenthesis removed) 
Смежные вопросы