就像只在 Oracle 10g 中引入了本机函数并支持 SQL 和 PL/SQL 中的正则表达式,我用来解决我在 plsql 中的问题的一个选项是创建一个函数:
create or replace function scase(s in varchar2) return varchar2 as
s_len number;
cur char(2); /*char(2) for accented character */
up boolean;
terminal char(10) := '.?!]';
r varchar2(32767);
begin
s_len := length(trim(s));
if s_len = 0 then
return r;
end if;
r := r || UPPER(substr(s, 0, 1)); /*First character of sentence*/
for i in 2 .. s_len loop
cur := substr(s, i, 1);
if up = TRUE then
if cur = ' ' then
r := r || ' ';
else
r := r || Upper(trim(cur));
up := FALSE;
end if;
else
if cur = ' ' then
r := r || ' ';
else
r := r || Lower(trim(cur));
end if;
end if;
/*I have found a bug here(Oracle 8i): instr return 7 when is ' ' (blank space) */
if instr(terminal, trim(cur)) between 1 and 6 then
up := TRUE;
end if;
end loop;
return r;
exception
when others then
raise;
end;
另一种选择是在 java 2 中创建一个类。2000 年 8 月的最后一个版本的 Oracle 8i (8.1.7) 支持 java 2。
因此,您可以在 java 中创建代码,如下所示:
create or replace and compile java source named tosentencecase as
public class toSentenceCase
{
public static String toSentenceCase(String s) {
String r = "";
if (s.length() == 0) {
return r;
}
char c1 = s.charAt(0);
r = r + Character.toUpperCase(c1); /*First character of sentence*/
boolean up = false;
char[] terminal = {'.', '?', '!'};
for (int i = 1; i < s.length(); i++) {
char cur = s.charAt(i);
if (up) {
if (cur == ' ') {
r = r + cur;
} else {
r = r + Character.toUpperCase(cur);;
up = false;
}
} else {
r = r + Character.toLowerCase(cur);;
}
for (int j = 0; j < terminal.length; j++) {
if (cur == terminal[j]) {
up = true;
break;
}
}
}
return r;
}
}
在创建一个调用该代码的函数之后,如下所示:
CREATE OR REPLACE FUNCTION toSentenceCase (s IN STRING) RETURN STRING
AS LANGUAGE JAVA
NAME 'toSentenceCase.toSentenceCase (java.lang.String) return String';
之后就像普通函数一样调用:
Connected to Oracle8i Enterprise Edition Release 8.1.7.3.0
SQL> Select toSentenceCase('PEDIDO CANCELADO, DEVIDO AO ENCERRAMENTO DE INVESTIMENTO. SERÁ GERADA UMA NOVA REQUISIÇÃO PARA REGULARIZAR ESTA QUESTÃO.')
2 from dual;
TOSENTENCECASE('PEDIDOCANCELAD
--------------------------------------------------------------------------------
Pedido cancelado, devido ao encerramento de investimento. Será gerada uma nova r
SQL>
PS:使用 java 2(嵌入在 Oracle 8i 中)我尝试了 import java.util.regex.Matcher 和 import java.util.regex.Pattern 但无法编译代码以使用正则表达式。