1

我正在尝试创建一个过程,其中输入是表 Employee 中的 lname,输出是表信息中的 sal 和平均值。两个输出都是数字,平均值是十进制数。这就是我到目前为止所拥有的。

CREATE OR REPLACE PACKAGE getSalAvgPack IS PROCEDURE getSalAvg
(name IN Employee.lname%TYPE,
 pSal OUT NUMBER,
 pAvg OUT NUMBER);
END;
.
/

包编译得很好。

CREATE OR REPLACE PACKAGE BODY getSalAvgPack IS PROCEDURE getSalAvg
(name IN Employee.lname%TYPE,
 pSal OUT NUMBER,
 pAvg OUT NUMBER)
IS
BEGIN
  SELECT Information.sal, Information.average
  INTO pSal, pAvg
  FROM Information
  WHERE Information.eid=Employee.eid AND name=lname;
END;
END;
.
/

当我尝试编译包体时,我得到了这些错误

PL/SQL: SQL Statement ignored (for line 7, column 2)
PL/SQL: ORA-00904: "LNAME": invalid identifier
4

2 回答 2

1

您需要加入Employee表格:

  SELECT Information.sal, Information.average
  INTO pSal, pAvg
  FROM Information join
       Employee
       on Information.eid=Employee.eid
  WHERE name=lname;
于 2013-08-10T22:55:30.130 回答
1

您似乎缺少一个连接

SELECT Information.sal, Information.average
  INTO pSal, pAvg
  FROM Information
       JOIN Employee ON (Information.eid = Employee.eid)
 WHERE name = Employee.lname;

作为一般原则,我强烈建议对参数使用命名约定,将它们与表中的列区分开来。如果name是您要加入的任一表中的列,则谓词将Employee.lname与该列进行比较,而不是使用name过程中的参数。一个常见的约定是为所有参数添加前缀,p_以便您的查询变为

SELECT Information.sal, Information.average
  INTO p_Sal, p_Avg
  FROM Information
       JOIN Employee ON (Information.eid = Employee.eid)
 WHERE p_name = Employee.lname;
于 2013-08-10T22:56:34.800 回答