Oracle PL/SQL - 在过程中声明带有约束的常量

Oracle PL/SQL - Declare constant with constrainst inside procedure

是否可以在过程中声明带约束的常量?

类似于:

declare
procedure proc
   (param1 IN VARCHAR2,
    param2 IN VARCHAR2,
    param3 IN NUMBER)
is
BEGIN
  my_const CONSTANT VARCHAR2(50) := param1  -- Notice the constraint where my_const is VARCHAR2(50)
  other_c  CONSTANT VARCHAR2(50) := 'My other constant!'

  -- Do something with my_const and other_c
END;

有约束的想法是,如果有人提供的值太长,我想引起错误。

无法在参数上定义约束。 我做不到(至少我试过了):

declare
procedure proc
   (param1 IN VARCHAR2(50),
    param2 IN VARCHAR2(50),
    param3 IN NUMBER)
is
BEGIN
  other_c  CONSTANT VARCHAR2(50) := 'My other constant!'

  -- Do something with other_c
END;

我知道我可以用 if 检查长度,如果太长则发出异常,但我正在寻找更简单的方法。

你可以试试……像这样 - 带有常量声明和输入参数赋值的内部代码块;您还可以在程序中包含异常块; 出于演示目的,我将此块添加到正在调用您的过程的块中。

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE proc (
    param1   IN   VARCHAR2,
    param2   IN   VARCHAR2,
    param3   IN   NUMBER
) IS
BEGIN
  -- Do something with other_c
    DECLARE
        my_const   CONSTANT VARCHAR2(50) := param1;
        other_c    CONSTANT VARCHAR2(50) := 'My other constant!';
    BEGIN
        dbms_output.put_line('other_c'
                             || chr(10)
                             || other_c);
        dbms_output.put_line('my_const'
                             || chr(10)
                             || my_const);
    END;
END;
/

这是一个示例方法调用:

BEGIN
    proc(param1 => 'sdfasdfsadfsdfadsfasfasdfsadfa32234fdasdfsadfsdfsadfaf', param2 => 'something', param3 => 1);
EXCEPTION
    WHEN value_error THEN
        dbms_output.put_line('Invalid input param!');
END;
/

您可以将参数直接传递给常量值,但如果不合适,您将得到一个 VALUE_ERROR。您将需要在异常处理中捕获该错误,或​​者如果您希望引发错误,则删除异常处理。

DECLARE
    PROCEDURE proc (param1 IN VARCHAR2, param2 IN VARCHAR2, param3 IN NUMBER)
    IS
        my_const   VARCHAR2 (5) := param1;   -- Notice the constraint where my_const is VARCHAR2(5)
        other_c    VARCHAR2 (5) := 'other';
    BEGIN
        -- Do something with my_const and other_c
        NULL;
    END;
BEGIN
    proc ('long_val', 'test', 0);
EXCEPTION
    WHEN VALUE_ERROR
    THEN
        DBMS_OUTPUT.put_line ('Something doesn''t fit');
END;
/