PDA

View Full Version : SQL Stored Procedure



mk
14-08-12, 14:11
Hallo zusammen,

ich suche gerade eine Möglichkeit einen Fehler
( eine Bedingung ) im SQL abzufangen.


Create procedure MK/prc_atest (
INOUT IO_CODE CHAR(5) ,
INOUT IO_MSG CHAR(132) ,
IN ADBACTION CHAR(3 )
)
LANGUAGE SQL
SPECIFIC MK/prc_atest
..
..

Begin

DECLARE ASQLMSG CHAR(32740) ;
DECLARE SQLCODE INTEGER ;
DECLARE SQLSTATE CHAR(5) ;

if ( aDbaction = 'GO') THEN


-- CALL QCMDEXC('dltf mk/stpsum', 000000015.00000);
--drop table mk/stpsum ;
--if ( SQLSTATE = '42704') then
-- set io_code = 'y999' ;
--End if;
create table mk/stpsum
as( select grp as GRPSUM,
dec( sum(QTY) , 10 , 0) as SumQty ,
dec( sum(AMT) , 10 , 2) as SumAMt
FROM mk/stp GROUP BY grp)
with data ;

set IO_Code='001' ;
return 0 ;
End if;


set io_code = 'xxxx' ;
set io_Msg = 'aDbAction code ' concat adbaction concat '=';

END ;

COMMENT ON SPECIFIC PROCEDURE MK/prc_atest
IS 'SQL Procedure MK/prc_atest ' ;


Mit dieser SQL Prozedur soll die Tabelle mk/stpsum ( später weitere Tabellen )
erstellt werden.

Ich muss die Tabellen vorher Löschen
Also eine Drop Table verwenden.
Der Drop Table läuft auf eine Exception wenn die Tabelle schon da ist.

Damit das Programm weiterläuft muss diese
Bedingung abgefangen werden.
Weiß jemand wie das geht ?

Gruß
Michael

andreaspr@aon.at
14-08-12, 14:21
Create procedure MK/prc_atest (
INOUT IO_CODE CHAR(5) ,
INOUT IO_MSG CHAR(132) ,
IN ADBACTION CHAR(3 )
)
LANGUAGE SQL
SPECIFIC MK/prc_atest
..
..

Begin
DECLARE CONTINUE HANDLER FOR 2
SQLSTATE '23505';
(Wobei 23505 für den zu ersetzenden Code steht)
oder

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 1
SET vsqlcode = SQLCODE;

lg Andreas

B.Hauser
14-08-12, 14:28
Ein Continue Handler ist der richtige Weg.
Es gibt allerdings auch die Quick und Dirty-Lösung, nämlich, dass man prüft ob die Tabelle in der Catalog View SYSTABLES vorhanden ist.
Ist sie vorhanden, dann Löschen ansonsten nicht.


Declare isFound Integer;
....

Set isFound = 0;

Select 1 into isFound
From SysTables
Where System_Table_Name = 'STPSUM'
and System_Table_Schema = 'MK';

If isFound = 1 Then Drop Table MK/STPSUM;
End If;

Birgitta

mk
14-08-12, 14:48
Hallo zusammen

so klappt es:



...
...
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
Begin
set IO_Code=SQLCODE ;
End;
...
..
drop table mk/stpsum ;
set IO_Code='001' ;
set io_Msg = 'table delete ' ;

create table mk/stpsum
as( select grp as GRPSUM,
dec( sum(QTY) , 10 , 0) as SumQty ,
dec( sum(AMT) , 10 , 2) as SumAMt
FROM mk/stp GROUP BY grp)
with data ;

set IO_Code='002' ;
set io_Msg = 'table erstellt ' ;


Dieses Forum und die fachliche Kompetenz ist einfach Spitze :)

Vielen Dank