正如我在 cmets 中告诉您的,让我向您展示一种实现此目的的方法,即使用 Oracle 中的函数替换 CLOB 字段中的任何字符
在下面的演示中,我使用 Oracle 12cR2 和 AL32UTF8 作为字符集。
SQL> create table dptos ( c1 number , c2 number , c3 clob );
Table created.
SQL> insert into dptos values ( 1 , 1, 'Clob Example with Ascii extended character € here' );
1 row created.
SQL> commit ;
Commit complete.
SQL> select * from dptos ;
C1 C2
---------- ----------
C3
--------------------------------------------------------------------------------
1 1
Clob Example with Ascii extended character € here
我的函数将模式(可以是字符或 ascii 函数)替换为另一个字符串或什么都没有
CREATE OR REPLACE FUNCTION CLOBREPLACE (p_input CLOB
, p_pattern VARCHAR2
, p_substitute CLOB)
RETURN CLOB
IS
C_MAXLEN CONSTANT NUMBER := 32000;
v_fclob CLOB := p_input;
v_foffset INTEGER;
v_fchunk CLOB;
BEGIN
IF LENGTH (p_substitute) > C_MAXLEN
THEN
v_foffset := 1;
v_fclob := REPLACE (v_fclob, p_pattern, '###CLOBREPLACE###');
<<replace_by_loop>>
WHILE v_foffset <= LENGTH (p_substitute)
LOOP
v_fchunk :=
SUBSTR (p_substitute, v_foffset, C_MAXLEN)
|| '###CLOBREPLACE###';
v_fclob := REGEXP_REPLACE (v_fclob, '###CLOBREPLACE###', v_fchunk);
v_foffset := v_foffset + C_MAXLEN;
END LOOP replace_by_loop;
v_fclob := REGEXP_REPLACE (v_fclob, '###CLOBREPLACE###', '');
ELSE
v_fclob := REPLACE (v_fclob, p_pattern, p_substitute);
END IF;
RETURN v_fclob;
END clobreplace;
/
让我们检查一下
SQL> select c1 , c2, clobreplace ( c3 , '€' , 'Euros' ) from dptos ;
C1 C2
---------- ----------
CLOBREPLACE(C3,'€','EUROS')
--------------------------------------------------------------------------------
1 1
Clob Example with Ascii extended character Euros here
如果您在从 sqoop 调用函数时遇到问题,您始终可以使用 select 创建一个视图,然后在该视图上运行 sqoop。