Sql Oracle:在IF块内的函数中
我有一个游标c2,有一列“note”,包含数字。 我想检查列是否包含5,如果是,请更改我的局部变量 这: 不起作用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
请帮忙 您缺少一个
结束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;
/