假设你有这个过程:
PROCEDURE f (param VARCHAR2)
IS
var VARCHAR2(10);
BEGIN
var := 'hi';
END f;
我想了解为什么var
需要指定长度,但param
不需要。我很难在 oracle 文档中找到有关此的信息。
“Oracle 数据库从调用过程的环境中获得参数的长度、精度和小数位数。”
请查看此相关问题。
参考:Oracle® 数据库 SQL 参考 10g 第 2 版 (10.2) 请查看语义/参数/数据类型。
不同之处在于子程序标题具有在调用子程序时被实际参数替换的形式参数:
create or replace function f(
p_x in varchar2 /* a formal parameter */
,p_y in varchar2 /* a formal parameter */
) return varchar2 /* a formal parameter */
is
begin
return p_x || p_y;
end;
declare
v_z varchar2(10);
v_x constant varchar2(1) := 'X';
begin
v_z := f(v_x, 'Y'); /* actual parameters */
end;
形式参数是不受约束的(但可以使用受约束的子类型),并且还包括有关参数模式和可能的默认值的信息,这些信息在声明变量时不相关。
形式参数和实际参数的数据类型不必相同但兼容。
还有很多其他细节,但可以从PL/SQL Language Reference的PL /SQL Subprograms一章中阅读。特别参见子程序参数。
我不知道为什么形式参数必须不受约束,但我对此感到非常满意,因为它从子程序标头中删除了(不必要的)细节,使其更加抽象。