我需要一些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.
如果找到匹配项,我不希望它继续使用程序的其余部分。有没有办法做到这一点?
答案 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