To reproduce it:
dbmcli -d aair -u dbm,dbm -uSQL dummy,dummy
> sql_execute call process_protocole_total(3)
ERR
-24988,ERR_SQL: sql error
-8888,connection broken
>db_state
OK
State
OFFLINE
---
====> kernel is crashed.
Attached are the stored procedures used to trigger the crash.
DROP DBPROC create_ligne_protocole;
CREATE DBPROC create_ligne_protocole( IN protocole INTEGER,
IN produit INTEGER,
IN qte FIXED(6,2)) AS
TRY
INSERT INTO DUMMY.ligneprotocole (id, protocole, produit, type, quantite, dernqte, qteinvent)
VALUES (DUMMY.ligneprotocole_seq.NEXTVAL, :protocole, :produit, 2, :qte, 0, 0);
CATCH
IF $RC <> 0 THEN STOP($RC, 'pb dans create_ligne_protocole');
/*
* Affecte ou cr�e une ligne protocole dans le protocole total
* si elle n'existe pas
*/
DROP DBPROC set_ligne_protocole;
CREATE DBPROC set_ligne_protocole( IN protocole INTEGER,
IN produit INTEGER,
IN qte FIXED(6,2)) AS
VAR lp INTEGER;
SELECT id from DUMMY.ligneprotocole
WHERE protocole=:protocole AND produit=:produit;
IF $RC = 0 THEN
BEGIN
FETCH INTO :lp;
UPDATE DUMMY.ligneprotocole set quantite=:qte WHERE id=:lp;
END
ELSE CALL create_ligne_protocole(:protocole, :produit, :qte);
/*
* Supprime les lignes des produits qui ne sont plus dans les protocoles
*/
DROP DBPROC cleanup_protocole_total;
CREATE DBPROC cleanup_protocole_total( IN uad INTEGER,
IN protocole INTEGER) AS
TRY
DELETE from DUMMY.ligneprotocole
WHERE protocole=:protocole AND
produit NOT IN ( SELECT produit FROM DUMMY.ligneprotocole
WHERE protocole IN ( SELECT p.protocole FROM DUMMY.patient p, DUMMY.lieutraitement lt
WHERE p.uadtraitement=:uad AND
lt.id=p.lieutraitement AND
lt.calc=0) OR
protocole IN ( SELECT protocole FROM DUMMY.uad
WHERE id=:uad));
CATCH
IF $RC <> 0 THEN STOP($RC, 'pb dans cleanup_protocole');
/*
* Assigne un protocole total vide � un uad s'il n'en a pas
*/
DROP DBPROC create_protocole_total;
CREATE DBPROC create_protocole_total( IN uad INTEGER ) AS
VAR protocole_total INTEGER;
SELECT protocole_total INTO :protocole_total FROM DUMMY.uad WHERE id=:uad;
IF protocole_total = 0 OR protocole_total IS NULL THEN BEGIN
SELECT DUMMY.protocole_seq.NEXTVAL INTO :protocole_total FROM DBA.DUAL;
INSERT INTO DUMMY.protocole (id) VALUES (:protocole_total);
UPDATE DUMMY.uad SET protocole_total=:protocole_total WHERE id=:uad;
END;
/*
* Recalcul du protocole total
*/
DROP DBPROC process_protocole_total;
CREATE DBPROC process_protocole_total( IN uad INTEGER ) AS
VAR protocole_total INTEGER; produit INTEGER; qte FIXED(6,2);
CALL create_protocole_total(:uad);
SELECT protocole_total INTO :protocole_total FROM DUMMY.uad WHERE id=:uad;
CALL cleanup_protocole_total(:uad, :protocole_total);
SELECT produit, sum(quantite)
FROM DUMMY.ligneprotocole
WHERE ( protocole IN ( SELECT protocole FROM DUMMY.patient p, DUMMY.lieutraitement lt
WHERE p.uadtraitement=:uad AND p.lieutraitement=lt.id AND lt.calc=0) OR
protocole IN ( SELECT protocole FROM DUMMY.uad WHERE id=:uad) )
and type=0 group by produit;
WHILE $RC = 0 DO BEGIN
FETCH INTO :produit, :qte;
IF $RC = 100 THEN BREAK;
IF qte > 0 THEN CALL set_ligne_protocole(:protocole_total, :produit, :qte);
END;
DELETE FROM DUMMY.ligneprotocole WHERE protocole=:protocole_total AND quantite=0;
/*
* Recalcule le protocole proportionnel
*/
DROP DBPROC process_protocole_proportionnel;
CREATE DBPROC process_protocole_proportionnel( IN uad INTEGER ) AS
VAR counter INTEGER; protocole INTEGER;
TRY
SELECT COUNT(p.id) INTO :counter FROM DUMMY.patient p, DUMMY.lieutraitement lt
WHERE p.lieutraitement=lt.id AND lt.calc=0 AND p.uadtraitement=:uad;
SELECT protocole INTO :protocole FROM DUMMY.uad WHERE id=:uad;
UPDATE DUMMY.ligneprotocole
SET quantite=qtepatient*:counter
WHERE protocole=:protocole AND isproportionnel;
CATCH
IF $RC <> 0 THEN STOP($RC, 'pb dans process_protocole_proportionnel');