-1

我有一个光标 c2,有一列“注释”,包含数字。我想检查该列是否包含 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;
/

不工作。

请帮忙!

4

3 回答 3

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通常也是一个坏主意——你的变量真的应该有意义地命名。

于 2013-05-04T21:02:21.400 回答
2

您缺少一个END IF并且需要LOOP在光标上。过程名称包含在 final 中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;
/
于 2013-05-04T20:54:20.563 回答
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()表中有零个或多个匹配记录,则停止抛出异常。

于 2013-05-04T21:00:52.370 回答