2011-07-29 44 views
1

我需要一点帮助,使用我的SQL * Plus脚本。有没有什么办法可以让它接受一个变量,检查表中是否有匹配,如果发现它退出该程序,并不继续其余的接受声明?Oracle SQL * Plus ACCEPT语句

我到目前为止这样的代码:

ACCEPT p_cname PROMPT 'Enter Customer Name: ' 
DECLARE 
    v_cname CHAR(20); 
BEGIN 
    SELECT cname INTO v_cname 
      FROM customer 
    WHERE cname = '&p_cname'; 

    IF v_name = '&p_cname' THEN 
      -- Exit the program 
    END IF; 
END; 
/

-- Other ACCEPT statements if a match was not found. 

我不想,如果找到匹配它继续与该程序的其余部分。有没有办法做到这一点?

+0

标签在最后一行+ a转到标签? – Sathya

回答

1

快速回答是“不是真的”。 SQL * Plus是一个非常简单的客户端。它可以向服务器抛出查询或PL/SQL块并显示返回的数据集,但SQL * Plus(不是SQL或PL/SQL)不具有像IF或迭代LOOP结构这样的普通条件语句。

您不应该使用SQL * Plus,而应该考虑使用像Perl或Python这样的脚本语言。

+1

但是,正如你可以在SQL * Plus中运行PL/SQL块一样,你可以使用那里的IF构造。 –

0

为什么不简单地切换条件?如果v_name因为没有ELSE部分

+0

因为他希望在这种情况下执行额外的ACCEPT语句,而这些语句不能在PL/SQL块中。 –

0

加里是正确的,你需要的脚本了解决方案并匹配输入

IF v_name <> '&p_cname' THEN 
     -- Do whatever you want 
END IF; 

没有这样不会发生。

这样的事情在你的脚本的Linux

uid="userid" 
pwd="password" 
echo "enter name:" 
read name 

dbname=`sqlplus -s <<EOF 
$uid/$pwd @part1.sql $name 
EOF` 

if [$dbname == $name ] 
then 
    echo name found 
    exit 
fi 

可以使用& 1以使输入参数 (我也将限制的结果:1) 如:

set heading off 
set pagesize 0 
set tab off 

SELECT cname 
FROM customer 
    WHERE cname = '&1' and rownum <2; 
/
exit 
# add other reads & execure part2,3, etc 
2

使用SQL * Plus命令whenever,可以在SQL或PL/SQL中发生错误时导致SQL * Plus退出。这意味着你需要做的就是引发一个自定义异常来强制脚本退出。

WHENEVER SQLERROR EXIT; 
ACCEPT p_cname PROMPT 'Enter Customer Name: ' 
DECLARE 
    v_cname CHAR(20); 
BEGIN 
    SELECT cname INTO v_cname 
      FROM customer 
    WHERE cname = '&p_cname'; 

    IF v_name = '&p_cname' THEN 
     raise_application_error(-2000,'Your error Message here'); 
    END IF; 
END; 
/
6

您可以通过启用错误检查然后引发错误来实现。

ACCEPT p_cname PROMPT 'Enter Customer Name: ' 

WHENEVER SQLERROR EXIT SUCCESS ROLLBACK; 

DECLARE 
    v_count INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO v_count 
      FROM customer 
    WHERE cname = '&p_cname'; 

    IF v_count > 0 THEN 
      raise_application_error(-20100, 'Customer already exists'); 
    END IF; 

END; 
/

-- Issue a new WHENEVER statement here if you want different error-handling for 
-- the rest of the script 

-- Other ACCEPT statements if a match was not found. 

WHENEVER命令时,SUCCESS关键字意味着的SQLPlus将返回一个成功代码返回到从它被调用的壳。您也可以使用FAILURE返回一个通用失败代码或其他选项以返回特定值。

+1

我同意。我只是使用count(*)来避免No_data_found或too_many_rows异常。 – zep

+0

@zep - 好点!正如所写的,如果客户不存在,也会导致脚本退出,因为查询会引发no_data_found。我会解决它。 –

+0

漂亮的解决方案! –