PL/SQL,Oracle8 Funktionen erstellen!?

Hy!
Ich habe folgendes Problem. Ich habe mehrere Abfragen geschrieben die ich für eine Umsatzliste brauche, diese sind nach Lieferant bzw. Artikel sortiert. Diese Scripte werden dann zu einer ganzen Liste zusammengeführt. Jetzt habe ich aber folgendes Problem: Ich brauche eine Funktion oder Ähnliches. Es geht darum das der zuständige Sachbearbeiter den Monat in ein Programm eingibt für den er die Umsatzliste braucht und die Funktion soll die richtige Liste(also nach Monat) ausgeben. Wenn er den Monat 11 eingibt soll also die Umsatzliste für den November ausgegeben werden. Ich hoffe ihr könnt mir helfen! Danke schonmal im Voraus!

Hier ist noch eine meiner Abfragen:

select a.arnr, a.arbe, b.lief, b.me11 as VK_Menge_Nov, b.vk11 as Umsatz_Nov, c.effb as Lagerbestand, b.meges as VK_Menge_Jahr, b.vkges as Umsatz_Jahr, b.gsart, c.lanr, b.jahr
from t051art a, t158arst b, t075lag c
where a.manr=1
AND a.manr=b.manr(+)
AND b.manr=c.manr(+)
AND a.arnr=b.arnr(+)
AND b.arnr=c.arnr(+)
AND b.lanr=c.lanr(+)
AND a.krnr=b.lief(+)
AND a.krnr(+)=‚84036‘
AND NOT b.lief(+)=‚72048‘
AND NOT b.lief(+)=‚72049‘
AND NOT b.gsart(+)=’ ’
AND b.jahr(+)=‚2006‘
order by a.arnr

Hallo SqlER,

verstehe ich dein Problem insoferne richtig, als es daher kommt, dass du deine Umsätze usw. in je einer Tabellenspalte für jedes Monat ablegst, und daher für verschiedene Monate verschiedene Queries benötigst?
Wenn ja, dann würde ich das Datenmodell entsprechend anpassen, dann ist der Wert, den der User eingibt einfach nur noch ein Parameter in der Where-Bedingung, und das sollte ja einfach sein.

Gruß
Martin

P.S.: Wenn ich tatsächlich recht habe, dann hast du mit hoher Wahrscheinlichkeit ein ziemlich grausames Datenmodell.

Hallo TheBeast!
Bei uns im Betrieb gab es bisher immer eine seperate Umsatzliste für jeden Monat, die per Hand bearbeitet wurde. Es gab mehrere Spalten, einmal die Umsätze der Artikel für den laufenden Monat und daneben dann noch die Umsätze für das Laufende Jahr. Und so sollte ich es eigentlich übernehmen, mein Ausbilder meinte das er es so haben will das der jeweilige Sachbearbeiter einfach nur den Monat in eine Maske(nicht PL/SQL) eingeben muß so das er dann wie gesagt die laufende Monats-Umsatzliste zurückbekommt.Ich solle es so anpassen das SQL die jeweiligen Eingaben des Sachbearbeiters auch richtig zurückgibt, das heisst Eingabe=11 = Umsatzliste November, Eingabe=12 = Umsatzliste Dezember. Sorry wenn ich es nicht besser erklären kann, ich bin auch leider kein SQL-Profi, nur ein kleiner Azubi :smile:

Ich gehe mal davon aus das du recht hast, ich habe jetzt um die 15 Scripte die ich dann noch alle zu einer Liste zusammenfügen muss :-/

Gruß
Oliver

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

Hi,
ich verstehe leider nicht ganz wo dein Problem liegt, daher gebe ich dir drei Antwort Varianten, in der Hoffnung das wenigstens eine hilft.

Variante a
Annahme: dein Problem liegt darin, dass du nicht weisst wie du eine Funktion schreibst.

Die Syntax:

