PL / SQL在if else

时间:2016-04-02 11:20:05

标签: oracle plsql sqlplus

这是我的计划:

SET VERIFY OFF
SET FEED OFF
SET SERVEROUTPUT ON

PROMPT 'Vehicle Inventory Record'
ACCEPT p_Options;
ACCEPT myVariable PROMPT 'Input value: ';

DECLARE
  n_numb number := 1;

BEGIN

  IF '&p_Options' = 'YES' THEN        
  dbms_output.put_line('input YES');

  ELSIF '&p_Options' = 'NO' THEN    
  dbms_output.put_line('input NO');

  ELSE
  dbms_output.put_line('&myVariable');

  END IF;

END;
/

现在,每当我运行程序时,我输入p_Options的值,但无论我输入什么,它都会要求我输入myVariable。

我想仅在其他情况下输入myVariable的值,当p_Options既不是YES也不是NO时。

为什么即使在其他情况下也要求myVariable?

3 个答案:

答案 0 :(得分:0)

因为在解释过程之前必须用实际值替换替换变量(& ...),"在"之前很久它被发送执行。

解释器(与运行时相对)不会评估" if"陈述,看它是否导致真或假;这将在运行时发生。

你想做什么 - 有一个程序提示用户myVariable DURING EXECUTION,并且只有在需要的时候?你不能用替换变量做到这一点。

答案 1 :(得分:0)

SET VERIFY OFF

SET FEED OFF

SET SERVEROUTPUT ON

PROMPT 'Vehicle Inventory Record'

ACCEPT condition;

ACCEPT myVariable PROMPT 'Input value: ';

DECLARE
  n_numb varchar2(20) := '&condition';

BEGIN

  IF n_numb = 'Y' THEN  

  dbms_output.put_line('input YES');

  ELSIF n_numb = 'N' THEN   

  dbms_output.put_line('input NO');

  ELSE
  dbms_output.put_line('NO DATA FOUND:');

  END IF;

END;

答案 2 :(得分:0)

时间有点晚(略有不同),但认为它对像我这样的人可能有用:)

声明变量。
一个用于显示提示的条件。
如果提示出现,则用于存储结果的一个。

VARIABLE show_alert varchar2(10);
VARIABLE confirm varchar2(10);`

现在在PLSQL块中,根据需要设置show_alert值。
我将“ Y”设置为显示警报并要求用户输入值
“ N”表示不显示警报(并且不会要求输入值)。

DECLARE
    r_ver   varchar2(50);
BEGIN   
    SELECT zbc
    INTO r_ver
    FROM bla_bla_table;
    IF r_ver like '12.2%' THEN
        :show_alert := 'Y';
    ELSE
        :show_alert := 'N';
    END IF; 
END;
/

然后,我在cont.sql中假脱机接受命令。仅当满足上述条件中的where条件即show_alert ='Y'时,此sql文件才会存储accept命令。
然后,它使用@ cont.sql执行sql文件。

SPOOL cont.sql

SELECT 
    'ACCEPT confirm prompt "Continue installation (Y/N):";'
FROM
    dual
WHERE
   upper(substr(:show_alert, 1, 1)) = 'Y';

spool off
@cont.sql