oracle pl/sql:您的SQL函数语法有错误,如何修复此错误?

yh2wf1be  于 2022-12-18  发布在  Oracle
关注(0)|答案(2)|浏览(126)

名为PL/SQL的错误:忽略语句
我定义了一个变量c_c来计算循环的次数,错误发生在increase语句(c_c:= c_c + 1;)

create or replace function number_of_course(num_stu STUDENTS.STUNO%TYPE) 
return number is
 c_c number :=0;
 cursor c1 is SELECT stuno from reg; 
begin
for i in c1 loop
if i = num_stu then 
c_c := c_c + 1 ;
end if;
end loop;
       RETURN c_c;
end number_of_course;
gg58donl

gg58donl1#

修复这个错误很容易 *-你不能把游标变量和数字进行比较。但是,我不知道这段代码应该做什么。
对于示例表(只是为了使函数编译):

SQL> SELECT * FROM students;

     STUNO
----------
         5

SQL> SELECT * FROM reg;

     STUNO
----------
         1
         3
         5

固定功能:

SQL> CREATE OR REPLACE FUNCTION number_of_course (num_stu STUDENTS.STUNO%TYPE)
  2     RETURN NUMBER
  3  IS
  4     c_c  NUMBER := 0;
  5
  6     CURSOR c1 IS SELECT stuno FROM reg;
  7  BEGIN
  8     FOR i IN c1
  9     LOOP
 10        IF i.stuno = num_stu          --> instead of "IF i = num_stu"
 11        THEN
 12           c_c := c_c + 1;
 13        END IF;
 14     END LOOP;
 15
 16     RETURN c_c;
 17  END number_of_course;
 18  /

Function created.

它返回 * 任何东西 * 吗?是的,它返回。这是你想要的吗?就像我说的,不知道。

SQL> SELECT number_of_course (1) result_1,
  2         number_of_course (2) result_2
  3  FROM DUAL;

  RESULT_1   RESULT_2
---------- ----------
         1          0

SQL>

vfh0ocws

vfh0ocws2#

您可以使用COUNT聚合函数,而不是使用游标循环(游标循环会更慢、更复杂):

CREATE FUNCTION number_of_course(
  num_stu STUDENTS.STUNO%TYPE
) RETURN NUMBER
IS
  c_c number;
BEGIN
  SELECT COUNT(*) INTO c_c FROM reg WHERE stuno = num_stu; 
  RETURN c_c;
END number_of_course;

如果您确实需要使用循环(这似乎毫无意义),那么您可以在游标中进行过滤,并计算游标中的行数:

CREATE FUNCTION number_of_course(
  num_stu STUDENTS.STUNO%TYPE
) RETURN NUMBER
IS
  c_c NUMBER :=0;
  CURSOR c1 is SELECT stuno from reg WHERE stuno = num_stu; 
BEGIN
  FOR i IN c1
  LOOP
    c_c := c_c + 1 ;
  END LOOP;
  RETURN c_c;
END number_of_course;
/

相关问题