Toad World® Forums

Error when testing a procedure with inserts


#1

Hello experts,

getting frustrated about the following issue:

I want to test a procedure, which inserts a few rows in a specific table. After all the inserts the procedure does a commit.

So in my test I have as an input a record. As an outcome I have the table, in which the procedure inserted the data and the excepected result is a copy of the table. I modified the code, so that after creating the table the test should insert a few rows into the copy of the table. When executing the test I get the following error (unfortunately in german, but at least there is the ora message :slight_smile: ):

ORA-06519: Aktive lokale Transaktion erkannt und Rollback durchgeführt

PL/SQL Error Backtrace:
ORA-06512: in “VWN_ENTW_WIECK.Q##P_SERIEN_AUFLOESEN”, Zeile 335
ORA-06512: in “VWN_ENTW_WIECK.Q##P_SERIEN_AUFLOESEN”, Zeile 339
ORA-06512: in “VWN_ENTW_WIECK.Q##P_SERIEN_AUFLOESEN”, Zeile 501
ORA-06512: in “VWN_ENTW_WIECK.Q##P_SERIEN_AUFLOESEN”, Zeile 522

Here is the code of my tested procedure:

CREATE OR REPLACE PROCEDURE P_SERIEN_AUFLOESEN (
rec_vwserien vwserien%ROWTYPE)
IS
– Nummer, bei der die Serie anfaengt
beginn_serie NUMBER;
– Nummer, bei der die Serie aufhoert
ende_serie NUMBER;
– Generierte ZB2 fuer jeden Satz
gen_zb2 VARCHAR2 (8);
– Anzahl der Inserts
anz_durchlaeufe NUMBER;
– Stelle, bei der die Buchstaben der ZB2 wechseln
umbruch NUMBER;
– Aufgetretene Fehlermeldung
err_msg VARCHAR2 (100);
/******************************************************************************
NAME: P_SERIEN_AUFLOESEN
PURPOSE: Wird von einem Trigger auf VWSERIEN angestossen und loest die Serie in Einzelsaetze auf. Speichert
die Einzelsaetze in VWNACHWEIS.

REVISIONS:
Ver Date Author Description


1.0 17.02.2011 kwieck 1. Entwickeln der Version laut AWF
1.1 18.02.2011 kwieck 1. Einbauen des Loggings

******************************************************************************/
BEGIN
– Die Zahlenwerte der Serie werden aus dem Seriensatz herausgeschnitten
beginn_serie := TO_NUMBER (SUBSTR (rec_vwserien.vwsebeginn, 3));
ende_serie := TO_NUMBER (SUBSTR (rec_vwserien.vwseende, 3));

– Ist ende_serie kleiner als beginn_serie wechseln die Buchstaben, deswegen…
IF ende_serie
– wird die Anzahl der Inserts je nachdem berechnet
THEN
anz_durchlaeufe := (500000 - beginn_serie) + ende_serie;
umbruch := (500000 - beginn_serie);
ELSE
anz_durchlaeufe := ende_serie - beginn_serie;
END IF;

– Fuer x zu generierende VWNACHWEISE-Saetze tue …
FOR i IN 0 … anz_durchlaeufe
LOOP
– ist die Laufvariable an der Stelle, an der die Buchstaben wechseln, so werden die Anfangsbuchstaben
– von vwseende genommen, ansonsten von vwsebeginn
IF i > umbruch
THEN
gen_zb2 :=
SUBSTR (rec_vwserien.vwseende, 0, 2)
|| LPAD (TO_CHAR (beginn_serie), 6, 0);
beginn_serie := beginn_serie + 1;
ELSE
gen_zb2 :=
SUBSTR (rec_vwserien.vwsebeginn, 0, 2)
|| LPAD (TO_CHAR (beginn_serie), 6, 0);
beginn_serie := beginn_serie + 1;

     -- Wird die 500000er Grenze erreicht, so soll die naechste Zaehlung bei 1 anfangen
     IF beginn_serie = 500001
     THEN
        beginn_serie := 1;
     END IF;
  END IF;

  -- eigentliches insert in die VWNACHWEISE
  -- es wird ein Dummyaktenzeichen als Grundlage genommen
  -- der Arbeitsgang ist 0, also VZ
  INSERT INTO vwnachweise (vwnaid,
                           vwnavwseid,
                           vwnazb2,
                           vwnadtwvl,
                           vwnavwakid,
                           vwnaztbearbeitung,
                           vwnaarbeitsgang,
                           vwnamerkmalbearbeitung)
       VALUES (seq_vwnachweise_vwnaid.NEXTVAL,
               rec_vwserien.vwseid,
               gen_zb2,
               rec_vwserien.vwsedtwvl,
               (SELECT vwakid
                  FROM vwaktenzeichen
                 WHERE vwakaktenzeichen = 'KBA'),
               SYSDATE,
               0,
               1);

