我正在读一本教授PL / SQL的书,但就像这个主题的许多资源一样,它提供了关于其例子的粗略细节。有人可以帮我解决这个问题(从文本中逐字逐句)?该文本不提供使用代码的样本表。
以下代码创建一个函数,该函数将根据给定的员工编号返回员工姓名: -
CREATE OR replace FUNCTION Getname (p_empno emp.empno%TYPE)
RETURN VARCHAR
IS
CURSOR empname_cur(
p_empno emp.empno%TYPE) IS
SELECT ename
FROM emp
WHERE empno = p_empno;
r_empname empname_cur%ROWTYPE;
BEGIN
OPEN empname_cur(p_empno);
FETCH empname_cur INTO r_empname;
IF empname_cur%NOTFOUND THEN
r_empname.ename := 'UNKNOWN EMPLOYEE';
END IF;
CLOSE empname_cur;
RETURN r_empname.ename;
END;
首先,上面的函数声明一个游标来检索员工名称,然后打开游标,执行一次获取,如果没有找到行,那么名称设置为UNKNOWN EMPLOYEE,游标关闭,名称是回到了调用程序。
可以从SQL语句中调用该函数,如下所示: -
SELECT GetName(empno) name
amount
FROM bonus;
所以... 电话中的p_empno是什么?是表名吗?它是一个参数的占位符,其类型与列emno是什么相同?
最令我困惑的是
r_empname empname_cur%ROWTYPE;
它到底在做什么?什么是r_empname
?当调用GetName时,那个尾随“name”的无参数化参数是什么?
答案 0 :(得分:3)
它到底在做什么?什么是r_empname?
PL / SQL允许您根据行,列或游标的类型定义变量的类型。该行定义了一个名为r_empname
的变量,它是一个记录类型(例如,像一行),它匹配empname_cur
游标返回的行的类型。
%ROWTYPE
语法的优点是,如果更改游标的SQL查询,其余代码仍将是强类型的,并且无需进行其他更改即可编译。
调用GetName时,那个尾随“name”的无参数化参数是什么?
SQL查询中的额外name
是函数返回的值的列的别名。如果您运行该查询,它将显示在列标题中。
我认为你在amount
字段之前错过了一个逗号。它应该是这样的:
SELECT GetName (empno) name
, amount
FROM bonus;
答案 1 :(得分:2)
p_empno ,是FUNCTION参数的名称,它将是 CURSOR参数
OPEN empname_cur(p_empno);
这句话表示名为 empname_cur 的光标有一个名为 p_empno 的参数。在此上下文中,p_empno从FUNCTION参数中获取其值:
FUNCTION GetName
(p_empno emp.empno%TYPE)
最后一句:
SELECT GetName(empno)名称 量 来自奖金;
必须:
SELECT GetName (empno) name,
amount
FROM bonus;
所以“name”是 GetName FUNCTION
结果中的ALIAS