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

时间:2014-02-26 18:35:05

标签: oracle plsql varchar2

假设你有这个程序:

PROCEDURE f (param VARCHAR2)
IS 
   var VARCHAR2(10);
BEGIN
   var := 'hi';
END f;

我想了解为什么var需要指定长度,但param没有。我很难在oracle文档中找到相关信息。

2 个答案:

答案 0 :(得分:4)

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

请查看此related question

参考:Oracle® Database SQL Reference 10g Release 2 (10.2) 请查看semantics / argument / datatype。

答案 1 :(得分:3)

不同之处在于,当调用子程序时,子程序标题的形式参数实际参数替换:

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 Subprograms的章PL/SQL Language Reference中阅读。请参阅特别是子程序参数

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