我有一个光标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;
/
不起作用。
请帮忙!
答案 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()
将停止抛出异常。