【问题标题】:Sqlplus using stored procedures to update a rowSqlplus使用存储过程更新一行
【发布时间】:2016-07-11 07:07:27
【问题描述】:

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

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;
/

【问题讨论】:

    标签: oracle stored-procedures plsql sqlplus


    【解决方案1】:

    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;
    /
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多