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

Bruger du bindevariabler i SQL Plus med mere end én række returneret?

Svarende til @Glenns tilgang, men du kan erklære en bind-variabel i SQL*Plus og bruge den i en almindelig SQL-forespørgsel. Erklær det først med var[iable] kommando:

variable comment_id number;

Indstil den derefter med exec[ute] kommando, som i det væsentlige er en anonym blok:

execute :comment_id := 3052753;

Kør derefter din oprindelige forespørgsel med :comment_id referencer og ingen BEGIN eller 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);

Jeg tror ikke, der er meget funktionel forskel mellem de to tilgange ud over personlige præferencer, og begge fungerer også i SQL Developer (når de køres som et script). Jeg finder det nemmere, når jeg kører SQL kopieret fra en Pro*C-fil, som allerede bruger : bind form, udelukkende fordi du ikke behøver at ændre koden overhovedet.

Du kan i øvrigt skrive:

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

uden den ekstra select , som:

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


  1. Overtrædelse af integritetsbegrænsning:1048 Kolonnen "taggable_id" kan ikke være null

  2. Sådan får du vist transaktionslogfiler i SQL Server 2008

  3. Flere forespørgsler afhængige af hinanden

  4. Deaktiver root-login i phpMyAdmin