我具有以下类型的pl-sql过程:
BEGIN
p_name_all VARCHAR2(20000 CHAR) ;
...
...
FOR name_rec IN name_cur
LOOP
IF (p_name_all IS NULL)
p_name_all := '//' || name_rec.NAME || '//';
select RTRIM('p_name_all','//') from dual;
....
....
END IF
END LOOP
END
当我尝试执行上述pl-sql过程时,它崩溃了。因此,我发现在遍历名称时,其中一个名称带有单引号,这就是我面临问题的原因。在这种情况下,如何转义单引号。
name.rec具有name1,name2,name3,..... 这些名字中没有一个是单引号,也不知道是哪个。我想在这里转义单引号。
答案 0 :(得分:0)
再添加一个单引号,并在字符串中加上引号,例如->是吗?
答案 1 :(得分:0)
使用 q报价机制(例如
)对其进行转义p_name_all := q'[blabla'''blabla]';
或者,在您的示例中(顺便说一句,由于它错过了declare
部分,而select
需要into
子句,因此无效):
DECLARE
p_name_all VARCHAR2 (20000 CHAR)
:= q'[Yun?i?e? Ki?ga?am//Birtaniya//Aupuni M?'? Hui P? 'ia//???????//Britania//Yun?ited Kingdam//???????? ??????//Egyesült Királyság//Aialand Ugwu//Bretland]';
l_result VARCHAR2 (20000 CHAR);
BEGIN
SELECT RTRIM (p_name_all, '//') INTO l_result FROM DUAL;
END;
[编辑]
嗯...不-恐怕您弄错了。 NAME中的单引号不会出现任何问题。这是一个工作示例,显示了您应该如何做(至少,我对问题的理解):
SQL> create table test (col varchar2(20));
Table created.
SQL> insert into test values ('littlefoot');
1 row created.
SQL> insert into test values ('big''foot');
1 row created.
SQL> set serveroutput on
SQL> declare
2 p_name_all varchar2(1000);
3 begin
4 for name_rec in (select col name from test) loop
5 p_name_all := p_name_all || '//' || name_rec.name ;
6 end loop;
7
8 p_name_all := rtrim(p_name_all, '//');
9 dbms_output.put_line('Result: ' || p_name_all);
10 end;
11 /
Result: //littlefoot//big'foot
PL/SQL procedure successfully completed.
SQL>