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;
/
是否可以在过程中声明带约束的常量?
类似于:
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;
/