Parameter übergeben ?

Hallo zusammen,

ich habe es häufig, dass ich in meinen SQL-Codes die gleiche Anpassung an verschiedenen Stellen machen muss.
Super wäre es, wenn ich das einfach an einer Stelle im Code machen könnte und die Anpassung direkt an allen Stellen übernommen würde.
Das muss doch gehen!
Ich habe jetzt schon ziemlich rumprobiert, aber bis jetzt ohne Ergebnis :-(.


Hoffe ihr könnt mir helfen :slight_smile:
Yasemin

Via Stored Procedure?

Das habe ich befürchtet…
Leider habe ich hinsichtlich stored procedures null Erfahrung. Hatte gehofft, das wäre einfacher zu machen.
Danke!
Yasemin

Sorry, Du musst wesentlich detaillierter werden.

Hast Du verschiedene SQL Statements welche die gleiche Bedingung verwenden? Ist es ein großes SQL Statement mit wiederkehrenden Bedingungen?
Sind es SQL Statements in Deinem Programm? Wie führst Du die SQL Statements aus?

Was für “Anpassungen” sind das genau? Änderst Du Bedingungen? Vergleichswerte/Konstanten? Tabellen die ge-joined werden? Sortierungen? Funktionsaufrufe?

Zeig uns ein paar Beispiele und was Du dort ändern musst, andernfalls ist diese Frage nicht zu beantworten.

Ja, sorry :-), hab ich schon geahnt, dass ich zu ungenau bin.
Es handelt sich um einfache select-Statements über mehrere Tabellen. Diese Selects nutze ich semesterweise. Innerhalb des Selects gebe ich an für welches Semester ich die Abfrage machen möchte.
Da das Semester an verschiedenen Stellen erscheint, also (…) where Prüfungssemester = '20132 (…) beispielsweise und ich im nächsten Semester ja 20141 abfragen möchte, stelle ichmir das so vor, dass
ich an irgendeiner Stelle sagen kann welches Semester ich abfragen möchte und dann wird das an jeder Stelle eingefügt an der die Spalte Prüfungssemester angesprochen wird.

Hier ein Beispiel:

select sos.mtknr,stg.stg,k_stg.ktxt ,k_stg.fb,
abschl,stg.vert, sos.status,
staat,hzbkfzkz, hzbkfz, k_akfz.dtxt, erdteil
into table erg_natio
from sos,stg,k_stg, k_akfz
where sos.semester= ‘20141’
and stg.semester= ‘20141’
and sos.mtknr = stg.mtknr
and sos.mtknr < ‘900000’
and stg.hrst not in (‘G’, ‘A’,‘P’)
and sos.staat = k_akfz.akfz
and stg.stg = k_stg.stg and stgnr = ‘11’
and (sos.status<>‘X’ or (sos.status=‘X’ and exmdat>‘2014-06-03’))
;

Hier kommt jetzt das Semester nicht gerade oft vor, aber nur für die Vorgehensweise: Könnte ich jetzt einen Code voranstellen, so in der Art “nachfolgend sollst du für sos.semester = 20141 einsetzen”. Und ich müsste es nur an dieser einen Stelle sagen?

Yasemin

ich nutze übrigens pgAdmin III

Du solltest lieber explizite JOINs verwenden anstatt implizite.

In dem Beispiel lässt sich das Problem ganz einfach lösen indem Du das Semester in die Join Bedingung mit aufnimmst:

select ....
from sos
  join stg on sos.mtknr = stg.mtknr
  join k_stg on stg.stg = k_stg.stg and stg.semester = sos.semester --- << gleiches Semester in stg und sos 
  join k_akfz on sos.staat = k_akfz.akfz
where sos.semester= '20141' -- << die Konstante wird nur einmal verwendet
and sos.mtknr < '900000'
and stg.hrst not in ('G', 'A','P')
and stgnr = '11'
and (sos.status<>'X' or (sos.status='X' and exmdat>'2014-06-03'))

select … into ist übrigens eine veraltete, nicht-standard Syntax. Um eine neue Tabelle basierend auf einem SELECT zu erstellen solltest Du besser ein create table … as select … verwenden.

ich nutze übrigens pgAdmin III

Ich vermute mal das Semesterbeispiel ist nur eines von vielen. Variablen Ersetzung geht in “Plain SQL” nicht und wird daher immer vom SQL tool implementiert. Nachdem ich pgAdmin nicht verwende, kann ich Dir leider nicht sagen ob und wenn ja wie es dort gehen würde.

Wenn es immer um Werte für ein einzelnes Statement geht, dann könntest auch sowas wie das hier machen:

with constants (semester, mtknr) as  (
  values (2014,900000)
)
select ...
   .... hier kommt Dein orginal Statement....
..
and sos.mtknr < (select mtknr from constants)

Das WITH leitet eine “Common Table Expression” ein.
Details dazu gibt es im Handbuch: PostgreSQL: Documentation: 16: 7.8. WITH Queries (Common Table Expressions)

Und bitte vergleiche Zahlen mit Zahlen und Zeichenketten mit Zeichenketten ‘900000’ ist eine Zeichenfolge, keine Zahl. 900000 ist eine Zahl.
Details dazu gibt es im Handbuch: PostgreSQL: Documentation: 16: 4.1. Lexical Structure

Das gleiche gilt für ein Date oder Timestamp. Stabiler und portabler ist es hier ANSI Literals zu verwenden:
date ‘2014-06-03’ ist ein Datum. ‘2014-06-03’ ist eine Zeichenkette die implizit in ein Datum verwandelt wird.

Vielen lieben Dank!
Du hast mir sehr geholfen :-), Viele Grüße, Yasemin