PLSQL - 创建带有参数的过程,但仅允许2个值

3

首先,我是一个从事数据库管理的人,对PL/SQL编程有一些了解,但肯定还有很多知识需要学习。

CREATE OR REPLACE PROCEDURE TRIGGER_PRC (P_TRGNAME IN VARCHAR2, P_STATUS IN VARCHAR2)
AS ....

我希望只允许P_STATUS参数具有“E”或“D”值,以启用或禁用触发器。 我已经进行了一些搜索,但似乎找不到解决方案。非常感谢您的帮助!

谢谢!

杰里米

3个回答

3

您可以使用IF检查值是否为E或D。 如果不是,则使用raise_application_error引发错误:

CREATE OR REPLACE PROCEDURE TRIGGER_PRC (P_TRGNAME IN VARCHAR2, P_STATUS IN VARCHAR2)
AS 
begin
    if P_STATUS not in ('E', 'D') then
        raise_application_error(-20001, 'Invalid P_STATUS value - ' || P_STATUS);
    end if;

    . . . 
    . . .

end;
/

如果在top中没有办法完成这个任务,那么我最终会走向那里。谢谢你的提示! - JeremyS

1
我宁愿采用以下方法:
CREATE OR REPLACE PROCEDURE ENABLE_TRIGGER_PRC (P_TRGNAME IN VARCHAR2)
AS ....
BEGIN
  -- Enable the trigger P_TRGNAME here
END;

CREATE OR REPLACE PROCEDURE DISABLE_TRIGGER_PRC (P_TRGNAME IN VARCHAR2)
AS ....
BEGIN
  -- Disable the trigger P_TRGNAME here
END;

你可以让第二个调用第一个等等,但是你应该始终有IF语句(正如GurV所提到的),以便在过程内部验证它。将来,您可能还想添加drop。我建议将它们放入一个包中,这样它们就都在那里合并了,有一个过程来执行实际语句,例如在execute immediate中,这样所有其他过程都可以重复使用相同的代码。
干杯

我可能应该再解释一下。启用/禁用触发器的目的是让用户运行需要禁用触发器的供应商提供的数据修复程序。不会删除触发器...我一开始考虑使用包,但认为如果可以使用过程并动态编写语句,那么可能会变得太复杂。包很好,因为如果需要,我总是可以添加更多内容。 - JeremyS

0
一个解决方案是使用布尔值,因为你只有两个选择。
CREATE OR REPLACE PROCEDURE TRIGGER_PRC (P_TRGNAME IN VARCHAR2, P_STATUS IN BOOLEAN)
AS ....

这篇有趣的文章中可以得知,如果你想在PLSQL中使用ENUM,建议创建一个单独的函数来验证输入(外部化if,如GurV所建议)。

那么该怎么办呢?

  1. 如果你想在表中使用枚举,请使用检查约束。
  2. 如果你想在存储过程中使用枚举,请编写一个单独的过程来验证输入。

如果有超过2个值,你还可以这样做: 如果你能够在包中存储全局变量,并建议你的开发人员在定义的包中查找常量(像PLSQL Developer或类似的GUI使其非常容易使用):

CREATE OR REPLACE PACKAGE global_vars IS
  P_STATUS_enable  CONSTANT varchar2(2) := 'E';
  P_STATUS_disable CONSTANT varchar2(2) := 'D';
  P_STATUS_drop    CONSTANT varchar2(2) := 'Dr';
end global_vars;
/

  create or replace procedure TRIGGER_PRC (P_TRGNAME IN VARCHAR2, P_STATUS IN varchar2)
  AS 
  begin
    if P_STATUS = global_vars.P_STATUS_enable then
        -- do something
        dbms_output.put_line('ENABLE');
    elsif P_STATUS = global_vars.P_STATUS_disable then
      --  p_status = P_STATUS_disable
        dbms_output.put_line('DISABLE');
    elsif P_STATUS = global_vars.P_STATUS_drop then
      -- do other stuff
        dbms_output.put_line('DROP?');
    end if;

  end TRIGGER_PRC;
/


begin
  TRIGGER_PRC ('TRIG', global_vars.P_STATUS_enable);
end;
/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接