2016-01-21 80 views
0
set verify off 

accept project prompt ' project : ' 
select locknr,description,couserid,ciuserid from dgdtw_lockedinfo where  
description = '&project' and ciuserid is null; 

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. 

我需要一個循環腳本,所以如果項目爲空或錯誤,腳本會要求重複或停止。 喜歡的東西:oracle plsql如果找不到重複

accept var prompt 'project number is wrong try again? [Y/N] ? ' 

直到項目編號是否正確或答案是「否」

+3

sql * plus有點互動,但是循環是一個pl/sql結構,它們作爲一個塊在服務器上執行,所以你不能有持續的用戶與它們的交互。這就是說 - 它可以像這裏顯示的那樣完成,但我不確定這是一個不錯的選擇:http://stackoverflow.com/questions/1870670/how-to-loop-accepting-user-input-with- PL-SQL –

回答

1

下面的例子將立即重新啓動unlock.sql當有該項目沒有鎖,通過重新定義呼叫解鎖.sql作爲對empty.sql的調用,每當至少返回一行時。

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. 

作爲改進我建議把這個問題重複到一個單獨的SQL文件,然後調用使用,告訴它重新啓動該腳本的參數(見https://docs.oracle.com/cd/B10501_01/server.920/a90842/ch13.htm#1013716

例如,從「unlock.sql 「呼叫 'repeat.sql' 是這樣的:

start 'repeat.sql' unlock 

與repeat.sql因爲是這樣的:

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.