2016-01-21 36 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.