您可以敲出自己的测试用例来证明这一点,这并不难。但是,既然你没有,这里有一个显示差异:
DECLARE
v_input_str VARCHAR2(4) := 'abcd';
v_p_char CHAR(10);
v_p_vchar VARCHAR2(10);
v_ret_char CHAR(20);
v_ret_vchar VARCHAR2(20);
FUNCTION my_func_1(pi_param CHAR) RETURN CHAR
IS
v_var CHAR(10);
BEGIN
v_var := pi_param;
dbms_output.put_line(' my_func_1: length(pi_param) = '||LENGTH(pi_param));
dbms_output.put_line(' my_func_1: length(v_var) = '||LENGTH(v_var));
RETURN v_var;
END my_func_1;
FUNCTION my_func_2(pi_param CHAR) RETURN VARCHAR2
IS
v_var VARCHAR2(10);
BEGIN
v_var := pi_param;
dbms_output.put_line(' my_func_2: length(pi_param) = '||LENGTH(pi_param));
dbms_output.put_line(' my_func_2: length(v_var) = '||LENGTH(v_var));
RETURN v_var;
END my_func_2;
FUNCTION my_func_3(pi_param VARCHAR2) RETURN VARCHAR2
IS
v_var VARCHAR2(10);
BEGIN
v_var := pi_param;
dbms_output.put_line(' my_func_3: length(pi_param) = '||LENGTH(pi_param));
dbms_output.put_line(' my_func_3: length(v_var) = '||LENGTH(v_var));
RETURN v_var;
END my_func_3;
FUNCTION my_func_4(pi_param VARCHAR2) RETURN CHAR
IS
v_var CHAR(10);
BEGIN
v_var := pi_param;
dbms_output.put_line(' my_func_4: length(pi_param) = '||LENGTH(pi_param));
dbms_output.put_line(' my_func_4: length(v_var) = '||LENGTH(v_var));
RETURN v_var;
END my_func_4;
BEGIN
v_p_char := v_input_str;
v_p_vchar := v_input_str;
dbms_output.put_line('length(v_p_char) = '||length(v_p_char));
dbms_output.put_line('length(v_p_vchar) = '||length(v_p_vchar));
v_ret_char := my_func_1(v_p_char);
dbms_output.put_line('my_func_1, v_p_char input, char output: length(v_ret_char) = '||length(v_ret_char));
v_ret_vchar := my_func_1(v_p_char);
dbms_output.put_line('my_func_1, v_p_char input, char output: length(v_ret_vchar) = '||length(v_ret_vchar));
v_ret_char := my_func_1(v_p_vchar);
dbms_output.put_line('my_func_1, v_p_vchar input, char output: length(v_ret_char) = '||length(v_ret_char));
v_ret_vchar := my_func_1(v_p_vchar);
dbms_output.put_line('my_func_1, v_p_vchar input, char output: length(v_ret_vchar) = '||length(v_ret_vchar));
v_ret_char := my_func_2(v_p_char);
dbms_output.put_line('my_func_2, v_p_char input, varchar output: length(v_ret_char) = '||length(v_ret_char));
v_ret_vchar := my_func_2(v_p_char);
dbms_output.put_line('my_func_2, v_p_char input, varchar output: length(v_ret_vchar) = '||length(v_ret_vchar));
v_ret_char := my_func_2(v_p_vchar);
dbms_output.put_line('my_func_2, v_p_vchar input, varchar output: length(v_ret_char) = '||length(v_ret_char));
v_ret_vchar := my_func_2(v_p_vchar);
dbms_output.put_line('my_func_2, v_p_vchar input, varchar output: length(v_ret_vchar) = '||length(v_ret_vchar));
v_ret_char := my_func_3(v_p_char);
dbms_output.put_line('my_func_3, v_p_char input, varchar output: length(v_ret_char) = '||length(v_ret_char));
v_ret_vchar := my_func_3(v_p_char);
dbms_output.put_line('my_func_3, v_p_char input, varchar output: length(v_ret_vchar) = '||length(v_ret_vchar));
v_ret_char := my_func_3(v_p_vchar);
dbms_output.put_line('my_func_3, v_p_vchar input, varchar output: length(v_ret_char) = '||length(v_ret_char));
v_ret_vchar := my_func_3(v_p_vchar);
dbms_output.put_line('my_func_3, v_p_vchar input, varchar output: length(v_ret_vchar) = '||length(v_ret_vchar));
v_ret_char := my_func_4(v_p_char);
dbms_output.put_line('my_func_4, v_p_char input, char output: length(v_ret_char) = '||length(v_ret_char));
v_ret_vchar := my_func_4(v_p_char);
dbms_output.put_line('my_func_4, v_p_char input, char output: length(v_ret_vchar) = '||length(v_ret_vchar));
v_ret_char := my_func_4(v_p_vchar);
dbms_output.put_line('my_func_4, v_p_vchar input, char output: length(v_ret_char) = '||length(v_ret_char));
v_ret_vchar := my_func_4(v_p_vchar);
dbms_output.put_line('my_func_4, v_p_vchar input, char output: length(v_ret_vchar) = '||length(v_ret_vchar));
END;
/
输出是:
length(v_p_char) = 10
length(v_p_vchar) = 4
my_func_1: length(pi_param) = 10
my_func_1: length(v_var) = 10
my_func_1, v_p_char input, char output: length(v_ret_char) = 20
my_func_1: length(pi_param) = 10
my_func_1: length(v_var) = 10
my_func_1, v_p_char input, char output: length(v_ret_vchar) = 10
my_func_1: length(pi_param) = 4
my_func_1: length(v_var) = 10
my_func_1, v_p_vchar input, char output: length(v_ret_char) = 20
my_func_1: length(pi_param) = 4
my_func_1: length(v_var) = 10
my_func_1, v_p_vchar input, char output: length(v_ret_vchar) = 10
my_func_2: length(pi_param) = 10
my_func_2: length(v_var) = 10
my_func_2, v_p_char input, varchar output: length(v_ret_char) = 20
my_func_2: length(pi_param) = 10
my_func_2: length(v_var) = 10
my_func_2, v_p_char input, varchar output: length(v_ret_vchar) = 10
my_func_2: length(pi_param) = 4
my_func_2: length(v_var) = 4
my_func_2, v_p_vchar input, varchar output: length(v_ret_char) = 20
my_func_2: length(pi_param) = 4
my_func_2: length(v_var) = 4
my_func_2, v_p_vchar input, varchar output: length(v_ret_vchar) = 4
my_func_3: length(pi_param) = 10
my_func_3: length(v_var) = 10
my_func_3, v_p_char input, varchar output: length(v_ret_char) = 20
my_func_3: length(pi_param) = 10
my_func_3: length(v_var) = 10
my_func_3, v_p_char input, varchar output: length(v_ret_vchar) = 10
my_func_3: length(pi_param) = 4
my_func_3: length(v_var) = 4
my_func_3, v_p_vchar input, varchar output: length(v_ret_char) = 20
my_func_3: length(pi_param) = 4
my_func_3: length(v_var) = 4
my_func_3, v_p_vchar input, varchar output: length(v_ret_vchar) = 4
my_func_4: length(pi_param) = 10
my_func_4: length(v_var) = 10
my_func_4, v_p_char input, char output: length(v_ret_char) = 20
my_func_4: length(pi_param) = 10
my_func_4: length(v_var) = 10
my_func_4, v_p_char input, char output: length(v_ret_vchar) = 10
my_func_4: length(pi_param) = 4
my_func_4: length(v_var) = 10
my_func_4, v_p_vchar input, char output: length(v_ret_char) = 20
my_func_4: length(pi_param) = 4
my_func_4: length(v_var) = 10
my_func_4, v_p_vchar input, char output: length(v_ret_vchar) = 10
CHAR 和 VARCHAR 之间的区别在于 CHAR 会将填充字符串间隔到变量/列的全宽。这可能对报告有用,但总的来说,这意味着您正在浪费内存来存储所有额外的空间。
从上面的输出中,您可以看到,当您将四个字符的字符串存储在 CHAR(20) 变量中时,该变量的长度为 20 - 您原来的四个字符,加上 16 个空格。 VARCHAR2(20) 变量中对应的字符串长度为 4。
我创建的函数将输入字符串(CHAR(10) 或 VARCHAR2(10))放入变量(CHAR(10) 或 VARCHAR2(10))中,然后将其传递给变量(CHAR(20) 或 VARCHAR2(20))。
您可以看到,在函数返回变量时,长度是 4 或 10,但是当保存返回值的变量的长度是 4、10 或 20 时。
您可以看到 VARCHAR2 变量不会改变变量的长度,但只要将 CHAR 变量添加到组合中,长度就会增加。
简而言之,只有在没有其他选择的情况下才使用 CHAR。否则,使用 VARCHAR2。
你说你只关心学习函数参数和返回类型,而不是变量,但它们是一回事!