END LOOP;

COMMIT;

– Im Erfolgsfall wird ein Eintrag in die Loggintabelle gemacht
INSERT INTO loggserienaufloesen
VALUES (seq_loggserienaufloesen_loggid.NEXTVAL,
rec_vwserien.vwseid,
anz_durchlaeufe + 1,
NULL,
1);
EXCEPTION
WHEN OTHERS
THEN
err_msg := SUBSTR (SQLERRM, 1, 200);

  ROLLBACK;

  -- Im Fehlerfall wird die Errormessage mitgeloggt
  INSERT INTO loggserienaufloesen
       VALUES (seq_loggserienaufloesen_loggid.NEXTVAL,
               rec_vwserien.vwseid,
               anz_durchlaeufe + 1,
               err_msg,
               0);

  COMMIT;

END P_SERIEN_AUFLOESEN;
/

And here is the test code:

CREATE OR REPLACE PACKAGE “Q##P_SERIEN_AUFLOESEN” AUTHID CURRENT_USER
/*
| Automated Test Package for P_SERIEN_AUFLOESEN
|
| Generated by Quest Code Tester for Oracle.
| Visit the user community at http://unittest.inside.quest.com/index.jspa
| Generated on 2011-02-18T11:41:37
/
IS
/
Global array for skipping test cases. /
TYPE skip_tc_aat IS TABLE OF BOOLEAN INDEX BY VARCHAR2(32767);
Q##skip_tc_execution skip_tc_aat;
/
Global variable for quick test setting. /
Q##quick_test_only BOOLEAN DEFAULT FALSE;
/

The following statements rely on the nested table type “VWN_ENTW_WIECK”.Q##202459733_qnt.
This type will be created automatically prior to the run of your test.

The hash numbers below correspond to data sets as follows:

Q##310911868#NTE - ‘Q##COPY_471106548

Q##310911868#NTF - ‘Q##COPY_471106548
/
Q##310911868#NTE “VWN_ENTW_WIECK”.Q##202459733_qnt;
Q##310911868#NTF “VWN_ENTW_WIECK”.Q##202459733_qnt;
Q##310911868#FC PLS_INTEGER;
Q##310911868#EC PLS_INTEGER;
TYPE Q##310911868#DCT IS TABLE OF “VWN_ENTW_WIECK”.Q##202459733_qnt INDEX BY VARCHAR2(32767);
Q##310911868#DCN Q##310911868#DCT;
PROCEDURE Q##310911868#I;
PROCEDURE Q##310911868#GD/
KEY=310911868 - QUERY=‘Q##COPY_471106548/ (
variable_name_in in VARCHAR2
, data_in IN SYS_REFCURSOR
, collection_inout IN OUT “VWN_ENTW_WIECK”.Q##202459733_qnt
, count_out OUT PLS_INTEGER);
PROCEDURE qcto#assert_null (outcome_guid_in IN VARCHAR2,
is_null_in IN BOOLEAN, check_type_in IN VARCHAR2, raise_exc_in IN BOOLEAN := FALSE, add_to_message_in IN VARCHAR2 DEFAULT NULL );
PROCEDURE qcto#assert_null (outcome_guid_in IN VARCHAR2,
is_null_in IN BOOLEAN, check_type_in IN VARCHAR2, raise_exc_in IN BOOLEAN, add_to_message_in IN BOOLEAN);
PROCEDURE qcto#assert_this (outcome_guid_in IN VARCHAR2,
msg_in IN VARCHAR2, check_this_in IN BOOLEAN, null_ok_in IN BOOLEAN := FALSE, raise_exc_in IN BOOLEAN := FALSE);
PROCEDURE qcto#report_result (result_guid_in IN VARCHAR2,
status_in IN VARCHAR2, description_in IN VARCHAR2);
FUNCTION qcto#error_info RETURN VARCHAR2;
PROCEDURE Q##setup;
PROCEDURE Q##teardown;
PROCEDURE Q##P_SERIEN_AUFLOESEN;
/

Test cases defined for P_SERIEN_AUFLOESEN:

6er Serie ohne Buchstabenwechsel is active and will be run.
*/
END “Q##P_SERIEN_AUFLOESEN”;

/

Hope someone can help me!


#2

Katharina,

You write: " I modified the code, so that after creating the table the test should insert a few rows into the copy of the table."

Perhaps you could post that code here so we could take a look?

SF


#3

IS

PRAGMA AUTONOMOUS_TRANSACTION;

l_string VARCHAR2 (32767)

