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

Verwenden von Bindungsvariablen in SQL Plus mit mehr als einer zurückgegebenen Zeile?

Ähnlich dem Ansatz von @Glenn, aber Sie können eine Bindungsvariable in SQL*Plus deklarieren und in einer einfachen SQL-Abfrage verwenden. Deklarieren Sie es zuerst mit dem var[iable] Befehl:

variable comment_id number;

Setzen Sie es dann mit dem exec[ute] Befehl, der im Wesentlichen ein anonymer Block ist:

execute :comment_id := 3052753;

Führen Sie dann Ihre ursprüngliche Abfrage mit :comment_id aus Referenzen und kein BEGIN oder END :

select e.label as doc_name,
                       e.url,
                       i.item_id,
                       'multi' as form_type
                from cr_items i, cr_extlinks e
                where i.parent_id = :comment_id
                and e.extlink_id = i.item_id
               UNION
                select null as doc_name,
                       utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(r.content, 2000, 1))  as url,
                       r.item_id,
                       'single' as form_type
                from cr_revisions r
                where r.revision_id = ( select content_item.get_latest_revision(:comment_id) from dual);

Ich glaube nicht, dass es über die persönlichen Vorlieben hinaus einen großen funktionalen Unterschied zwischen den beiden Ansätzen gibt, und beide funktionieren auch in SQL Developer (wenn sie als Skript ausgeführt werden). Ich finde das einfacher, wenn ich SQL aus einer Pro*C-Datei kopiert ausführe, die bereits den : verwendet Bindungsformular, nur weil Sie den Code überhaupt nicht ändern müssen.

Übrigens können Sie schreiben:

where r.revision_id = ( select content_item.get_latest_revision(:comment_id) from dual)

ohne das zusätzliche select , als:

where r.revision_id = content_item.get_latest_revision(:comment_id)