【问题标题】:Update Oracle Stored Procedure to Introduce a Check更新 Oracle 存储过程以引入检查
【发布时间】:2017-05-08 14:02:27
【问题描述】:

我们在oracle中的以下存储过程存在问题,它将离开公司的员工标记为2099年开始。

create or replace PROCEDURE             "USP_DISABLELEFTEMPLOYEES"
AS
BEGIN
UPDATE SHOP_EMPLOYEE
SET DATE_STARTED = '01 JAN 2099',
PROCESSED      = 1
WHERE PROCESSED <> 1;
COMMIT;
END;

长话短说,它将我们所有的员工都标记为离开公司,因为从 sftp 服务器发送的初始文件是空的。我是 oracle 和 pl-sql 的新手,所以我想在存储过程运行之前引入一个检查。

数据首先被加载到 SHOP_EMPLOYEE_IMPORT 中,所以我想做的是检查该表是否包含少于 5000 条存储过程不会运行的记录。

create or replace PROCEDURE             "USP_DISABLELEFTEMPLOYEES"
AS
**SELECT @var = AbortJob FROM SHOP_EMPLOYEE_IMPORT where varname = @AbortJob
IF (@@ROWCOUNT > 5000)**
BEGIN
UPDATE SHOP_EMPLOYEE
SET DATE_STARTED = '01 JAN 2099',
PROCESSED      = 1
WHERE PROCESSED <> 1;
COMMIT;
END;

但是,您可以想象这是行不通的。你能帮我搞定这个工作吗,

【问题讨论】:

  • 请注意插入 T-SQL 以显示我想要做的示例,不知道如何或是否可以使用 PL-SQL 做到这一点。

标签: oracle if-statement stored-procedures plsql


【解决方案1】:

您在PL/SQL 代码上使用TransactSQL 语法。那是行不通的。如果您需要添加该检查,请使用正确的 PL/SQL 语法添加。

类似这样的:

create or replace PROCEDURE "USP_DISABLELEFTEMPLOYEES"(p_AbortJob varchar2(200))
   cnt as number;
AS
    select count(1) into cnt
      FROM SHOP_EMPLOYEE_IMPORT where varname = p_AbortJob;
    IF cnt > 5000 then
    BEGIN
        UPDATE SHOP_EMPLOYEE
        SET DATE_STARTED = '01 JAN 2099',
            PROCESSED      = 1
        WHERE PROCESSED <> 1;
        COMMIT;
    END;
END;

另外,不要在您的过程中包含commit 子句。

【讨论】:

  • 是的,这是我对 PL-SQL 不熟悉的问题的一部分,我只是展示了一个我想做的例子。
  • 看起来不错,但把它放在我们的测试环境中。谢谢巴勃罗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多