Der Declare ist nur einmal erforderlich und wird zur Compile-Zeit aufgelöst.
Zur Laufzeit hast du Recht, dass jedesmal per Open/Fetch/Close die Daten gelesen werden müssen.

Wenn du sicher bist, dass die Schlüssel genau einen Satz liefern kannst du das mit

select * into :MyDS
where ...

erreichen. Ein Cursor wird dann nicht benötigt.
Den Order By benötigst du nicht, da du ja nur einen Satz bekommst.