sql >> Database >  >> RDS >> Oracle

Op voorwaarden gebaseerde spoolgeneratie in Oracle SQL-script

Als u deze controlerende sectie in zijn eigen script kunt plaatsen, b.v. elcm_ctl.sql , zou je dat kunnen maken:

accept run_it char format a1 prompt "Run the script?"

set termout off

whenever sqlerror exit success rollback
exec if upper(nvl('&run_it', 'N')) != 'Y' then raise no_data_needed; end if;
whenever sqlerror continue

spool c:\elcm.sql
select 'select sysdate from dual;' from dual;
spool off

set termout on

spool c:\elcm_details.spl
@c:\elcm.sql
spool off

De accepteren commando is naar mijn mening een beetje netter dan te vertrouwen op vervangingsprompts en is enigszins zelfdocumenterend. Dit vraagt ​​de gebruiker om de gespecificeerde string, in plaats van alleen 'gen' . (In SQL*Plus kun je dit uitbreiden en de gebruiker dwingen een enkel teken in te voeren, opnieuw vragen als ze iets langer invoeren; en standaard 'N' als ze gewoon op return drukken zonder iets in te voeren. Maar SQL Developer ondersteunt alleen een subset van de functionaliteit).

Dan genereert een klein anoniem blok een uitzondering - maakt niet echt uit welke - als de ingevoerde variabelewaarde niet 'y' is of 'J' . Terwijl het dat doet, heb ik ingesteld termout uit zodat u de werkelijke uitzondering niet ziet. En ik heb wanneer sqlerror om het script te laten afsluiten wanneer die uitzondering wordt gegenereerd, zodat wat later komt, niet wordt uitgevoerd. Dat is al het andere in het besturingsscript, niet alleen de volgende query, maar u kunt meerdere subscripts hebben als u flexibeler wilt zijn.

Maar in SQL Developer, termout werkt alleen zoals verwacht als je via @ . draait . Als u de inhoud van elcm_ctl.sql . uitvoert rechtstreeks vanuit het SQL-werkblad zie je dat de uitzondering wordt opgeworpen, wat een beetje lelijk is. Dus sla in plaats daarvan dat besturingsscript op en doe in een leeg werkblad gewoon:

@c:\elcm_ctl.sql

Voer dat werkblad uit als een script en het zal u vragen; als u 'Y' . invoert u ziet de uitvoer van het script in het uitvoervenster van het script (tenzij u set termout uitgeschakeld laat staan in het besturingsscript), en het zal het spoolbestand maken. Als u iets anders invoert, wordt de elcm.sql . niet uitgevoerd bestand, toont niets in het scriptuitvoervenster en maakt geen spoolbestand.




  1. voortgangsbalk met mysql-query met php

  2. Voorkom automatische verhoging van InnoDB OP DUPLICATE KEY

  3. PHP asynchrone mysql-query

  4. Speel Framework Anorm &DB niet opgelost