Variablen auslesen (PL/SQL)

Ich habe in meiner Vaiable mehrere Einträge aus einer Tabelle stehen:
Beispiel:

Variablenname := ‚select name, nachname, telefon from schueler‘;

Nun möchte ich aus dieser Variable nur den Namen und die Telefonnummer haben und diese beiden Werte in eine Tabelle z.B „Info“ schreiben.
Hoffe ihr könnt mir helfen :smile:

Hi,

wenn ich dich richtig verstehe so:

SELECT name||' '||telefonnummer
INTO Variablenname
FROM Schueler
WHERE .... ; 

INSERT INTO info VALUES
(variablenname); 

Natürlich funktioniert dies nur, wenn beide Datenfelder zusammengefasst werden sollen.

Wenn man in „INFO“ 2 Felder hat kann man das auch anders machen; am besten eignet sich wohl ein Cursor, welcher die Daten aus „Schueler“ nimmt und dann je Schueler-Datensatz einen in die Tabelle „Info“ schreibt.

Könnte so aussehen:

DECLARE 

CURSOR cur\_schueler IS 
SELECT \*
FROM schueler; 

BEGIN
FOR rec\_schueler IN cur\_schueler LOOP 
 INSERT INTO info(
 telefonnummer
 ,name)
 VALUES 
 (rec\_schueler.telefonnummer
 ,rec\_schueler.name); 
END LOOP; 
COMMIT; 
EXCEPTION
 WHEN others THEN
 DBMS\_OUTPUT.Put\_Line(SUBSTR(SQLERRM,1,255));
 DBMS\_OUTPUT.Put\_Line(SUBSTR(SQLCODE,1,255));
 ROLLBACK; 
 DBMS\_OUTPUT.Put\_Line(SUBSTR('Rollback durchgeführt',1,255));
END; 

Gruß
Andreas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ja das trifft es schon sehr gut aber ich hab glaub ich eine einfachere Lösung gefunden.
Vielleicht kann mir ja jemand sagen wie ich einen Wert z.B. 30 der in der Variablen „preis“ steht welche aber als Varchar deklariert ist in einen „number“ Wert umkonvertieren kann?
Um die Frage vorweg zu nehmen, ich musste die Zahl 30 als Varchar in die Variable preis schreiben aber das hatte eine anderen Grund.
Wollte nun mit to_number die variable in der die 30 steht umwandeln aber das geht leider nicht…

Diese Sachen habe ich schon versucht:

preis := 'select * from var_preis to_number(4,2);

preis := to_number(var_preis,4,2)

Möchte also nur den Wert der in der Variablen var_preis steht in preis geschrieben haben aber eben als number. Warum das ganze, da ich mehrer Preise in var_preis stehen habe und ich diese zusammen zu einem Endpreis berechnen möchte. Das geht ja soweit ich weiß mit varchar nicht oder?

Hi!

Zuerst wäre es nicht schlecht, sich mal grundsätzlich in SQL und PL/SQL einzulesen, ein paar einfache Übungen zu machen, etc.

preis := 'select * from var_preis to_number(4,2);

preis := to_number(var_preis,4,2)

