Copying sources and texts (also in parts) for publishing without our permission is NOT ALLOWED. We are fed up with finding our work on other sites (like stackoverflow).
Das Kopieren von Quellcode und Texten (auch in Auszügen) ist nicht erlaubt. Wir haben es gründlich satt, unsere Arbeit auf anderen Webseiten zu finden.

Copying for non-public usage is allowed.           Das private Kopieren und Benutzen ist natürlich erlaubt und erwünscht.
07. Jul 2009
Teaser

Oracle: Stored Procedures mit dynamischen SQL Befehlen

Um innerhalb einer “Stored Procedure” oder “Function” in Oracle Parameter in eine SQL Abfrage einzubauen, können Sie folgendes Beispiel als Vorlage nutzen:

CREATE OR REPLACE PROCEDURE SP_TESTS (in_condition IN VARCHAR2)
IS
  ret_value number;
  Ssql varchar2(4000);
BEGIN
  DBMS_OUTPUT.PUT_LINE('Start ...');

  -- Prüfen, ob eine Bedingung übergeben wurde
  -- Fall nicht, where mit "1=1" ergänzen lassen
  if (in_condition is null OR LENGTH(in_condition) = 0) then
    condition := ' 1=1 ';
  else
    condition := in_condition;
  end if;

  -- SQL Query zusammensetzen
  Ssql := 'SELECT id FROM demo WHERE ' || condition || ' ORDER by 1';

  -- SQL Query anzeigen
  DBMS_OUTPUT.PUT_LINE('SQL Query: ' || Ssql);

  -- Den zusammengebauten SQL Befehl ausführen lassen 
  execute immediate Ssql into ret_value;

  -- Ergebnis anzeigen
  DBMS_OUTPUT.PUT_LINE('Ergebnis: ' || ret_value|| '%');
END;

Das Script erkennt nach dem Start automatisch, ob eine WHERE Bedingung als Parameter übergeben wurde. Fehlt diese, würde der fehlerhaft SQL so aussehen:

SELECT id FROM demo WHERE ORDER by 1

Dadurch würde ein Fehler ausgelöst werden. Durch die Ergänzung mit “1 = 1” wird der SQL Befehl wieder gültig und kann fehlerfrei ausgefürt werden:

SELECT id FROM demo WHERE 1 = 1 ORDER by 1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

neunzehn + 18 =