:= 'CREATE TABLE ’ || ‘Q##COPY_471106548

|| ’ ( “VWNAID”,“VWNAVWAKID”,“VWNAVWSEID”,“VWNAARBEITSGANG”,“VWNADTAENDERUNG”,“VWNADTAUSFUELLZB2”,“VWNAZTBEARBEITUNG”,“VWNAMERKMALBEARBEITUNG”,“VWNASTATUS”,“VWNAHINWEISEHER”,“VWNAZB2”,“VWNAFIN”,“VWNAPZFIN”,“VWNAHSN”,“VWNATSN”,“VWNAVVS”,“VWNAPZTYPVVS”,“VWNATXTFARBE”,“VWNACODEGRUNDFARBE”,“VWNACODEZWEITFARBE”,“VWNATXTMARKE”,“VWNATXTTYP”,“VWNATXTVARIANTE”,“VWNATXTVERSION”,“VWNATXTHANDELSBEZ”,“VWNATECHZULGESAMTMASSE”,“VWNAZULGESAMTMASSE”,“VWNAMASSEFAHRBEREITMIN”,“VWNAMASSEFAHRBEREITMAX”,“VWNASCHLUESSELFZKL”,“VWNAGENEHMIGUNGSNR”,“VWNADTGENEHMIGUNG”,“VWNAANZACHS”,“VWNAZULANHLASTGEBR”,“VWNAZULANHLASTUNGEBR”,“VWNAHUBRAUM”,“VWNANENNLEISTKW”,“VWNANENNLEISTUMDREHUNG”,“VWNALEISTUNGSGEWICHT”,“VWNASITZPLAETZE”,“VWNASTEHPLAETZE”,“VWNAHOECHSTGESCHW”,“VWNASTANDGERAEUSCH”,“VWNASTANDGERAEUSCHUMDREHUNG”,“VWNAFAHRGERAEUSCH”,“VWNAKOMBICO2”,“VWNATXTEMIKLASSE”,“VWNASCHLUESSELAUFBAU”,“VWNATECHZULACHSLASTACHSE1”,“VWNATECHZULACHSLASTACHSE2”,“VWNATECHZULACHSLASTACHSE3”,“VWNAZULACHSLAST1”,“VWNAZULACHSLAST2”,“VWNAZULACHSLAST3”,“VWNAANZANTRIEBSACHS”,“VWNASCHLUESSELKRAFTSTOFF”,“VWNARAUMINHALT”,“VWNASTUETZLAST”,“VWNASCHLUESSELEMIKLASSE”,“VWNABEREIFACHSE1”,“VWNABEREIFACHSE2”,“VWNABEREIFACHSE3”,“VWNALAENGEMIN”,“VWNALAENGEMAX”,“VWNABREITEMIN”,“VWNABREITEMAX”,“VWNAHOEHEMIN”,“VWNAHOEHEMAX”,“VWNABEMERKUNGENAUSNAHMEN”,“VWNABEIBLATT”,“VWNADTWVL”,“VWNAABLAGE” ) ’

|| ’ AS ’

|| 'SELECT “VWNAID”,“VWNAVWAKID”,“VWNAVWSEID”,“VWNAARBEITSGANG”,“VWNADTAENDERUNG”,“VWNADTAUSFUELLZB2”,“VWNAZTBEARBEITUNG”,“VWNAMERKMALBEARBEITUNG”,“VWNASTATUS”,“VWNAHINWEISEHER”,“VWNAZB2”,“VWNAFIN”,“VWNAPZFIN”,“VWNAHSN”,“VWNATSN”,“VWNAVVS”,“VWNAPZTYPVVS”,“VWNATXTFARBE”,“VWNACODEGRUNDFARBE”,“VWNACODEZWEITFARBE”,“VWNATXTMARKE”,“VWNATXTTYP”,“VWNATXTVARIANTE”,“VWNATXTVERSION”,“VWNATXTHANDELSBEZ”,“VWNATECHZULGESAMTMASSE”,“VWNAZULGESAMTMASSE”,“VWNAMASSEFAHRBEREITMIN”,“VWNAMASSEFAHRBEREITMAX”,“VWNASCHLUESSELFZKL”,“VWNAGENEHMIGUNGSNR”,“VWNADTGENEHMIGUNG”,“VWNAANZACHS”,“VWNAZULANHLASTGEBR”,“VWNAZULANHLASTUNGEBR”,“VWNAHUBRAUM”,“VWNANENNLEISTKW”,“VWNANENNLEISTUMDREHUNG”,“VWNALEISTUNGSGEWICHT”,“VWNASITZPLAETZE”,“VWNASTEHPLAETZE”,“VWNAHOECHSTGESCHW”,“VWNASTANDGERAEUSCH”,“VWNASTANDGERAEUSCHUMDREHUNG”,“VWNAFAHRGERAEUSCH”,“VWNAKOMBICO2”,“VWNATXTEMIKLASSE”,“VWNASCHLUESSELAUFBAU”,“VWNATECHZULACHSLASTACHSE1”,“VWNATECHZULACHSLASTACHSE2”,“VWNATECHZULACHSLASTACHSE3”,“VWNAZULACHSLAST1”,“VWNAZULACHSLAST2”,“VWNAZULACHSLAST3”,“VWNAANZANTRIEBSACHS”,“VWNASCHLUESSELKRAFTSTOFF”,“VWNARAUMINHALT”,“VWNASTUETZLAST”,“VWNASCHLUESSELEMIKLASSE”,“VWNABEREIFACHSE1”,“VWNABEREIFACHSE2”,“VWNABEREIFACHSE3”,“VWNALAENGEMIN”,“VWNALAENGEMAX”,“VWNABREITEMIN”,“VWNABREITEMAX”,“VWNAHOEHEMIN”,“VWNAHOEHEMAX”,“VWNABEMERKUNGENAUSNAHMEN”,“VWNABEIBLATT”,“VWNADTWVL”,“VWNAABLAGE” FROM ’

