PL / SQL如何调用此函数

时间:2018-11-29 18:42:16

标签: oracle plsql

我创建了记录,游标和此函数,但我不知道如何调用它。你能帮我吗?

DECLARE
TYPE EmpRecTyp IS RECORD (
 emp_id       NUMBER(6),
 salary       NUMBER(8,2));
CURSOR desc_salary RETURN EmpRecTyp IS
  SELECT employee_id, salary FROM employees ORDER BY salary DESC;
emp_rec     EmpRecTyp;
FUNCTION nth_highest_salary (n INTEGER) RETURN EmpRecTyp IS
BEGIN
  OPEN desc_salary;
  FOR i IN 1..n LOOP
     FETCH desc_salary INTO emp_rec;
  END LOOP;
  CLOSE desc_salary;
  RETURN emp_rec;
END nth_highest_salary;
BEGIN
  NULL;
END;
/

4 个答案:

答案 0 :(得分:0)

您测试过吗?

Begin
     emp_rec := nth_highest_salary(1);
End;

问题是,如果要全局使用此功能,则也必须全局定义该类型。

还需要根据您的oracle版本来初始化记录变量。

答案 1 :(得分:0)

FUNCTION nth_highest_salary (n INTEGER) RETURN EmpRecTyp IS
TYPE EmpRecTyp IS RECORD (
 emp_id       NUMBER(6),
 salary       NUMBER(8,2));
CURSOR desc_salary RETURN EmpRecTyp IS
  SELECT employee_id, salary FROM employees ORDER BY salary DESC;
emp_rec     EmpRecTyp;
BEGIN
  OPEN desc_salary;
  FOR i IN 1..n LOOP
     FETCH desc_salary INTO emp_rec;
  END LOOP;
  CLOSE desc_salary;
  RETURN emp_rec;
END nth_highest_salary;
/

然后

从DUAL中选择nth_highest_salary(n);

答案 2 :(得分:0)

只需声明一个EmpRecTyp变量,您就可以像这样调用函数:

DECLARE 
  vl_emprectyp EmpRecTyp;
BEGIN
  vl_emprectyp := nth_highest_salary(1);
END;

请注意,此代码仅在您的代码块pl / sql的范围内起作用。

答案 3 :(得分:0)

因为您已经将该功能设置为块的局部功能,所以只能在该块内调用它。我建议您在上面的代码中替换

BEGIN
  NULL;
END;

使用

BEGIN
  emp_rec := nth_highest_salary(1);
END;

好运。