Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建更新员工个人信息的存储过程_Sql_Oracle_Stored Procedures_Plsql - Fatal编程技术网

Sql 创建更新员工个人信息的存储过程

Sql 创建更新员工个人信息的存储过程,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,我已执行以下操作来创建一个存储过程,用于更新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,

我已执行以下操作来创建一个存储过程,用于更新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.

有人能告诉我我做错了什么吗

如果传入
NULL
值,我假设您希望忽略
new\u firstname
new\u lastname
参数。如果是这样,那么您的
案例
陈述是错误的

CASE NEW_LASTNAME 
        WHEN NULL THEN 
          LASTNAME
        ELSE NEW_LASTNAME
        END,
将始终返回
new\u lastname
。任何值,包括
NULL
都不等于
NULL
,因此
在NULL
时总是计算为
false
。你可以这样做

CASE WHEN new_lastname IS NULL
     THEN lastname
     ELSE new_lastname
 END
或者更简单地说

COALESCE( new_lastname, lastname )

当然,
new\u firstname
表达式也有同样的问题。

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