Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

PL/SQL Cursor mit Insert

Empfohlene Antworten

Veröffentlicht

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

@snowman

Poste doch am besten mal dein komplettes Statement, irgendwie werd ich aus dem bisherigen nicht schlau...

Gruss, Axl

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*

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

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...

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.