【问题标题】:Create a stored procedure that updates the personal info of an employee创建一个更新员工个人信息的存储过程
【发布时间】:2016-11-27 20:54:39
【问题描述】:

我已经创建了一个存储过程来更新 EMPLOYEE 表中员工的个人信息:

CREATE OR REPLACE PROCEDURE UPDATE_EMPLOYEE 
(
  THE_EMPLOYEEID IN NUMBER,
  NEW_LASTNAME IN VARCHAR2,
  NEW_FIRSTNAME IN VARCHAR2,
  NEW_TITLE IN VARCHAR2,
  NEW_REPORTSTO IN NUMBER,
  NEW_BIRTHDATE IN DATE,
  NEW_HIREDATE IN DATE,
  NEW_ADDRESS IN VARCHAR2,
  NEW_CITY IN VARCHAR2,
  NEW_STATE IN VARCHAR2,
  NEW_COUNTRY VARCHAR2,
  NEW_POSTALCODE VARCHAR2,
  NEW_PHONE VARCHAR2,
  NEW_FAX VARCHAR2,
  NEW_EMAIL VARCHAR2
)
AS 
BEGIN
  UPDATE EMPLOYEE
  SET LASTNAME = 
        CASE NEW_LASTNAME 
        WHEN NULL THEN 
          LASTNAME
        ELSE NEW_LASTNAME
        END,
      FIRSTNAME =
        CASE NEW_FIRSTNAME 
        WHEN NULL THEN 
          FIRSTNAME
        ELSE NEW_FIRSTNAME
        END,
      TITLE = NEW_TITLE,
      REPORTSTO = NEW_REPORTSTO,
      BIRTHDATE = NEW_BIRTHDATE,
      HIREDATE = NEW_HIREDATE,
      ADDRESS = NEW_ADDRESS,
      CITY = NEW_CITY,
      STATE = NEW_STATE,
      COUNTRY = NEW_COUNTRY,
      POSTALCODE = NEW_POSTALCODE,
      PHONE = NEW_PHONE,
      FAX = NEW_FAX,
      EMAIL = NEW_EMAIL
    WHERE EMPLOYEEID = THE_EMPLOYEEID;
END UPDATE_EMPLOYEE;

EMPLOYEEID、LASTNAME 和 FIRSTNAME 在表 EMPLOYEE 中不能为空。

我收到这条消息:

Connecting to the database ChinookDB.
ORA-01407: cannot update ("CHINOOK"."EMPLOYEE"."LASTNAME") to NULL
ORA-06512: at "CHINOOK.UPDATE_EMPLOYEE", line 21
ORA-06512: at line 34
Process exited.
Disconnecting from the database ChinookDB.

有人可以告诉我我做错了什么吗?

【问题讨论】:

  • 了解您如何调用该过程也会有所帮助。例如:您似乎正在连接到不同的数据库。如果在该数据库中,在 CHINOOK 模式中,您有一个同名的过程,您可能正在使用“本地”版本,具体取决于您调用它的准确程度。可能的答案太多 - 了解您如何使用该程序将有助于缩小可能性。

标签: sql oracle stored-procedures plsql


【解决方案1】:

如果传入NULL 值,我假设您想忽略new_firstnamenew_lastname 参数。如果是这样,那么您的case 语句是错误的

CASE NEW_LASTNAME 
        WHEN NULL THEN 
          LASTNAME
        ELSE NEW_LASTNAME
        END,

将始终返回new_lastname。没有值,包括NULL 永远等于NULL,所以when null 将始终评估为false。你可以做类似的事情

CASE WHEN new_lastname IS NULL
     THEN lastname
     ELSE new_lastname
 END

或者更简单

COALESCE( new_lastname, lastname )

当然,new_firstname 表达式也有同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2017-06-19
    • 2012-01-02
    相关资源
    最近更新 更多