CANONICALIZE 过程 - 使字符串规范化

CANONICALIZE 过程对输入字符串执行各种操作。

CANONICALIZE 过程对输入字符串执行下列操作:
  • 如果该字符串未加双引号,那么会验证它是否使用合法标识的字符。如果未使用合法标识的字符,那么会抛出异常。如果字符串加了双引号,那么允许使用所有字符。
  • 如果字符串未加双引号并且未包含句点,那么会将所有字母字符转换为大写并消除前导空格和结尾空格。
  • 如果字符串加了双引号并且未包含句点,那么会除去双引号。
  • 如果字符串包含句点并且字符串的各个部分都未加双引号,那么会将字符串的每个部分转换为大写并将每个部分括在双引号中。
  • 如果字符串包含句点并且字符串的某些部分加了双引号,那么返回时加了双引号的部分会保持不变(包括双引号),未加双引号的部分会转换为大写并括在双引号中。

语法

阅读语法图跳过直观语法图DBMS_UTILITY.CANONICALIZE( name,canon_name,canon_len )

参数

name
类型为 VARCHAR(1024) 的输入自变量,用于指定要规范化的字符串。
canon_name
类型为 VARCHAR(1024) 的输出自变量,用于返回规范化字符串。
canon_len
类型为 INTEGER 的输入自变量,用于指定 name 中从第一个字符开始规范化的字节数。

权限

对 DBMS_UTILITY 模块的 EXECUTE 特权。

示例

示例 1:以下过程对其输入参数应用 CANONICALIZE 过程并显示结果。
SET SERVEROUTPUT ON@

CREATE OR REPLACE PROCEDURE canonicalize(
  IN p_name VARCHAR(4096), 
  IN p_length INTEGER DEFAULT 30)
BEGIN
  DECLARE v_canon VARCHAR(100);

  CALL DBMS_UTILITY.CANONICALIZE(p_name, v_canon, p_length);
  CALL DBMS_OUTPUT.PUT_LINE('Canonicalized name ==>' || v_canon || '<==');
  CALL DBMS_OUTPUT.PUT_LINE('Length: ' || LENGTH(v_canon));
END@

CALL canonicalize('Identifier')@
CALL canonicalize('"Identifier"')@
CALL canonicalize('"_+142%"')@
CALL canonicalize('abc.def.ghi')@
CALL canonicalize('"abc.def.ghi"')@
CALL canonicalize('"abc".def."ghi"')@
CALL canonicalize('"abc.def".ghi')@
此示例生成以下输出:
SET SERVEROUTPUT ON
DB20000I  The SET SERVEROUTPUT command completed successfully.

CREATE OR REPLACE PROCEDURE canonicalize(
  IN p_name VARCHAR(4096), 
  IN p_length INTEGER DEFAULT 30)
BEGIN
  DECLARE v_canon VARCHAR(100);

  CALL DBMS_UTILITY.CANONICALIZE(p_name, v_canon, p_length);
  CALL DBMS_OUTPUT.PUT_LINE('Canonicalized name ==>' || v_canon || '<==');
  CALL DBMS_OUTPUT.PUT_LINE('Length: ' || LENGTH(v_canon));
END
DB20000I  The SQL command completed successfully.

CALL canonicalize('Identifier')

  Return Status = 0

Canonicalized name ==>IDENTIFIER<==
Length: 10

CALL canonicalize('"Identifier"')

  Return Status = 0

Canonicalized name ==>Identifier<==
Length: 10

CALL canonicalize('"_+142%"')

  Return Status = 0

Canonicalized name ==>_+142%<==
Length: 6

CALL canonicalize('abc.def.ghi')

  Return Status = 0

Canonicalized name ==>"ABC"."DEF"."GHI"<==
Length: 17

CALL canonicalize('"abc.def.ghi"')

  Return Status = 0

Canonicalized name ==>abc.def.ghi<==
Length: 11

CALL canonicalize('"abc".def."ghi"')

  Return Status = 0

Canonicalized name ==>"abc"."DEF"."ghi"<==
Length: 17

CALL canonicalize('"abc.def".ghi')

  Return Status = 0

Canonicalized name ==>"abc.def"."GHI"<==
Length: 15