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');

Reply via email to