在ORACLE中,单引号有两个作用,一是字符串是由单引号引用,二是转义。单引号的使用是就近配对,即就近原则。而在单引号充当转义角色时相对不好理解
1、从第二个单引号开始被视为转义符,如果第二个单引号后面还有单引号(哪怕只有一个)。
select '''' from dual ----output:'
解释:第二个单引号被作为转义符,第三个单引号被转义,可将sql写成这样更好理解:
select ' '' ' from dual ----output:'
2、连接符‘||’导致了新一轮的转义:连接符号‘||’左右的单引号没有任何的关系,除非‘||’是作为字符串的一部分(这在动态SQL中很常见)。
select 'name'||'''' from dual ----output:name'
理解:||后面的作为一个字符串,即前后是',中间又是一个密集型单引号串'',因此第一个为转义功能
select 'name''''' from dual ----output:name''
理解:第一个和最后一个单引号作为字符串引用符,中间四个单引号两两转义
例子:
select 'insert into wt_shipmentproduct (WT_SHIPMENTPRODUCT_ID, AD_CLIENT_ID, AD_ORG_ID, ISACTIVE, CREATED, CREATEDBY, UPDATED, UPDATEDBY, M_PRODUCT_ID, WT_OWMS_SHIPMENT_ID, WT_OFC_ID, QTY, CONFIRMQTY, NAME)' ||
'values (wt_shipmentproduct_seq.nextval, 11, 50000, ''Y'', sysdate, 1000180, sysdate, 1002382, (select M_PRODUCT_ID from M_PRODUCT p where p.sku = ''' ||
m.sku ||
'''), (select WT_OWMS_SHIPMENT_id from WT_OWMS_SHIPMENT s where s.documentno = ''' ||
m.documentno ||
'''),(select wt_ofc_id from WT_OWMS_SHIPMENT where documentno=''' ||
m.documentno || '''), ' || m.qtyproduct || ', 0, ''' || m.name ||
''');'
,
m.qtyproduct
from adempiere.wv_owms_arrivalnoticeproduct m
where m.documentno in ('1000768')