【问题标题】:oracle plsql if not found repeatoracle plsql 如果没有找到重复
【发布时间】:2016-01-21 14:35:08
【问题描述】:
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. 

我需要一个循环脚本,所以如果项目为空或错误,脚本会要求重复或停止。 比如:

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

直到项目编号正确或答案为“N”

【问题讨论】:

  • sql*plus 有点交互性,但循环是在服务器上作为块执行的 pl/sql 构造,因此您不能与它们进行持续的用户交互。也就是说 - 可以按照此处所示完成,但我不确定这是一个很好的选择:stackoverflow.com/questions/1870670/…

标签: sql oracle plsql sqlplus


【解决方案1】:

下面的示例将在该项目没有锁时立即重新启动 unlock.sql,方法是将对 unlock.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. 

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 2015-11-06
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多