Warum geht das nicht!?

curtiss

Grünschnabel
Hi, hab folgendes Prob:
Ich entwickle öfters Stored Procedures und da werden die abfragen immer zusammgestellt und mit parametern gefüllt bis sie letztendlich ausgeführt werden.
Nun denn, wenn diese Query bei aufruf der procedure ausgeführt wird und sie fehlerhaft ist, ist die abfrage verloren und man kann in den strings suchen wo wohl ein fehler seien könnte.
Das is suboptimal und deswegen habe ich eine Procedure geschrieben, welche die abfrage eben abspeichert und man im nachhineien mit einem kleinen tool bequem abfragen kann. Unter Oracle läuft das alles super nur unter MS SQL gibst probleme.
Code:
CREATE TABLE mtemp.msp_savequery(
StoredProcID int,
LfdNr int,
Query VARCHAR(4000)
);

if exists (select name from sysobjects
            where name = N'MSP_SAVEQUERY2'
              and type = 'P')
  drop procedure MTEMP.MSP_SAVEQUERY2
go
CREATE PROCEDURE mtemp.MSP_SAVEQUERY2(
@StoredProcID int,
@query varchar)
AS
begin
 declare
 @v_x int,
 @v_lfdnr int,
 @errorCommand varchar(200)

 set @v_x = 1
 set @v_lfdnr = 0

-- Rollback 
-- BEGIN TRANSACTION
 WHILE @v_x < Len(@query)
 begin  
  INSERT INTO mtemp.msp_savequery VALUES(
              @StoredProcId,
              @v_lfdnr,
              substring(@query,@v_x,4000)
              );
  set @v_x = @v_x+4000;
  set @v_lfdnr = @v_LfdNr +1;
 END
 COMMIT   

 print '>>>>>  Query gespeichert  <<<<<<'

 set @errorCommand = 'Select id from Nothing'
 exec @errorCommand 
END

Zur Funktionsweise:
Normalerweise wird ein Rollback ausgeführt womit alle möglichen änderungen der aufrufenden procedure rückgängig gemacht wird.
Die schleife trennt die query wieder in 4000er blöcke zum abspeichern.
Dann ein Commit damit die Abfrage auch gespeichert bleibt.
Dann ein Provozierter Fehler damit der ganze Aufruf abbricht.

Nun zum Problem: Das Rollback will er nicht nehmen ohne vorher ein begin transaction zu haben. Das gibst aber ja nich. Kommentier ich es aus und will nur ein commit machen kriege ich die meldung ich sollte ein begin transaction haben. Gut, wenn das auskommentiert ist und ich rufe die methode auf kommt folgende meldung:
">>>>> Query gespeichert <<<<<<
Server: Nachr.-Nr. 2812, Schweregrad 16, Status 62, Zeile 30
Die gespeicherte Prozedur Select id from Nothing konnte nicht gefunden werden."

Also angeblich beim while... Das Commit bringt aber garnichts, denn in der Tabelle steht nüscht!

Wie gesagt, unter Oracle läuft der kram. Hoffentlich kann jemand was mit meiner beschreibung anfangen und mir helfen...
 
Hi

Also was du mit dem Rollback vor der Transaktion vor hast, versteh ich nicht.
Das Rollback dient dazu eine Transaktion (die vorher gestartet wurde) zurückzufahren, wenn z.B. ein Fehler aufgetreten ist.
 
und genau das habe ich ja auch vor! Wie gesagt, damit zuvor vollzogene Änderungn nicht dauerhaft gespeichert werden!

Deswegen soll durch das Rollback die Transaktion welche die Methode savequery aufruft alle änderungen rückgängig gemacht werden.
 
Du hast doch aber vorher gar keine Änderungen gemacht.
Du kannst nur Änderungen rückgängig machen, die du zuvor auch macht hast UND in der gleichen Transaktion stattgefunden haben. Diese öffnest du jedoch erst danach öffnest
 
Zurück