Versuch mal ein „select to_number(var_preis,‚90,00‘) into preis from TABELLE“ (das „90,00“ ist nur die Formatierung: 9 für Zahl, 0 dafür, das auch Nullen dargestellt werden.

Grüße,
Tomh

Moin,

auch ich hab´ hin- und wieder das Problem, Zeichen in Zahlen umzuwandeln. Daher bietet es sich also an, eine kleine Funktion zu schreiben, die dies übernimmt. Erstmal ein Versuchsaufbau:

CREATE TABLE konvert(
 kon\_zahl VARCHAR2(10)); 
 
INSERT INTO konvert VALUES 
(LPAD('10',10,' ')); 

INSERT INTO konvert VALUES 
(LPAD('1.1',10,' ')); 

INSERT INTO konvert VALUES
(RPAD('7',10,' ')); 

INSERT INTO konvert VALUES 
(RPAD('3.3',10,' ')); 

INSERT INTO konvert VALUES 
(RPAD('2,7',10,' ')); 

INSERT INTO konvert VALUES 
(LPAD('4,9',10,' ')); 

INSERT INTO konvert VALUES 
('15'); 

INSERT INTO konvert VALUES 
('1,7'); 

INSERT INTO konvert VALUES 
('6.5'); 

INSERT INTO konvert VALUES 
('6.500,00'); 

INSERT INTO konvert VALUES 
(' 4,325.17 '); 

INSERT INTO konvert VALUES 
(' 6.500,00 '); 

INSERT INTO konvert VALUES 
(' 5.500 '); 

Nun die Funktion:

CREATE OR REPLACE 
FUNCTION f\_to\_number(
 p\_text IN VARCHAR2 -- eingehender Textstring
,p\_return IN NUMBER DEFAULT -1 -- Rückgabewert bei Fehler
)
 RETURN NUMBER IS

v\_wert VARCHAR2(100) :=0;
v\_format VARCHAR2(1) :='';

BEGIN 
v\_wert := TRIM(p\_text);

/\* feststellen, ob dt. oder amerik. Format \*/
IF TRIM(TO\_CHAR(1001,'9G990D00')) = '1,001.00' THEN
 v\_format := 'A'; -- amerikanisches Format
ELSIF TRIM(TO\_CHAR(1001,'9G990D00')) = '1.001,00' THEN
 v\_format := 'D'; -- deutsches Format
ELSE DBMS\_OUTPUT.Put\_Line(SUBSTR('Format nicht erkannt:'|| TO\_CHAR(1001,'9G990D09') ,1,255));
END IF;
/\* -- auf Nachkommastellen prüfen -- \*/
IF v\_format = 'D' THEN
 IF v\_wert LIKE '%.\_\_' OR v\_wert LIKE '%.\_' THEN
 v\_wert := REPLACE(v\_wert,',',''); -- erst die 1,000´er Trennzeichen entfernen sofern vorhanden
 v\_wert := REPLACE(v\_wert,'.',','); -- nun den Dezimalpunkt durch Komma ersetzen
 ELSIF v\_wert LIKE '%,\_\_' OR v\_wert LIKE '%,\_' THEN
 v\_wert := REPLACE(v\_wert,'.',''); -- erst die 1.000´er Trennzeichen entfernen sofern vorhanden
 ELSIF v\_wert LIKE '%,\_\_\_' THEN
 v\_wert := REPLACE(v\_wert,',','');
 ELSIF v\_wert LIKE '%.\_\_\_' THEN
 v\_wert := REPLACE(v\_wert,'.','');
 END IF;

ELSIF v\_format = 'A' THEN
 IF v\_wert LIKE '%,\_\_' OR v\_wert LIKE '%,\_' THEN
 v\_wert := REPLACE(v\_wert,'.',''); -- erst die 1.000´er Trennzeichen entfernen sofern vorhanden
 v\_wert := REPLACE(v\_wert,',','.'); -- nun den Dezimalpunkt durch Komma ersetzen
 ELSIF v\_wert LIKE '%.\_\_' OR v\_wert LIKE '%.\_' THEN
 v\_wert := REPLACE(v\_wert,',',''); -- erst die 1,000´er Trennzeichen entfernen sofern vorhanden
 ELSIF v\_wert LIKE '%.\_\_\_' THEN
 v\_wert := REPLACE(v\_wert,'.','');
 ELSIF v\_wert LIKE '%,\_\_\_' THEN
 v\_wert := REPLACE(v\_wert,'.','');
 END IF;
END IF;

RETURN TO\_NUMBER(v\_wert);

EXCEPTION
 WHEN others THEN
 DBMS\_OUTPUT.Put\_Line(SUBSTR(SQLCODE||' - '||SQLERRM,1,255));
 DBMS\_OUTPUT.Put\_Line(SUBSTR('Eingangstext: '||p\_text||' Konvertiert bis Fehler: '||v\_wert,1,255));
 DBMS\_OUTPUT.Put\_Line(SUBSTR(v\_format ,1,255));
 RETURN p\_return;
END;
/

Sollten einem Fehler auffallen oder noch gute Ideen haben, wäre ich für eine kleine Rückmeldung dankbar.

Gruß
Andreas