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

oracle plsql falls nicht gefunden wiederholen

Das folgende Beispiel startet unlock.sql sofort neu, wenn es keine Sperren für dieses Projekt gibt, indem der Aufruf von unlock.sql als Aufruf von empty.sql neu definiert wird, wenn mindestens eine Zeile zurückgegeben wird.

set verify off

accept project prompt ' project : '

define doit = 'H:\Scripts\unlock.sql'
column doit new_value doit noprint
select 'H:\Scripts\empty.sql' as doit, locknr,description,couserid,ciuserid from dgdtw_lockedinfo where     
description = '&project' and ciuserid is null;
start &doit. 

accept lock prompt ' locknumber  : '

update dgdtw_lockedinfo set ciuserid = couserid where locknr = &lock;
update dgdtw_topografie set locknr = '' where locknr = &lock;
update dgdtw_topografie set verval=sysdate where id= &lock;
commit;

accept var prompt 'repeat process?  [Y/N] ? '
define doit = 'H:\Scripts\stop.sql'
column doit new_value doit noprint
set termout off
select 'H:\Scripts\unlock.sql' doit from dual where upper('&var') like 'Y%';
set termout on
start &doit. 

Als Verbesserung schlage ich vor, die Wiederholungsfrage in eine separate SQL-Datei zu verschieben und diese dann mit einem Argument aufzurufen, das angibt, welches Skript neu gestartet werden soll (siehe https://docs.oracle.com/cd/B10501_01/server.920/a90842/ch13.htm#1013716 )

Rufen Sie beispielsweise von „unlock.sql“ aus „repeat.sql“ wie folgt auf:

start 'repeat.sql' unlock

mit repeat.sql etwa so:

accept var prompt 'repeat &1 process?  [Y/N] ? '
define doit = 'H:\Scripts\stop.sql'
column doit new_value doit noprint
set termout off
select 'H:\Scripts\&1.sql' doit from dual where upper('&var') like 'Y%';
set termout on
start &doit.