为什么 oracle plsql varchar2 变量需要大小,而参数不需要



假设您有以下过程:

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语言参考的PL/SQL子程序一章中阅读。具体参见子程序参数

我不知道为什么形式参数必须不受约束,但我对此非常满意,因为它从子程序标题中删除了(不必要的)细节,使其更加抽象。

最新更新