Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie gibt man ein Resultset/Cursor aus einem anonymen Oracle PL/SQL-Block zurück, der Dynamic SQL ausführt?

Sie können eine PL/SQL-Funktion schreiben, um diesen Cursor zurückzugeben (oder Sie könnten diese Funktion in ein Paket packen, wenn Sie mehr diesbezüglichen Code haben):

CREATE OR REPLACE FUNCTION get_allitems
  RETURN SYS_REFCURSOR
AS
  my_cursor SYS_REFCURSOR;
BEGIN
  OPEN my_cursor FOR SELECT * FROM allitems;
  RETURN my_cursor;
END get_allitems;

Dies gibt den Cursor zurück.

Stellen Sie sicher, dass Sie nicht Ihren SELECT eingeben -String in PL/SQL wenn möglich in Anführungszeichen setzen. Es in Strings zu stecken bedeutet, dass es nicht zur Kompilierzeit überprüft werden kann und dass es geparst werden muss, wann immer Sie es verwenden.

Wenn Sie wirklich dynamisches SQL verwenden müssen, können Sie Ihre Abfrage in einfache Anführungszeichen setzen:

  OPEN my_cursor FOR 'SELECT * FROM allitems';

Diese Zeichenfolge muss bei jedem Aufruf der Funktion analysiert werden, was normalerweise langsamer ist und Fehler in Ihrer Abfrage bis zur Laufzeit verbirgt.

Stellen Sie sicher, dass Sie nach Möglichkeit Bind-Variablen verwenden, um harte Parsings zu vermeiden:

  OPEN my_cursor FOR 'SELECT * FROM allitems WHERE id = :id' USING my_id;