示例pl / sql函数 - 详细说明?

时间:2013-05-06 23:25:01

标签: oracle plsql

我正在读一本教授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”的无参数化参数是什么?

2 个答案:

答案 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)
  • r_empname 是一个变量的名称,empname_cur%ROWTYPE是其类型,这意味着变量域是从游标中获取的 empname_cur rowtype,在我们的示例中: en 列类型来自 \ temp
  • 最后一句:

    SELECT GetName(empno)名称 量 来自奖金;

必须:

SELECT GetName (empno) name,
amount
FROM bonus;

所以“name”是 GetName FUNCTION

结果中的ALIAS