[英]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.