1

我正在阅读一本教授 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 时,尾随的“名称”未参数化参数是什么?

4

2 回答 2

3

它到底在做什么?什么是 r_empname?

PL/SQL 允许您根据行、列或游标的类型定义变量的类型。该行定义了一个名为的变量,该变量是与游标r_empname返回的行类型相匹配的记录类型(例如行) 。empname_cur

%ROWTYPE语法的优点是,如果您更改游标的 SQL 查询,其余代码仍将是强类型的,并且无需额外更改即可编译。

调用 GetName 时,尾随的“名称”未参数化参数是什么?

SQL 查询中的 extraname是函数返回值的列的别名。如果您运行该查询,它将显示在列标题中。

我认为您在该amount字段之前缺少逗号。大概应该是这样的:

SELECT GetName (empno) name
     , amount
FROM bonus;
于 2013-05-06T23:33:29.120 回答
2
  • 调用中的p_empno,是FUNCTION参数的名字,就是CURSOR参数

    OPEN empname_cur(p_empno);
    

这句话表明名为 empname_cur 的游标有一个名为 p_empno参数。在此上下文中 p_empno 从 FUNCTION 参数中获取其值:

FUNCTION GetName
                    (p_empno emp.empno%TYPE)
  • r_empname是一个变量的名称,empname_cur%ROWTYPE 是它的类型,这意味着变量域取自游标empname_cur 的行类型,在我们的例子中:从emp 表中取ename列类型。
  • 最后一句话:

    SELECT GetName (empno) name amount FROM bonus;

一定是 :

SELECT GetName (empno) name,
amount
FROM bonus;

所以“名称”是来自GetName FUNCTION结果的 ALIAS

于 2013-05-06T23:44:40.680 回答