【问题标题】:IF Statement and not in selectIF 语句而不是在 select 中
【发布时间】:2015-10-23 05:19:42
【问题描述】:

它的 Informix 它工作,如何在 Oracle 中这样做?

IF (uzel NOT IN (SELECT a.uzel FROM user_setup.menu a WHERE a.vetka <> a.uzel
                             AND a.vetka IN (SELECT vetka FROM user_setup.param_menu)))
          THEN
             --;
          END IF;

【问题讨论】:

  • 您是否尝试过在 oracle 中这样做?就这样。
  • 是的。 [错误] PLS-00405 (33: 28): PLS-00405: 在此上下文中不允许子查询

标签: sql oracle plsql informix


【解决方案1】:

试试这个:

DECLARE
  temp NUMBER;
  v_uzel user_setup.menu.uzel%TYPE;
BEGIN    
  SELECT COUNT(*) 
  INTO temp
  FROM dual
  WHERE EXISTS (SELECT A.uzel 
                FROM user_setup.menu A 
                WHERE A.vetka <> A.uzel
                AND A.uzel = v_uzel
                AND A.vetka IN (SELECT vetka FROM user_setup.param_menu));


  IF temp < 1 THEN
    -- code here 

  END IF;
END;

【讨论】:

  • 这是对的。您不能直接在 PL/SQL 表达式中使用 SQL 查询。您需要先将其结果存储在一个变量中。
  • 顺便说一句,我假设uzel 是代码中的一个变量,它也是菜单表中的一列。如果您要在 SQL 语句中使用该变量,请确保它与表中的任何列名具有不同的名称,因为查询很可能会假设您正在谈论该列,而不是变量。
  • 我提到了更多是为了 OP 的利益,但你也改变了答案很好 *{:-)
  • 你不需要select count(*)吗?否则不满足条件时会报No Data Found错误?
【解决方案2】:

在 Oracle 中,您需要使用不同的方法:

DECLARE
   usel1 <specify here the data type for the usel>;
BEGIN

  SELECT a.uzel INTO usel1 
  FROM user_setup.menu a 
  WHERE a.vetka <> a.uzel AND a.usel = uzel
   AND a.vetka IN (SELECT vetka FROM user_setup.param_menu))

   -- this means the record is found.

EXCEPTION
   WHEN NO_DATA_FOUND THEN
     -- do other processing here
END;

【讨论】:

  • [Error] PLS-00103 (32: 21): PLS-00103: Met symbol "EXISTS" 同时预期以下之一:在like like2 like4 likec between member submultiset
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 2014-02-15
  • 2020-06-15
  • 2016-05-21
  • 2013-10-18
  • 2014-11-03
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多