[CREATE [OR REPLACE] ] 
FUNCTION function\_name [( parameter [ , parameter]... ) ] RETURN 
datatype 
 [AUTHID { DEFINER | CURRENT\_USER }] 
 [ PARALLEL\_ENABLE 
 [{ [CLUSTER parameter BY (column\_name [, column\_name]... ) ] | 
 [ORDER parameter BY (column\_name [, column\_name]... ) ] } ] 
 [ ( PARTITION parameter BY
 { [{RANGE | HASH } (column\_name [, column\_name]...)] | ANY } 
) ] 
 ] 
 [DETERMINISTIC] [PIPELINED [ USING implementation\_type] ] 
 [AGGREGATE [UPDATE VALUE] [WITH EXTERNAL CONTEXT] 
USING implementation\_type ] {IS | AS} 
 [PRAGMA AUTONOMOUS\_TRANSACTION;] 
 [local declarations] 
BEGIN 
 executable statements 
[ EXCEPTION 
 exception handlers ] 
END [name]; 

Das Beispiel

FUNCTION sal\_ok (salary REAL, title VARCHAR2) RETURN BOOLEAN IS
 min\_sal REAL;
 max\_sal REAL;
BEGIN
 SELECT losal, hisal INTO min\_sal, max\_sal FROM sals
 WHERE job = title;
 RETURN (salary \>= min\_sal) AND (salary 

Die Doku:
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/08\_subs.htm#657

Variante b
Auf Grund eines verkorksten Datenmodells brauchst du 15 verschiedene Selectstatements, je nachdem welcher Monat eingegeben wird (da wir nur 12 Monate haben vermutlich nicht passend, aber seis drum)

Antwort 1
Du baust für jedes der Selectstatements eine Funktion und wählst per if then else die passende aus.

Doku:
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/04\_struc.htm#514

Antwort 2
Je nachdem wie unterschiedlich deine statements sind, kannst du sie dir vielleicht auch dynamisch zusammenbauen:
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/13\_elems18.htm#33889

Variante c
Du kennst den ganzen Kram den ich bisher geschrieben hab, fühlst dich leicht verarscht und willst eigentlich wissen wie du das Ergebnis deines Selects zurückgeben kannst.

Entweder per Ref Cursor
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/13\_elems13.htm#33512

oder in Collections
http://download-uk.oracle.com/docs/cd/B10501\_01/appdev.920/a96624/13\_elems8.htm#33101


Ich merke gerade .. du hast Oracle 8 .. müsste dort eigentlich alles sehr ähnlich sein, aber du solltest die Begriffe sicherheitshalber in der passenden Doku Version noch man nachschlagen.

Jens

Hi,

wenn ich Dich richtig verstanden hab´, ist das hier sowas was Du haben willst:

CREATE OR REPLACE
FUNCTION f_umsatz(
p_datum IN DATE DEFAULT SYSDATE
)

RETURN VARCHAR2 IS

v_return VARCHAR2(4000):=’’;

CURSOR cur_ums IS
SELECT a.arnr
,a.arbe
,b.lief
,b.me11 as VK_Menge_monat
,b.vk11 as Umsatz_monat
,c.effb as Lagerbestand
,b.meges as VK_Menge
,b.vkges as Umsatz
,b.gsart
,c.lanr
,b.jahr
FROM t051art a
,t158arst b
,t075lag c
WHERE a.manr=1
AND a.manr=b.manr(+)
AND b.manr=c.manr(+)
AND a.arnr=b.arnr(+)
AND b.arnr=c.arnr(+)
AND b.lanr=c.lanr(+)
AND a.krnr=b.lief(+)
AND a.krnr(+)=‚84036‘
AND NOT b.lief(+)=‚72048‘
AND NOT b.lief(+)=‚72049‘
AND NOT b.gsart(+)=’ ’
AND b.jahr(+)= TO_CHAR(p_datum,‚yyyy‘)
ORDER BY a.arnr;
rec_ums cur_ums%ROWTYPE;

BEGIN
FOR rec_ums IN cur_ums LOOP
v_return :=(rec_ums.arnr||’;’||
rec_ums.arbe||’;’||
rec_ums.lief||’;’||
rec_ums.VK_Menge_monat||’;’||
rec_ums.Umsatz_monat||’;’||
rec_ums.Lagerbestand||’;’||
rec_ums.VK_Menge||’;’||
rec_ums.Umsatz||’;’||
rec_ums.gsart||’;’||
rec_ums.lanr||’;’||
rec_ums.jahr||’;’);
END LOOP;

RETURN v_return ;

EXCEPTION
WHEN OTHERS THEN
RETURN SQLCODE||’ Fehler aufgetreten! '||SQLERRM ;
END;
/