sql statements auslagern

kirilb

Benutzer
Beiträge
14
Hallo, ich will ein "case when" statement, das in diversen Abfragen vorkommt in ein Feld einer dedizierter Tabelle auslagern. Dieses Feld will ich dann anhängen und nur das kurze Feld ausgeben und nicht den langen "case when". Momentan wird der Inhalt des Feldes als ganzen Text ohne Funktion interpretiert und nicht als "case when". Wie kann ich das Feld wieder entcodieren sozusagen?
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Hi,

du willst also eine Abfrage dieser Art »statisch« machen?
Code:
SELECT *,
CASE
  WHEN kirilb.tagnr = 1 THEN 'Montag'
  WHEN kirilb.tagnr = 2 THEN 'Dienstag'
  WHEN kirilb.tagnr = 3 THEN 'Mittwoch'
  WHEN kirilb.tagnr = 4 THEN 'Donnerstag'
  WHEN kirilb.tagnr = 5 THEN 'Freitag'
  WHEN kirilb.tagnr = 6 THEN 'Samstag'
  WHEN kirilb.tagnr = 7 THEN 'Sonntag'
END AS tagname
FROM kirilb

Dann erzeuge einfach eine VIEW die du dann direkt abfragen kannst:
Code:
CREATE VIEW kirilbv AS
SELECT *,
CASE …

Code:
SELECT *
FROM kirilbv

Als Alternative kannst du auch mit INSERT und UPDATE Triggern arbeiten. Allerdings solltest du keine berechenbaren Werte direkt in der Datenbank speichern. Deshalb erwähne ich die Trigger-Methode nur ohne näher darauf einzugehen.

Gruß
Hony
 
Hallo Hony, danke für die schnelle Antwort! Hier mein Beispiel:
in der externen Tabelle steht das "case when.." statement und in der Haupttabelle will ich das so verwenden:
SELECT
Haupttabelle.field1 usw,
ExterneTabelle.CaseWhenStatement
FROM Haupttabelle
LEFT OUTER JOIN ExterneTabelle
ON Date = Date​
Würde das so gehen? Leider darf ich keine Schreibrechte auf der DB, d.h. Views und Inserts würden nicht gehen.
 
Würde das so gehen?
In der Form sicher nicht. Aus gutem Grund wird SQL-Code der in der Tabelle gespeichert ist nicht wahllos ausgeführt. Das wäre nämlich ein gewaltiges Sicherheitsproblem.

Ich habe leider keine Oracle-DB um das zu testen und kenne auch auch nicht die systemspezifischen Funktionen. Möglicherweise ist aber
EXECUTE IMMEDIATE was du suchst.
 
Alternativ könntest du eine FUNCTION oder eine SP mit Rückgabewert nutzen, ich kenne das allerdings nur unter MSSQL, ich denke bei Oracle wird das auch gehen.
 
Ich würde ja gerne helfen... Allerdings verstehe ich die Fragestellung nicht. Inwiefern willst du das case when auslagern ? Einfach nur damit du es nicht immer bei einem SQL-Statement schreiben musst ?
Wenn ja... Nimm einfach eine Function:
Code:
Create Or Replace Function beispiel(parameter1 Number) Return Varchar2 Is
   v_result Varchar2(10);
Begin
   v_result := Case
                  When parameter1 = 1 Then 'Montag'
                  When parameter1 = 2 Then 'Dienstag'
                  When parameter1 = 3 Then 'Mittwoch'
                  When parameter1 = 4 Then 'Donnerstag'
                  When parameter1 = 5 Then 'Freitag'
                  When parameter1 = 6 Then 'Samstag'
                  When parameter1 = 7 Then 'Sonntag'
               End;
   Return v_result;
End;
 
Function zu benutzen ist die Lösung des einen Problems, das andere Problem ist das: die Definition dieses "case" soll z.B. monatlich geändert werden könen. Dadurch, dass es in einem dedizierten DB-Feld ist, ist es eine Art ausgelagert und nicht hardcoded im SQL-Script selbst. Damit ist das Hauptscript und die Bedingung (das "case" Statement) getrennt voneinander. Die Anpassung des "case"-Statements soll auch eine nicht IT-Person machen können. Die Frage ist: wie bewerkstelligt man diese Trennung?
 
Der Berechtigungs/Rollen-Aspekt existiert zweifelsohne. Aber mein Augenmerk ist hier beim technischen Problem:
Die nicht IT-Person lädt die angepasste Regel hoch und zwar in diese dedizierte Tabelle, in der pro Regel ("case" Statement) jeweils ein Feld existiert. Und diese Regeln werden dann im Hauptscript verarbeitet, weil sie in SQL Syntax verfasst sind. Die Regel ändert sich regelmässig, die Struktur des Hauptscripts dagegen ist stabil. Daher dieser Split: die Anwender sollen unabhängiger von der IT werden.
 
Dazu müßtest Du das, was in der Tabelle als TEXT steht, dann via EXECUTE ausführen. Geht, ist aber ein enormes Sicherheitsrisiko.

Wie das im Detail in Oraggle geht weiß ich nicht, in PG könnte ich es Dir zeigen.
 
Werbung:
Und ich sage es nochmal: Totaler Schwachsinn...
Installier ihm doch einfach SQL*Plus und gib ihm das Hauptskript... Dann kann er das selbst...

Edit:
Ist genauso ne Schwachsinnige Idee... Aber wenigstens etwas Anwenderfreundlich
 
Zurück
Oben