在 PL/SQL 中转义下划线
Escape underscore in PL/SQL
我有一个类似这样的 oracle 触发器:
AFTER INSERT OR UPDATE ON TABLE_ABC FOR EACH ROW
BEGIN
IF (:new.COLUMN_A LIKE '%_H') THEN
INSERT INTO TABLE_DEF (ID, COLUMN_B) VALUES (SEQ_DEF.NEXTVAL, :new.COLUMN_B);
END IF;
END;
现在我想转义 like 子句中的下划线,以便此触发器只处理 'ABCD_H' 或 COLUMN_A 中的“1234_H”等值,而不处理此类值作为“1234H”。
对于给定的示例,我该如何实现?
您可以使用转义子句:
if :new.column_a LIKE '%\_H' escape '\' then
另一种选择是只提取最后两个字符:
if substr(:new.column_a, -2) = '_H' then
如果substr()
的参数为负数,Oracle将从右端提取指定数量的字符。
IF (:new.COLUMN_A LIKE '%_H')
您可以使用 ESCAPE 关键字。
例如
SQL> SET serveroutput ON
SQL> DECLARE
2 str VARCHAR2(10) := '_ ';
3 BEGIN
4 IF str LIKE '%\_ %' THEN
5 dbms_output.put_line('did not escape');
6 ELSIF str LIKE '%\_ %' ESCAPE '\' THEN
7 dbms_output.put_line('escaped');
8 END IF;
9 END;
10 /
escaped
PL/SQL procedure successfully completed.
在SQL*Plus中更简单,你可以这样做:
SET ESCAPE '\'
例如,
SQL> SET ESCAPE '\'
SQL> SET serveroutput ON
SQL> DECLARE
2 str VARCHAR2(10) := '_ ';
3 BEGIN
4 IF str LIKE '%\_ %' THEN
5 dbms_output.put_line('did not escape');
6 ELSIF str LIKE '%\_ %' ESCAPE '\' THEN
7 dbms_output.put_line('escaped');
8 END IF;
9 END;
10 /
did not escape
PL/SQL procedure successfully completed.
看,在 SQL*Plus 中它没有转到 ELSIF
部分,因为它可以在 IF
中转义以 SET ESCAPE '\'
为条件
我有一个类似这样的 oracle 触发器:
AFTER INSERT OR UPDATE ON TABLE_ABC FOR EACH ROW
BEGIN
IF (:new.COLUMN_A LIKE '%_H') THEN
INSERT INTO TABLE_DEF (ID, COLUMN_B) VALUES (SEQ_DEF.NEXTVAL, :new.COLUMN_B);
END IF;
END;
现在我想转义 like 子句中的下划线,以便此触发器只处理 'ABCD_H' 或 COLUMN_A 中的“1234_H”等值,而不处理此类值作为“1234H”。
对于给定的示例,我该如何实现?
您可以使用转义子句:
if :new.column_a LIKE '%\_H' escape '\' then
另一种选择是只提取最后两个字符:
if substr(:new.column_a, -2) = '_H' then
如果substr()
的参数为负数,Oracle将从右端提取指定数量的字符。
IF (:new.COLUMN_A LIKE '%_H')
您可以使用 ESCAPE 关键字。
例如
SQL> SET serveroutput ON
SQL> DECLARE
2 str VARCHAR2(10) := '_ ';
3 BEGIN
4 IF str LIKE '%\_ %' THEN
5 dbms_output.put_line('did not escape');
6 ELSIF str LIKE '%\_ %' ESCAPE '\' THEN
7 dbms_output.put_line('escaped');
8 END IF;
9 END;
10 /
escaped
PL/SQL procedure successfully completed.
在SQL*Plus中更简单,你可以这样做:
SET ESCAPE '\'
例如,
SQL> SET ESCAPE '\'
SQL> SET serveroutput ON
SQL> DECLARE
2 str VARCHAR2(10) := '_ ';
3 BEGIN
4 IF str LIKE '%\_ %' THEN
5 dbms_output.put_line('did not escape');
6 ELSIF str LIKE '%\_ %' ESCAPE '\' THEN
7 dbms_output.put_line('escaped');
8 END IF;
9 END;
10 /
did not escape
PL/SQL procedure successfully completed.
看,在 SQL*Plus 中它没有转到 ELSIF
部分,因为它可以在 IF
中转义以 SET ESCAPE '\'