Subject | Debugging Stored Procedures |
---|---|
Author | robertgilland |
Post date | 2007-03-14T23:32:12Z |
Is there any way to debug a stored procedure?
I have done a full backup restore cycle on the database, without a
problem.
I am getting an error:
ISC ERROR CODE:335544652
ISC ERROR MESSAGE:
multiple rows in singleton select
Here is the Stored Procedure. I cannot find any tool/way to debug it.
CREATE PROCEDURE PROC_EXT_MYTABLE
( ROWS_PROCESSED_SO_FAR INTEGER, ROWS_PERCYCLE INTEGER )
RETURNS
( BATCH_ROWS_PROCESSED INTEGER )
AS
DECLARE VARIABLE THEFIELD1 VARCHAR(10);
DECLARE VARIABLE THEFIELD2 TIMESTAMP;
DECLARE VARIABLE THEFIELD3 VARCHAR(20);
DECLARE VARIABLE THEFIELD4 FLOAT;
DECLARE VARIABLE THEFIELD5 FLOAT;
DECLARE VARIABLE THEFIELD6 FLOAT;
DECLARE VARIABLE THECOUNT INTEGER;
BEGIN
THECOUNT = 0;
FOR SELECT CAST( RTRIM( FIELD1 ) AS VARCHAR(10) ) AS FIELD1
,CAST( FIELD2 AS TIMESTAMP ) AS FIELD2
,CAST( RTRIM( FIELD3 ) AS VARCHAR(20) ) AS FIELD3
,CAST( FIELD4 AS FLOAT ) AS FIELD4
,CAST( FIELD5 AS FLOAT ) AS FIELD5
,CAST( FIELD6 AS FLOAT ) AS FIELD6
FROM EXT_MYTABLE
INTO :THEFIELD1
,:THEFIELD2
,:THEFIELD3
,:THEFIELD4
,:THEFIELD5
,:THEFIELD6
DO
BEGIN
IF( THECOUNT >= ROWS_PROCESSED_SO_FAR )THEN
BEGIN
INSERT INTO MYTABLE
(FIELD1
,FIELD2
,FIELD3
,FIELD4
,FIELD5
,FIELD6
)
VALUES
(:THEFIELD1
,:THEFIELD2
,:THEFIELD3
,:THEFIELD4
,:THEFIELD5
,:THEFIELD6
);
WHEN SQLCODE -803 DO
BEGIN
UPDATE MYTABLE
SET FIELD4 = :THEFIELD4
,FIELD5 = :THEFIELD5
,FIELD6 = :THEFIELD6
WHERE (FIELD1 = :THEFIELD1 )
AND (FIELD2 = :THEFIELD2 )
AND (FIELD3 = :THEFIELD3 )
;
END
END
THECOUNT = THECOUNT + 1;
IF(( THECOUNT - ROWS_PROCESSED_SO_FAR ) >= ROWS_PERCYCLE )THEN
LEAVE;
END
BATCH_ROWS_PROCESSED = THECOUNT;
SUSPEND;
END;
Regards,
Robert.
I have done a full backup restore cycle on the database, without a
problem.
I am getting an error:
ISC ERROR CODE:335544652
ISC ERROR MESSAGE:
multiple rows in singleton select
Here is the Stored Procedure. I cannot find any tool/way to debug it.
CREATE PROCEDURE PROC_EXT_MYTABLE
( ROWS_PROCESSED_SO_FAR INTEGER, ROWS_PERCYCLE INTEGER )
RETURNS
( BATCH_ROWS_PROCESSED INTEGER )
AS
DECLARE VARIABLE THEFIELD1 VARCHAR(10);
DECLARE VARIABLE THEFIELD2 TIMESTAMP;
DECLARE VARIABLE THEFIELD3 VARCHAR(20);
DECLARE VARIABLE THEFIELD4 FLOAT;
DECLARE VARIABLE THEFIELD5 FLOAT;
DECLARE VARIABLE THEFIELD6 FLOAT;
DECLARE VARIABLE THECOUNT INTEGER;
BEGIN
THECOUNT = 0;
FOR SELECT CAST( RTRIM( FIELD1 ) AS VARCHAR(10) ) AS FIELD1
,CAST( FIELD2 AS TIMESTAMP ) AS FIELD2
,CAST( RTRIM( FIELD3 ) AS VARCHAR(20) ) AS FIELD3
,CAST( FIELD4 AS FLOAT ) AS FIELD4
,CAST( FIELD5 AS FLOAT ) AS FIELD5
,CAST( FIELD6 AS FLOAT ) AS FIELD6
FROM EXT_MYTABLE
INTO :THEFIELD1
,:THEFIELD2
,:THEFIELD3
,:THEFIELD4
,:THEFIELD5
,:THEFIELD6
DO
BEGIN
IF( THECOUNT >= ROWS_PROCESSED_SO_FAR )THEN
BEGIN
INSERT INTO MYTABLE
(FIELD1
,FIELD2
,FIELD3
,FIELD4
,FIELD5
,FIELD6
)
VALUES
(:THEFIELD1
,:THEFIELD2
,:THEFIELD3
,:THEFIELD4
,:THEFIELD5
,:THEFIELD6
);
WHEN SQLCODE -803 DO
BEGIN
UPDATE MYTABLE
SET FIELD4 = :THEFIELD4
,FIELD5 = :THEFIELD5
,FIELD6 = :THEFIELD6
WHERE (FIELD1 = :THEFIELD1 )
AND (FIELD2 = :THEFIELD2 )
AND (FIELD3 = :THEFIELD3 )
;
END
END
THECOUNT = THECOUNT + 1;
IF(( THECOUNT - ROWS_PROCESSED_SO_FAR ) >= ROWS_PERCYCLE )THEN
LEAVE;
END
BATCH_ROWS_PROCESSED = THECOUNT;
SUSPEND;
END;
Regards,
Robert.