Oracle PL/SQL - 在过程中使用约束声明常量

Posted

技术标签:

【中文标题】Oracle PL/SQL - 在过程中使用约束声明常量【英文标题】:Oracle PL/SQL - Declare constant with constrainst inside procedure 【发布时间】:2020-11-19 16:41:10 【问题描述】:

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

类似:

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 检查长度,如果太长则发出异常,但我正在寻找一种更简单的方法。

【问题讨论】:

【参考方案1】:

您可以将参数直接传递给常量的值,但如果它不适合您将获得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;
/

【讨论】:

【参考方案2】:

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

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;
/

【讨论】:

以上是关于Oracle PL/SQL - 在过程中使用约束声明常量的主要内容,如果未能解决你的问题,请参考以下文章

使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程

oracle SQL语句中怎么样调用存储过程

Oracle 12 PL/SQL 在触发器中检索存储过程名称

使用 PL/SQL 过程在 oracle 10g 中转储表

oracle pl/sql 存储过程

Oracle——PL/SQL