Oracle PL/SQL之VARCHAR2 QUALIFIER


在声明VARCHAR2变量时,我们可以指定其最大长度单位为CHAR:v1 VARCHAR2(2 CHAR); 或BYTE:v2 VARCHAR2(2 BYTE); ,

大多数默认什么都不指定:v3 VARCHAR2(2); 。 那么这三者有什么区别呢? 请看例子:

  1. DECLARE  
  2.   v1 VARCHAR2(2 CHAR);  
  3.   v2 VARCHAR2(2 BYTE);  
  4.   v3 VARCHAR2(2);  
  5. BEGIN  
  6.   
  7.   <<v1_test>>  
  8.   BEGIN  
  9.     v1 := '测试';  
  10.     dbms_output.put_line('v1_test successed, v1=' || v1);  
  11.   EXCEPTION  
  12.     WHEN OTHERS THEN  
  13.       dbms_output.put_line('v1_test failed, =>' ||  
  14.                            dbms_utility.format_error_stack);  
  15.   END;  
  16.   
  17.   <<v2_test>>  
  18.   BEGIN  
  19.     v2 := '测试';  
  20.     dbms_output.put_line('v2_test successed, v2=' || v2);  
  21.   EXCEPTION  
  22.     WHEN OTHERS THEN  
  23.       dbms_output.put_line('v2_test failed, =>' ||  
  24.                            dbms_utility.format_error_stack);  
  25.   END;  
  26.   
  27.   <<v3_test>>  
  28.   DECLARE  
  29.     l_default_qualifier nls_session_parameters.VALUE%TYPE;  
  30.   BEGIN  
  31.     --we can get the default qualifier by querying nls_session_parameters.  
  32.     SELECT VALUE  
  33.     INTO   l_default_qualifier  
  34.     FROM   nls_session_parameters  
  35.     WHERE  parameter = 'NLS_LENGTH_SEMANTICS';  
  36.     dbms_output.put_line('v3_test, l_default_qualifier=' ||  
  37.                          l_default_qualifier);  
  38.     
  39.     v3 := '测试';  
  40.     dbms_output.put_line('v3_test successed, v3=' || v3);  
  41.   EXCEPTION  
  42.     WHEN OTHERS THEN  
  43.       dbms_output.put_line('v3_test failed, =>' ||  
  44.                            dbms_utility.format_error_stack);  
  45.   END;  
  46. END;  

输出:

  1. v1_test successed, v1=测试  
  2. v2_test failed, =>ORA-06502: PL/SQL: numeric or value error: character string buffer too small  
  3.   
  4. v3_test, l_default_qualifier=BYTE  
  5. v3_test failed, =>ORA-06502: PL/SQL: numeric or value error: character string buffer too small

相关内容