Oracle SQL * Plus ACCEPT语句

时间:2011-07-29 04:49:21

标签: sql database oracle plsql sqlplus

我需要一些SQL * Plus脚本的帮助。有什么方法可以让它接受一个变量,检查表格是否匹配,如果它找到退出程序而不继续其余的接受语句?

到目前为止我有这个代码:

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.

如果找到匹配项,我不希望它继续使用程序的其余部分。有没有办法做到这一点?

5 个答案:

答案 0 :(得分: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会将成功代码返回给调用它的shell。您还可以使用FAILURE返回通用故障代码或其他选项以返回特定值。

答案 1 :(得分:2)

使用whenever SQL * Plus命令,可以在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;
/

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

为什么不简单地改变条件?

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

这样,如果v_name与输入匹配,则不会发生任何事情,因为没有ELSE部分

答案 4 :(得分:0)

Gary是正确的,你需要编写解决方案的脚本。

在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
在脚本中

可以使用&amp; 1来获取输入参数 (我也会将结果限制为1) e.g:

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