PLSQL - 使用参数创建过程,但只允许2个值

时间:2017-03-30 19:59:28

标签: oracle plsql parameters procedure

首先,我是一个涉及PL / SQL编程的DBA。我有一些知识,但有些肯定缺乏。

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

我想允许P_STATUS参数只允许使用' E'或者' D'用于启用或禁用触发器。我已经做了一些搜索,但似乎无法找到解决方案。非常感谢任何帮助!

谢谢!

杰里米

3 个答案:

答案 0 :(得分: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;
/

答案 1 :(得分: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,这样所有其他程序都可以重用相同的代码。

干杯

答案 2 :(得分:0)

解决方案也是使用布尔值,因为你只有两个选择。

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

this interesting article开始,建议您创建一个单独的函数来验证您的输入,如果您想在PLSQL中使用某种 ENUM (外部化if GurV 建议)。

  

那么一个人要做什么?

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

如果超过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;
/