Vergelijkbaar met de aanpak van @Glenn, maar u kunt een bindvariabele declareren in SQL*Plus en deze gebruiken in een gewone SQL-query. Declareer het eerst met de var[iable]
commando:
variable comment_id number;
Stel het vervolgens in met de exec[ute]
commando, dat in wezen een anoniem blok is:
execute :comment_id := 3052753;
Voer vervolgens uw oorspronkelijke zoekopdracht uit met de :comment_id
referenties, en geen BEGIN
of 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);
Ik denk niet dat er veel functioneel verschil is tussen de twee benaderingen buiten persoonlijke voorkeur, en beide werken ook in SQL Developer (wanneer ze als een script worden uitgevoerd). Ik vind dit gemakkelijker bij het uitvoeren van SQL die is gekopieerd uit een Pro*C-bestand dat al de :
. gebruikt bind-formulier, puur omdat je de code helemaal niet hoeft te wijzigen.
Overigens kun je schrijven:
where r.revision_id = ( select content_item.get_latest_revision(:comment_id) from dual)
zonder de extra select
, als:
where r.revision_id = content_item.get_latest_revision(:comment_id)