Sql Oracle:在IF块内的函数中

Sql Oracle:在IF块内的函数中,sql,oracle,in-function,Sql,Oracle,In Function,我有一个游标c2,有一列“note”,包含数字。 我想检查列是否包含5,如果是,请更改我的局部变量 这: 不起作用 请帮忙 您缺少一个结束IF,需要在光标上循环。过程名称包含在最终的结束中 但是在中使用应该可以。像这样: CREATE OR REPLACE PROCEDURE proc IS result varchar(50); cursor c2 is SELECT note FROM student; BEGIN FOR rec in c2

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

这:

不起作用


请帮忙

您缺少一个
结束IF
,需要
在光标上循环。过程名称包含在最终的
结束

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

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

在代码中,您声明了一个游标,但从未打开它,也从未从中获取数据。您可能需要某种循环来遍历游标返回的行。您需要显式或隐式地声明一个记录,每个特定行都将被提取到该记录中。这样做的一个选择是

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

定义“不起作用”。您当然可以在
IF
语句中使用
IN
子句,因此这里肯定发生了其他事情。
c2
是游标名称,还是它被提取到的记录变量?@AlexPoole c2是游标名称,我没有提取it@JustinCave除非我写下它编译的这个语句,似乎存在语法错误,您无法直接从光标中获取值,只能从其中的记录中获取值(这可能是隐式的,例如c2循环中r2的
)。您需要显示更多的代码。但我怀疑您想知道光标返回的任何记录是否有
5
;是吗?不是直接从光标开始的
c2
,它需要循环并检查每个返回值…?
c2。注意
应该是
r2。注意
@hol-是的,我会去好好谈谈。谢谢,没问题。你的第二个解决方案很有趣。从未想过使用
MAX
进行类似操作。@hol-它只是假设您不打算对来自游标的数据执行任何其他操作,并且游标一开始就不是正确的工具。如果您需要其他数据和此标志,我在评论中链接的前面的问题有两种方法(尽管可能还有其他方法)。
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;
/