繁体   English   中英

Oracle:IF块中的IN函数

[英]Oracle: IN function within an IF block

我有一个光标c2,其中一栏为“ note”,其中包含数字。 我想检查该列是否包含5,如果是,请更改我的局部变量。

这个:

CREATE OR REPLACE PROCEDURE proc

IS
result varchar(50);

cursor c2 is
SELECT  note
FROM    student;    

BEGIN

IF c2.note IN(5) THEN
result := 'contains 5';

DBMS_OUTPUT.PUT_LINE(result);

END;
/

不起作用。

请帮忙!

在代码中,您声明了一个游标,但从未打开它,也从未从中获取数据。 大概需要某种循环来迭代游标返回的行。 您将需要显式或隐式声明一条记录,其中将提取每个特定的行。 一种选择是类似

CREATE OR REPLACE PROCEDURE proc
IS
  result varchar(50);

  cursor c2 is
    SELECT  note
      FROM  student;    
BEGIN
  FOR rec IN c2
  LOOP
    IF rec.note IN(5) THEN
      result := 'contains 5';
      DBMS_OUTPUT.PUT_LINE(result);
    END IF;

  END LOOP;
END;
/

请注意,您还必须具有与IF语句相对应的END IF 给游标c2命名通常也是一个坏主意-您的变量确实应该有意义地命名。

您缺少END IF并且需要在光标上进行LOOP 过程名称包含在最后的END

但是使用IN应该可以。 像这样:

CREATE OR REPLACE PROCEDURE proc    
IS
  result varchar(50);

  cursor c2 is
  SELECT  note
  FROM    student;    

BEGIN
  FOR rec in c2
  LOOP 
    IF rec.note IN (5) THEN
      result := 'contains 5';
    END IF;   
  END LOOP;

  DBMS_OUTPUT.PUT_LINE(result);

END proc;
/

您也已经遍历了游标中返回的记录/行; 您不能像这样引用游标本身:

CREATE OR REPLACE PROCEDURE proc
IS
    result varchar(50);

    cursor c2 is
        SELECT  note
        FROM    student;    
BEGIN
    FOR r2 IN c2 LOOP
        IF r2.note = 5 THEN -- IN would also work but doesn't add anything
            result := 'contains 5';
        END IF;
    END LOOP;

    DBMS_OUTPUT.PUT_LINE(result);
END;
/

但是,如果您只是测试是否存在任何值为5记录,则不需要游标:

CREATE OR REPLACE PROCEDURE proc
IS
    result varchar(50);
BEGIN
    SELECT max('contains 5')
    INTO result
    FROM student
    WHERE note = 5;

    DBMS_OUTPUT.PUT_LINE(result);
END;
/

如果有五行,您将获得'contains 5'字符串; 如果没有,您将得到null 如果表中有零个或多个匹配记录,则max()阻止引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM