sqlplus使用存储过程更新一行

Sqlplus using stored procedures to update a row

这就是我目前所拥有的。当我输入有效数据和 运行 时,table 会正确更新。当我 运行 它使用我知道 table 中不存在的作者编号时,它仍然 运行s,并且不输出异常语句。有谁知道为什么我的例外似乎不起作用。任何帮助将不胜感激谢谢!

CREATE OR REPLACE PROCEDURE update_authorname 
(selected_author_num IN NUMBER, 
new_author_first IN CHAR,
new_author_last IN CHAR) AS 

BEGIN
UPDATE author
SET author_first = new_author_first, author_last = new_author_last
WHERE author_num = selected_author_num;

EXCEPTION
  WHEN NO_DATA_FOUND 
  THEN
  DBMS_OUTPUT.PUT_LINE('No author with this number exists: ' || selected_author_num);

  WHEN ROWTYPE_MISMATCH 
  THEN
  DBMS_OUTPUT.PUT_LINE('Error: There was a row type mismatch when updating');

END;
/

这是我以前调用的程序:

BEGIN
update_authorname(6,'Emma','White');
END;
/

where 子句不匹配时,update 语句不会抛出异常,它只是默默地失败。相反,您需要检查:

  1. 尝试更新前的行exists
  2. 更新改变了一些东西。

1.该行存在

CREATE OR REPLACE PROCEDURE update_authorname 
(selected_author_num IN NUMBER, 
new_author_first IN CHAR,
new_author_last IN CHAR) AS 

BEGIN

IF NOT EXISTS (SELECT 1 FROM author WHERE author_num = selected_author_num;
  DBMS_OUTPUT.PUT_LINE('No author with this number exists: ' || selected_author_num);
ELSE
  UPDATE author
  SET author_first = new_author_first, author_last = new_author_last
  WHERE author_num = selected_author_num;

EXCEPTION
  WHEN ROWTYPE_MISMATCH 
  THEN
  DBMS_OUTPUT.PUT_LINE('Error: There was a row type mismatch when updating');

END;
/

2。更新进行了更改

CREATE OR REPLACE PROCEDURE update_authorname 
(selected_author_num IN NUMBER, 
new_author_first IN CHAR,
new_author_last IN CHAR) AS 

BEGIN


UPDATE author
SET author_first = new_author_first, author_last = new_author_last
WHERE author_num = selected_author_num;

IF @@ROWCOUNT <= 0
  DBMS_OUTPUT.PUT_LINE('No author with this number exists: ' || selected_author_num);

EXCEPTION
  WHEN ROWTYPE_MISMATCH 
  THEN
  DBMS_OUTPUT.PUT_LINE('Error: There was a row type mismatch when updating');

END;
/

当然还有其他方法可以达到相同的结果,但这是最常见的两种。