【问题标题】:Check ID Exist and delete record in PL SQLPL SQL中检查ID是否存在并删除记录
【发布时间】:2017-11-08 07:29:42
【问题描述】:

我要做的是,每当输入STORE_CODE 时,它都会检查数据库并删除商店代码。所以为此,我写了一个如下的程序

PROCEDURE DELETE_STORE_INFO
(
  P_STORE_CODE IN NVARCHAR2
)

  AS

    BEGIN

    UPDATE TBL_RRSOC_STORE_INFO set ISACTIVE = 'N' where STORE_CODE = P_STORE_CODE;

    END DELETE_STORE_INFO;

但这里缺少的是

如果用户输入了错误的store_code 并执行了操作,它会怎么做。如何检查那部分?

我猜COUNT 的某些东西在这个阶段不会起作用。请推荐

【问题讨论】:

  • 因此您构建了一个逻辑来检查传递的输入字符串是否有效。让我们知道您期望的格式,然后您可以在删除语句中使用它之前进行检查
  • @XING:是的,你说的是哪种格式?列的数据类型?
  • 您将输入作为NVARCHAR2 传递,这表明您的代码有一些特殊的双字节字符,因此列必须是NVARCHAR2。我正在谈论您的STORE_CD 的格式/模式,您希望针对输入字符串进行验证以检查其是否有效
  • 另外,update ....returning isactive into o_isactive 可能是这样,但问题还不够清楚。

标签: oracle stored-procedures plsql


【解决方案1】:

您想使用SQL%ROWCOUNT 来查明有多少行受到上一条 SQL 语句的影响:

PROCEDURE DELETE_STORE_INFO
(
  P_STORE_CODE IN NVARCHAR2
)
AS
BEGIN
  UPDATE TBL_RRSOC_STORE_INFO
  SET    ISACTIVE   = 'N'
  WHERE  STORE_CODE = P_STORE_CODE;

  IF SQL%ROWCOUNT = 0 THEN
    -- DBMS_OUTPUT.PUT_LINE( 'Store code does not exist.' );
    RAISE_APPLICATION_ERROR( -20000, 'Store code does not exist.' );
  END IF;
END DELETE_STORE_INFO;
/

您可以使用DBMS_OUTPUT.PUT_LINE( string ) 输出到 SQL 控制台(如果您从 PHP 或 Java 等外部语言调用它,那么您将看不到输出,如果您有 @987654324,您可能在控制台中看不到它@)。

如果发生无效的事情,您也可以使用RAISE_APPLICATION_ERROR( error_code, error_message ) 引发异常。

或者,您可以在 OUT 参数中返回状态:

PROCEDURE DELETE_STORE_INFO
(
  P_STORE_CODE IN NVARCHAR2,
  O_STATUS     OUT NUMBER
)
AS
BEGIN
  UPDATE TBL_RRSOC_STORE_INFO
  SET    ISACTIVE   = 'N'
  WHERE  STORE_CODE = P_STORE_CODE;

  IF SQL%ROWCOUNT = 0 THEN
    o_status := 0;
  ELSE
    o_status := 1;
  END IF;
END DELETE_STORE_INFO;
/

【讨论】:

  • 第一个答案和第二个答案哪个更好?
  • @VVVV 两者都不是“更好”——他们有不同的目标。如果您想了解它是否成功但又不想以编程方式处理该信息(即仅用于调试),那么您可以使用DBMS_OUTPUT。如果不删除该项目是错误,则使用RAISE_APPLICATION_ERROR(但请记住在脚本中捕获错误)。如果您想知道脚本的后面部分是否删除了某些内容(但不删除它不是错误),请在 out 参数中返回状态。
【解决方案2】:

您的过程的一般合同是:调用者提供一些store_code 并且过程保证没有带有此类代码的活动存储。如果来电者给出错误的store_code 怎么办?这意味着没有这样的商店,所以合同已经完成。你应该什么都不做,不要再做:)

但是如果你想检查更新是否找到记录,你可以添加类似

if sql%notfound then
  dbms_output.put_line('There is no such store!');
end if;

在更新语句之后。


尤其是 MT:只需检查简单的脚本

create table t$(id integer);

insert into t$ values(1);

set serveroutput on

begin
  update t$ set id = 2 where id = 1;
  if sql%notfound
    then dbms_output.put_line('#1: not found');
    else dbms_output.put_line('#1: found');
  end if;
  update t$ set id = 4 where id = 3;
  if sql%found then
    dbms_output.put_line('#2: found');
    else dbms_output.put_line('#2: not found');
  end if;
end;
/

drop table t$;

我的结果是

Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 

#1: found
#2: not found

PL/SQL procedure successfully completed

【讨论】:

  • 它会起作用的。最佳做法是在公开之前检查此类确认。试试我放在上面的脚本。
【解决方案3】:

您的请求中有一些误解:您说要删除它,但在代码中,您只是将商店更新为 incative。

这是两种情况的过程。你选对了:

CREATE OR REPLACE PROCEDURE DELETE_STORE_INFO (P_STORE_CODE IN NVARCHAR2) AS
   n_count number;

BEGIN

   select count(1) INTO n_count from TBL_RRSOC_STORE_INFO where STORE_CODE = p_store_code;

    if n_count > 0 then 
        UPDATE TBL_RRSOC_STORE_INFO set ISACTIVE = 'N' where STORE_CODE = P_STORE_CODE;

-- or for deletion
-- DELETE TBL_RRSOC_STORE_INFO set ISACTIVE = 'N' where STORE_CODE = P_STORE_CODE;
    else
        DBMS_OUTPUT.PUT_LINE('the required store was not found');
    end if;
END DELETE_STORE_INFO;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多