Zum Inhalt springen

PL/SQL Cursor mit Insert


SNOWMAN

Empfohlene Beiträge

Hi,

hab ne tabelle mit 15 Zeilen, diese sollen alle in ne andere Tabelle jeweils mit unterschiedlichen AutragIDs. Jetzt kollabier ich gleich an diesem ******* INSERT

Ich hab nun also den Cursor der mir die 8 Spalten per fetch in 8 Variablen speichert. Diese sollen nun per insert verarbeitet werden. dazu hab ich in 2 Büchern gelesen, des eine buch hält es dabei nicht nötig mit cursorvariablen zu arbeiten, nein es definiert sie einfach von vornherein fest, die daten...

des andere hält es nicht nötig eine gute erklöärung für insert zu schreiben, der befehl wird zwar in jedem beispiel verwendet, aber wirklich zu sagen wie es geht... pfff........

so, wie gehts nun?

cursor Auftrag_c is ...

insert into Kunde_Aufpos(AuftragsID,...) values 
(Auftrag_c.AuftragsID, ...) oder
insert into Kunde_Aufpos(AuftragsID,...) values (AuftragsID, ...)

beides hab ich gefunden... welches geht nun?

Test is leider nich drin da die tabellen auf der produktivmaschine laufen und ich als azubi da (noch) nich ran darf

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok, wie du willst ;)

Ich habst jetzt einfach mal so wie ich mein das es richtig ist:


VARIABLE startwert NUMBER

VARIABLE endwert NUMBER

VARIABLE counter NUMBER


EXECUTE :startwert := &Startwert

EXECUTE :endwert := &Endwert


DECLARE


CURSOR auftrag_c is

	Select rownum, '31' postyp, 'AD_DE' katalog, '0' bnegiert, '0' bnull, 'Admin=SQL' strfeld, 'XXX' stroperator,mlfb

	from(

		select distinct mlfb

		from artikel a, artikel_preis ap, artikel_map am 

		where a.intart_id = ap.intart_id

		and a.intart_id = am.intart_id

		and ap.preis > '0'

		and a.intbereich=1

		and a.reg='INT'

		and a.status='000'

		and a.loekz = 'N'

		and a.ka ='#'

		and ap.preisart='LP0'

		and ap.strfreg='DE'

		and ap.pmenge=1

		and am.intft_sysid=5

		and am.loekz != 'N'

	), kunde_auftrag;


rownum_v kunde_aufpos.posnr%TYPE;

postyp_v kunde_aufpos.postyp%TYPE;

katalog_v kunde_aufpos.ft_group_id_k%TYPE;

bnegiert_v kunde_aufpos.bnegiert%TYPE;

bnull_v kunde_aufpos.bnull%TYPE;

strfeld_v kunde_aufpos.strfeld%TYPE;

stroperator_v kunde_aufpos.stroperator%TYPE;

mlfb_v kunde_aufpos.strbedingung%TYPE;


BEGIN


OPEN auftrag_c;


counter := 0;


LOOP

	IF counter = 15

	THEN

	startwert := startwert + 1;

	counter := 0;

	END IF;	


	WHILE startwert <= enstwert	


	FETCH auftrag_c INTO rownum_v, postyp_v, katalog_v, bnegiert_v, bnull_v, strfeld_v, stroperator_v, mlfb_v;

	INSERT INTO kunde_aufpos

	(AUFTRAGSID, POSNR, POSTYP, FT_GROUP_ID_K, BNEGIERT, BNULL, STRFELD, STROPERATOR, STRBEDINGUNG)

	VALUES

	(startwert, rownum_v, postyp_v, katalog_v, bnegiert_v, bnull_v, strfeld_v, stroperator_v, mlfb_v);

	dbms_output.put_line

	('Dem Auftrag ' || startwert || ' wurde eine MLFB hinzugefügt.');

	counter :=counter + 1;


END LOOP;

--COMMIT;


EXCEPTIION

	WHEN TIMEOUT_ON_RESOURCE THEN

	dbms_output.put_line

	('Time-Out wärend des warten auf Ressourcen')


	WHEN VALUE_ERROR THEN

	dbms_output.put_line

	('Ein Value Error ist aufgetreten')


	WHEN INVALID_CURSOR THEN

	dbms_output.put_line

	('Es wurde versucht eine unerlaubte Cursorfunktion aus zu führen')


	WHEN OTHERS THEN

	dbms_output.put_line

	('Es ist ein unbekannter Fehler aufgetreten')

CLOSE auftrag_c;

END;

/

P.S. den ganzen schotter mit cursor und variablen und exceptions und so hab ich mir jetzt in 3 Tagen selber beigebracht *miraufdieschulterklopf*

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok, und welche fehlermeldung gibts beim kompilieren? oder ist das syntaktisch korrekt und er macht die inserts nur nicht richtig ?

Wenn er kompilierungsfehler hat entweder im Enterprise Manager schauen was er für Fehler wirft oder auf dem sqlplus prompt nach dem Kompileversuch

"show err" eingeben.

ups hab gerade erst gelesen das dus nicht testen kannst ? Gibts keine test umgebung ? oder hast du keinen Login wo du dir einfach mal die Tabellen als dummy anlegen kannst? gleiche struktur mit 20 rows dummy daten?

mfg

john

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Snowman!

Sorry, dass ich jetzt erst schreibe, war unterwegs...

Du brauchst zunächst im DECLARE-Teil eine zusätzliche Variable, z.B.

v_auftrag auftrag_c%rowtype;

In diese Variable musst du dann beim FETCH-Statement einlesen

FETCH auftrag_c INTO v_auftrag;

Jetzt kannst du auch auf die verschiedenen Felder zugrifen, die du beim Cursor angegeben hast, z.B.

INSERT INTO kunde_aufpos ( posnr, ... )

VALUES ( v_auftrag.rownum, ... );

Ich hoffe ich konnte Dir weiterhelfen!

Gruss, Axl

PS. Bei der Gelegenheit würde ich mir auch mal das Handling von Cursor in Verbindung mit FOR-Schleifen ansehen. Würde meines Erachtens bei deinem Programm ganz sinnvoll sein...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Thx Axl, hat funktioniert! Hat mir viel Kopfzerbrechen bereitet die aufgabe... aber etz ist geschafft und ich wurde ins Marketing verfrachtet ^^

@johnhaltonx: ne, aufs produktivsystem und Qualitätssystem hab ich zwar zugriff, darf da aber nur selects machen, is ja klar, wenn ich mist bau steht alles und da freut sich mr. kunde nicht ;)

und auf die testmaschine durft ich nich, weil da grad andere tests laufen und wenn ich die dann abschies wärs blöd weil die "anderen wichtigen" tests bereits seit 72 Stunden liefen ... was nach aussage vom kollegen schlecht sei weils nach 8 stunden fertig sein solle ... und deshalb is der wichtiger als meiner ? O_o

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...