【问题标题】:Oracle SQL*Plus ACCEPT StatementsOracle SQL*Plus ACCEPT 语句
【发布时间】:2011-10-15 16:12:15
【问题描述】:

我需要一些关于我的 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.

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

【问题讨论】:

  • 最后一行的标签 + 转到标签?

标签: sql database oracle plsql sqlplus


【解决方案1】:

您可以通过启用错误检查然后引发错误来做到这一点。

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 返回通用故障代码,或使用其他选项返回特定值。

【讨论】:

  • 我同意。我只是使用 count(*) 来避免 No_data_found 或 too_many_rows 异常。
  • @zep -- 好点!如所写,如果客户不存在,这也会导致脚本退出,因为查询会引发 no_data_found。我会解决的。
【解决方案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;
/

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 但是由于您可以在 SQL*Plus 中运行 PL/SQL 块,您可以利用其中的 IF 结构。
    【解决方案4】:

    为什么不简单地切换条件?

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

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

    【讨论】:

    • 因为他想在这种情况下做额外的 ACCEPT 语句,不能在 PL/SQL 块内。
    【解决方案5】:

    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
    

    在您的脚本中,您可以使用 &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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多