PLSQL - 创建带参数的过程,但只允许 2 个值
PLSQL - Creating procedure with parameter, but only allowing 2 values
首先,我是一名涉猎 PL/SQL 编程的 DBA。我有一些知识,但肯定缺乏一些知识。
CREATE OR REPLACE PROCEDURE TRIGGER_PRC (P_TRGNAME IN VARCHAR2, P_STATUS IN VARCHAR2)
AS ....
我想让 P_STATUS 参数只允许使用 'E' 或 'D' 的值来启用或禁用触发器。我做了一些搜索,但似乎无法找到解决方案。非常感谢任何帮助!
谢谢!
杰里米
您可以使用 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;
/
我宁愿采用以下方法:
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
,这样所有其他过程都可以重用相同的代码。
干杯
一个解决方案也是使用布尔值,因为您只有两个选择。
CREATE OR REPLACE PROCEDURE TRIGGER_PRC (P_TRGNAME IN VARCHAR2, P_STATUS IN BOOLEAN)
AS ....
从 this interesting article 开始,如果您想在 PLSQL 中使用某种 ENUM
,建议创建一个单独的函数来验证您的输入(将if
GurV 建议)。
So what is a guy to do?
- If you want to use enum in a table, use a check constraint.
- If you want to use enum in a stored procedure, write a separate procedure to validate the input.
如果超过 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;
/
首先,我是一名涉猎 PL/SQL 编程的 DBA。我有一些知识,但肯定缺乏一些知识。
CREATE OR REPLACE PROCEDURE TRIGGER_PRC (P_TRGNAME IN VARCHAR2, P_STATUS IN VARCHAR2)
AS ....
我想让 P_STATUS 参数只允许使用 'E' 或 'D' 的值来启用或禁用触发器。我做了一些搜索,但似乎无法找到解决方案。非常感谢任何帮助!
谢谢!
杰里米
您可以使用 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;
/
我宁愿采用以下方法:
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
,这样所有其他过程都可以重用相同的代码。
干杯
一个解决方案也是使用布尔值,因为您只有两个选择。
CREATE OR REPLACE PROCEDURE TRIGGER_PRC (P_TRGNAME IN VARCHAR2, P_STATUS IN BOOLEAN)
AS ....
从 this interesting article 开始,如果您想在 PLSQL 中使用某种 ENUM
,建议创建一个单独的函数来验证您的输入(将if
GurV 建议)。
So what is a guy to do?
- If you want to use enum in a table, use a check constraint.
- If you want to use enum in a stored procedure, write a separate procedure to validate the input.
如果超过 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;
/