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

为什么oracle plsql varchar2变量需要大小,而参数不需要?,oracle,plsql,varchar2,Oracle,Plsql,Varchar2,假设您有以下步骤: PROCEDURE f (param VARCHAR2) IS var VARCHAR2(10); BEGIN var := 'hi'; END f; 我想了解为什么var需要指定长度,而param不需要指定长度。我很难在oracle文档中找到相关信息。“oracle数据库从调用过程的环境中获取参数的长度、精度和比例。” 请看看这个 参考: 请在语义/参数/数据类型下查看。不同之处在于子程序标题具有正式参数,在调用子程序时,这些参数将替换为实际参数: crea

假设您有以下步骤:

PROCEDURE f (param VARCHAR2)
IS 
   var VARCHAR2(10);
BEGIN
   var := 'hi';
END f;
我想了解为什么
var
需要指定长度,而
param
不需要指定长度。我很难在oracle文档中找到相关信息。

“oracle数据库从调用过程的环境中获取参数的长度、精度和比例。”

请看看这个

参考:
请在语义/参数/数据类型下查看。

不同之处在于子程序标题具有正式参数,在调用子程序时,这些参数将替换为实际参数:

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;
形式参数是不受约束的(但可以使用受约束的子类型),还包括有关参数模式和可能的默认值的信息,这些信息在声明变量时不相关

形式参数和实际参数的数据类型不必相同,但必须兼容

还有很多其他的细节,但它们可以从本章中阅读。请特别参阅子程序参数

我不知道为什么形式参数必须是无约束的,但我很满意,因为它从子程序头中删除了(不必要的)细节,使其更抽象一些