2016-06-22 7 views
0

Hallo Ich habe ein Problem, das erfordert, dass ich eine Auswahl in verschiedenen Spalten, basierend auf einer Bedingung. Ich kann dies in einem gespeicherten Prozess mit einer unreinen IF ELSIF-Klausel erreichen, aber ich würde gerne wissen, wie dies am besten gelöst werden kann. Hier ist ein Beispiel, um es deutlicher:Oracle PL/SQL - der beste Weg, um basierend auf einer Bedingung eine Auswahl, eine Gruppierung, eine Reihenfolge, eine Where-Klausel für verschiedene Spalten zu treffen?

PROCEDURE notSoSmartSelect(type IN VARCHAR, a_filter IN VARCHAR 
      , b_filter IN VARCHAR, results OUT SYS_REFCURSER) IS 
BEGIN 
    IF type = 'A' THEN 
    OPEN results FOR 
     SELECT a, sum(val) v FROM sample_table 
     GROUP BY a, ORDER BY a; 
    ELSIF type = 'B' THEN 
    OPEN results FOR 
     SELECT b, a, sum(val) v FROM sample_table 
     WHERE a = a_filter 
     GROUP BY b, a, ORDER BY a, b; 
    ELSIF type = 'C' THEN 
    OPEN results FOR 
     SELECT c, b, a, sum(val) v FROM sample_table 
     WHERE a = a_filter AND b = b_filter 
     GROUP BY c, b, a, ORDER BY a, b, c; 
    END IF; 
END; 

Wie Sie bemerkt haben, in jedem Fall ist die verwendete Tabelle ist die gleiche, aber es gibt verschiedene Spalten verwendet werden, zu holen, Filter, Gruppen und Ordnung.

Der obige Code sieht ziemlich einfach aus, aber das eigentliche Problem hat viele Zweige und hat mehrere Wenn-sonst, was den Code sehr schmutzig macht. Gibt es eine elegante und saubere Art, sich diesem zu nähern? Vielleicht Dynamisches SQL? Aber ich kann nicht den besten Weg finden, um dynamische SQL dafür zu schreiben. Danke im Voraus.

Antwort

1

Ich halte das nicht für "unrein". Die Abfragen unterscheiden sich sehr voneinander, daher würde ich nicht versuchen, sie zu einer einzigen Anweisung zusammenzuführen.

Aber da sie so verschieden sind (verschiedene Spalten ausgewählt, verschiedene Aggregationsgruppen, verschiedene Where-Klauseln), warum sind sie alle in einem Verfahren? Ich würde diese drei Prozeduren machen, wenn überhaupt; wahrscheinlich eher drei Ansichten.

0

Dies ist viel klarer als der dynamische SQL-Ansatz, den Sie ausprobieren möchten. Wie bereits erwähnt, Sie haben viele IF ELSE-Filialen, es wäre sehr mühsam, so viele und viele Bedingungen zu konstruieren.

Meiner Meinung nach Ihre refcursor wird von jedem Front-End-Anwendung wie JAVA verwendet, so ist es besser, die gesamte Ausgabe zurück und dann tun alle Manipulationen von diesem Ende.

+0

Ich würde es lieber so machen, aber leider gibt es etwa eine halbe Million Datensätze ... und es dauert zu lange, um so viele auf einmal aus der Datenbank zu holen, während die Abfragen mit der Where-Klausel nur etwa 60 Datensätze zurückgeben . – Ocelot

+0

Dann ist das leider der einzige Ansatz, über den ich nachdenken könnte –