|| ‘VWNACHWEISE’;

BEGIN

EXECUTE IMMEDIATE l_string;

(VWNAID, VWNAVWAKID, VWNAVWSEID, VWNAARBEITSGANG, VWNAZTBEARBEITUNG, VWNAMERKMALBEARBEITUNG, VWNAZB2, VWNADTWVL)

Values

(655, 41, 121, 0,

(VWNAID, VWNAVWAKID, VWNAVWSEID, VWNAARBEITSGANG, VWNAZTBEARBEITUNG, VWNAMERKMALBEARBEITUNG, VWNAZB2, VWNADTWVL)

Values

(657, 41, 121, 0,

(VWNAID, VWNAVWAKID, VWNAVWSEID, VWNAARBEITSGANG, VWNAZTBEARBEITUNG, VWNAMERKMALBEARBEITUNG, VWNAZB2, VWNADTWVL)

Values

(659, 41, 121, 0,

(VWNAID, VWNAVWAKID, VWNAVWSEID, VWNAARBEITSGANG, VWNAZTBEARBEITUNG, VWNAMERKMALBEARBEITUNG, VWNAZB2, VWNADTWVL)

Values

(661, 41, 121, 0,

(VWNAID, VWNAVWAKID, VWNAVWSEID, VWNAARBEITSGANG, VWNAZTBEARBEITUNG, VWNAMERKMALBEARBEITUNG, VWNAZB2, VWNADTWVL)

Values

(663, 41, 121, 0,

(VWNAID, VWNAVWAKID, VWNAVWSEID, VWNAARBEITSGANG, VWNAZTBEARBEITUNG, VWNAMERKMALBEARBEITUNG, VWNAZB2, VWNADTWVL)

Values

(665, 41, 121, 0,

TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’), 1, ‘‘AA000010’’, TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’))’;

EXCEPTION

WHEN OTHERS

THEN

qcto#report_result (

qu_result_xp.current_outcome,

‘RUNTIME-ERROR’,

'Error attempting to create copy of ’

|| ‘Q##COPY_471106548

|| '. Error reported: ’

|| CHR (10)

|| qcto#error_info);

RAISE;

BEGIN

exec_drop ();

END;

Sure, I can do that (code is copied from database)

PROCEDURE exec_createEXECUTE IMMEDIATE ‘Insert into Q##COPY_471106548TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’), 1, ‘‘AA000005’’, TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’))’;EXECUTE IMMEDIATE ‘Insert into Q##COPY_471106548TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’), 1, ‘‘AA000006’’, TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’))’;EXECUTE IMMEDIATE ‘Insert into Q##COPY_471106548TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’), 1, ‘‘AA000007’’, TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’))’;EXECUTE IMMEDIATE ‘Insert into Q##COPY_471106548TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’), 1, ‘‘AA000008’’, TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’))’;EXECUTE IMMEDIATE ‘Insert into Q##COPY_471106548TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’), 1, ‘‘AA000009’’, TO_TIMESTAMP(’‘18.02.2011 10:05:49,000000’’,’‘DD.MM.YYYY HH24:MI:SS,FF’’))’;EXECUTE IMMEDIATE 'Insert into Q##COPY_471106548END exec_create;exec_create ();


#4

Thanks. OK, here’s the problem: this is an autonomous transaction, so when you execute inserts like that, you must issue a commit afterwards (at the bottom of the procedure).

SF