Oracle
 sql >> Database >  >> RDS >> Oracle

Utilizzo di variabili di collegamento in SQL Plus con più di una riga restituita?

Simile all'approccio di @Glenn, ma puoi dichiarare una variabile di collegamento in SQL*Plus e usarla in una semplice query SQL. Prima dichiaralo con var[iable] comando:

variable comment_id number;

Quindi impostalo con exec[ute] comando, che è essenzialmente un blocco anonimo:

execute :comment_id := 3052753;

Quindi esegui la query originale con :comment_id riferimenti e nessun BEGIN o 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);

Non credo che ci sia molta differenza funzionale tra i due approcci al di là delle preferenze personali, ed entrambi funzionano anche in SQL Developer (se eseguiti come script). Lo trovo più facile quando si esegue SQL copiato da un file Pro*C che utilizza già il : modulo vincolante, semplicemente perché non devi modificare affatto il codice.

Per inciso, puoi scrivere:

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

senza l'extra select , come:

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