Oracle:IN块中的IN函数

时间:2013-05-04 20:29:48

标签: sql oracle in-function

我有一个光标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;
/

不起作用。

请帮忙!

3 个答案:

答案 0 :(得分:3)

在你的代码中,你正在声明一个游标,但你永远不会打开游标,也永远不会从中获取数据。大概你需要某种循环来迭代光标返回的行。您需要显式或隐式声明一个记录,其中每个特定行都被提取。这样做的一个选择是

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;
/

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

答案 1 :(得分:2)

您错过了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;
/

答案 2 :(得分:2)

你对游标中返回的记录/行进行了循环;你不能像那样引用光标本身:

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()将停止抛出异常。