konto usunięte

Temat: DB2 iSeries - zapytania rekursywne przez JDBC

Witam,

Czy ktoś zna sposób na wykonanie zapytania rekursywnego na DB2 przez JDBC / iSeries?

Przykład który działa w STRSQL:


WITH
PRC_LIST(PRC_NAME, PRC_SUPER, STEP) AS
( SELECT PROCESS_NAME, SCHEDULE_NAME, CAST(0 AS SMALLINT)
FROM TABELA1
UNION ALL
SELECT SUB.SUBSEQUENT_PROCESS,
SUP.PRC_NAME,
CAST(SUP.STEP+1 AS SMALLINT)
FROM TABELA2 SUB, PRC_LIST SUP
WHERE SUP.PRC_NAME = SUB.PRIOR_PROCESS
)

WITH
PRC_LIST(SCH_NAME, PRC_NAME, PRC_SUPER, STEP) AS
( SELECT SCHEDULE_NAME, PROCESS_NAME, SCHEDULE_NAME, CAST(0 AS SMALLINT)
FROM TABELA1
UNION ALL
SELECT SUP.SCHEDULE_NAME,
SUB.SUBSEQUENT_PROCESS,
SUP.PRC_NAME,
CAST(SUP.STEP+1 AS SMALLINT)
FROM TABELA2 SUB, PRC_LIST SUP
WHERE SUP.PRC_NAME = SUB.PRIOR_PROCESS
)


Komunikat błędu w JDBC:

[Error Code: -199, SQL State: 42601] [SQL0199] Nieoczekiwane słowo kluczowe WITH.
Piotr L. edytował(a) ten post dnia 05.04.13 o godzinie 16:26

konto usunięte

Temat: DB2 iSeries - zapytania rekursywne przez JDBC

Nie wiem co to jest STRSQL i dlaczego to tam działa, ale jeśli chodzi o DB2, to
błąd, który dostajesz wynika z nieprawidłowej składni i nie ma nic wspólnego z tym, że wołasz ten SQL przez JDBC.
Używasz zagnieżdżonej common table expression bez klauzuli fullselect, która jest wymagana. Poza tym, jeśli użyjesz w jednym wyrażeniu select-statement
dwóch CTE o tych samych nazwach, to dostaniesz SQLCODE -340.
Nie wnikam w logikę, ale SQL, który zadziała, wygląda na przykład tak:


WITH
PRC_LIST(PRC_NAME, PRC_SUPER, STEP) AS
( SELECT PROCESS_NAME, SCHEDULE_NAME, 0
FROM TABELA1
UNION ALL
SELECT SUB.SUBSEQUENT_PROCESS,
SUP.PRC_NAME,
SUP.STEP+1
FROM TABELA2 SUB, PRC_LIST SUP
WHERE SUP.PRC_NAME = SUB.PRIOR_PROCESS
) ,

PRC_LIST1(SCH_NAME, PRC_NAME, PRC_SUPER, STEP) AS
( SELECT SCHEDULE_NAME, PROCESS_NAME, SCHEDULE_NAME, 0
FROM TABELA1
UNION ALL
SELECT SUP.SCHEDULE_NAME,
SUB.SUBSEQUENT_PROCESS,
SUP.PRC_NAME,
SUP.STEP+1
FROM TABELA2 SUB, PRC_LIST1 SUP
WHERE SUP.PRC_NAME = SUB.PRIOR_PROCESS
)
SELECT * FROM PRC_LIST;


PS No i pozbądź się funkcji cast-ującej.

konto usunięte

Temat: DB2 iSeries - zapytania rekursywne przez JDBC

Okazało się że to jakiś śmieć - złączone dwa zapytania.
Poprawne zapytanie rekursywne z WITH działa bez problemu z JDBC.

Poprawna wersja:

WITH
PRC_LIST(SCHEDULE_NAME, PRC_NAME, PRC_SUPER, STEP) AS
(
SELECT bspd.schedule_name,
bspd.process_name,
bspd.schedule_name,
0
FROM tab1 bspd
UNION ALL
SELECT SUP.schedule_name,
SUB.subsequent_process,
SUP.prc_name,
SUP.step + 1
FROM tab2 SUB,
prc_list SUP
WHERE
SUP.prc_name = SUB.prior_process
)
select * from prc_list


Dzięki i pozdrawiam!Piotr L. edytował(a) ten post dnia 10.04.13 o godzinie 09:11



Wyślij zaproszenie do