【问题标题】:Using if else blocks getting missing right parenthesis error使用 if else 阻止丢失右括号错误
【发布时间】:2014-01-09 20:00:38
【问题描述】:

我是 Oracle 的新手,并且了解 MS SQL。我正在尝试根据来自Table2user_id 获取电话号码,这是业务逻辑:

  • 案例 1:如果在 Table1 中找到单个匹配项,则从 Table2 获取相应的免费电话号码

  • 案例 2:如果在 Table1 中找不到匹配项,则从 Table2 获取默认免费电话号码

  • 案例3:如果在Table1 中找到多个匹配项,那么对于所有assigned_care_levels,从Table2 中获取Care 值,按ascdesc 排序并选择最上面一行的电话号码。

我编写了以下查询,当我单独运行它时效果很好。但是,当我使用 if else 语句结合它时,我收到以下错误ERROR: ORA-00907: missing right parenthesis。这是我的代码:

if ((select count(distinct care_level) from Table1 where user_id = '100') > 0)
    select phone from Table2 where care_level in (select distinct care_level from Table1 where user_id = '100')
    and rownum = 1 
    order by care_level asc
else if((select count(distinct care_level) from Table1 where user_id = '100') = 0)
    select phone from Table2 where care_level = 'default'

【问题讨论】:

  • 你想在哪里执行这个?是 PL/SQL 存储过程吗?因为Oracle SQL 中没有IF 语句支持。
  • 不,它不是存储过程。我试图使用 Visual Studio Orcale 查询编辑器来执行它。
  • 正如我上面提到的,Oracle SQL 中没有IF 语句。而且我怀疑即使你用CASE 替换它,你的构造也会运行。您宁愿将count(distinct care_level) 保存到某个宿主变量并在您的客户端应用程序中实现逻辑。
  • 感谢您的意见。

标签: oracle parentheses ora-00907


【解决方案1】:
SET SERVEROUTPUT ON;

DECLARE
       v_CARE_COUNT NUMBER := 0;
       v_PHONE VARCHAr2(40) := NULL;
BEGIN
      select  count(distinct care_level) 
         into v_CARE_COUNT
      from Table1 
       where user_id = '100';

      IF(v_CARE_COUNT > 0) THEN

         select phone into v_PHONE 
         from Table2 
         where care_level in 
           (select distinct care_level from Table1 where user_id = '100')
         and rownum = 1;
      ELSE
         select phone into v_PHONE
          from Table2
         where care_level = 'default';
      END IF;
      DBMS_OUTPUT.PUT_LINE('PHONE is <'||v_PHONE||'>');
 EXCEPTION
 WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Exception : '||SQLERRM);
 END;
 /

编辑:(AS 单一 SQL)

 SELECT PHONE 
 FROM TABLE2
 WHERE CARE_LEVEL in
       (
          SELECT CARE_LEVEL FROM TABLE1 WHERE USER_ID='100'
           UNION
          SELECT CARE_LEVEL FROM TABLE1 WHERE CARE_LEVEL='default'
            AND NOT EXISTS
              (SELECT 'X' FROM TABLE1 WHERE USER_ID='100')
        )
 AND ROWNUM = 1;

【讨论】:

  • 感谢您的帮助。我尝试了您的 Orcale 查询,但我得到了不同的错误,如下所示。
  • 你能粘贴错误文本吗?对不起,我在这里没有看到任何东西。
  • 再次感谢您抽空拉维。这是我得到的错误。 “错误 ORA-00922:缺少或无效选项”
  • 当你运行我的“单一 SQL”时,你明白了吗?
  • 是的,我也尝试过该查询,但它给出了相同的初始错误。 “错误 ORA-00907:缺少右括号”。如果我删除以下语句“ AND NOT EXISTS (SELECT 'X' FROM TABLE1 where user = '100')”,那么它可以正常工作。
【解决方案2】:

“else if”语法错误。在 Oracle 中,您需要使用“ELSIF”并使用“END IF”完成整个条件语句。里面的SQL语句也应该跟一个;

试试:

IF ((select count(distinct care_level) from Table1 where user_id = '100') > 0) THEN
    select phone from Table2 where care_level in (select distinct care_level from Table1 where user_id = '100')
    and rownum = 1 
    order by care_level asc;
ELSIF ((select count(distinct care_level) from Table1 where user_id = '100') = 0) THEN
    select phone from Table2 where care_level = 'default'; END IF

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 1970-01-01
    • 2014-11-11
    • 2021-12-21
    • 1970-01-01
    • 2019-12-31
    • 2013-12-18
    相关资源
    最近更新 更多