V_SPACE CHAR(1) := ' ';
V_AP CHAR(1) := ''''; FETCH CUR_COLUMN INTO LEN_CHK_COL;
WHILE CUR_COLUMN%FOUND LOOP V_SQL := 'UPDATE T_ITEM_BASIC_WORK_TXN ';
V_SQL := V_SQL || 'SET DATA_LENGTH_CHK = DATA_LENGTH_CHK || ' || V_AP || V_SPACE || LEN_CHK_COL.COLUMN_NAME || V_AP || ',';
V_SQL := V_SQL || ' ERR_FLG = ' || V_AP || '1' || V_AP;
V_SQL := V_SQL || ' WHERE LENGTH(' || LEN_CHK_COL.COLUMN_NAME || ') > ' || TO_CHAR(LEN_CHK_COL.COL_SIZE);
V_SQL := V_SQL || ' AND OPERATE_CODE IN (' || V_AP || 'A' || V_AP || ',' || V_AP || 'M' || V_AP || ')';
V_SQL := V_SQL || ' AND JOB_SEQ = ' || Action_Num ; EXECUTE IMMEDIATE V_SQL;这么多单引号串联什么意思啊?
V_AP CHAR(1) := ''''; FETCH CUR_COLUMN INTO LEN_CHK_COL;
WHILE CUR_COLUMN%FOUND LOOP V_SQL := 'UPDATE T_ITEM_BASIC_WORK_TXN ';
V_SQL := V_SQL || 'SET DATA_LENGTH_CHK = DATA_LENGTH_CHK || ' || V_AP || V_SPACE || LEN_CHK_COL.COLUMN_NAME || V_AP || ',';
V_SQL := V_SQL || ' ERR_FLG = ' || V_AP || '1' || V_AP;
V_SQL := V_SQL || ' WHERE LENGTH(' || LEN_CHK_COL.COLUMN_NAME || ') > ' || TO_CHAR(LEN_CHK_COL.COL_SIZE);
V_SQL := V_SQL || ' AND OPERATE_CODE IN (' || V_AP || 'A' || V_AP || ',' || V_AP || 'M' || V_AP || ')';
V_SQL := V_SQL || ' AND JOB_SEQ = ' || Action_Num ; EXECUTE IMMEDIATE V_SQL;这么多单引号串联什么意思啊?
比如说要拼个语句 select * from a where temp='1234'
用动态sql 拼,1234是个变量的拼法temp_sql:='select * from a where temp='''||temp_str||'''';
看到嘛,只有拼单独的引号才会出现4个,'select * from a where temp=''',这部分里,前面是一个,后面是三个,
后面三个里,前两个表示是字符串里的',后面一个与第一个对应的,反正一个字符串必定是前一个,后一个
原则如下
如果是在字符串当中,原来一个的变成两个
如果是字符串开头或者结尾的,就变成三个
如果字符串单独是个',就变成4个
select * from a where temp='1234'
变成动态sql无变量后
'select * from a where temp=''1234'''
1234是变量
'select * from a where temp='''||1234||''''
如果是字符串开头或者结尾的,就变成三个 按着这句话select * from a where temp='1234'中的'1234'不是变成
'' ¦ ¦temp_str ¦ ¦'''了吗?前两个后三个,'' ¦ ¦temp_str ¦ ¦'''中,前面的引号是字符串中间的引号变2,后面的引号是结尾的引号变3,
在考虑select前面加了引号,后面要补一个,结果成了
temp_sql:='select * from a where temp=''' ¦ ¦temp_str ¦ ¦''';前三后三阿请指教我哪里理解错了?如果字符串单独是个',就变成4个,怎么理解单独?'1234'的情况总是和字符串连着,不算单独把?
如果 v_Date 是2007/10/01
实际上是v_SDate= TO_DATE('2007/10/01','YYYY/MM/DD')
你不如这样理解,对于一个字符串'...',在内容中如果再出现了',就需要再前面再加一个',可以理解为转义字符。
所以
temp_sql:='select * from a where temp='''¦¦temp_str¦¦'''
应该是前3后4
temp_sql:='select * from a where temp='''¦¦temp_str¦¦''''你可以使用PL/SQL Developer之类的东西,在窗口中编辑,引号用的不对可以直接看出来
v_SDate := to_date ( ' ¦ ¦'''' ¦ ¦ v_Date ¦ ¦'''' ¦ ¦ ' ,' ¦ ¦'''' ¦ ¦'YYYY/MM/DD' ¦ ¦'''' ¦ ¦ ')
还是
v_SDate := to_date ( ' ¦ ¦'''' ¦ ¦ v_Date ¦ ¦'''' ¦ ¦ ' ,' ¦ ¦'''' ¦ ¦YYYY/MM/DD ¦ ¦'''' ¦ ¦ ')区别YYYY/MM/DD处的单引号没了,请指教,出现了那单引号我就又不明白了
你这好像不是动态sql啊,无非就是里面的2007/10/01是个变量而已,你这v_sdate是date型的吧
v_SDate:= TO_DATE(v_date,'YYYY/MM/DD')如果要变成动态sql(v_sdate应该是string类型的)
v_SDate:='to_date('''||v_date||''',''YYYY/MM/DD'')'
UPDATE T_ITEM_BASIC_WORK_TXN
SET DATA_LENGTH_CHK =
DATA_LENGTH_CHK ¦¦
变量1/*= (V_AP ¦ ¦ V_SPACE ¦ ¦ LEN_CHK_COL.COLUMN_NAME ¦ ¦ V_AP ¦ ¦ )*/ ,
ERR_FLG = 变量2/*=( V_AP ¦ ¦ '1' ¦ ¦ V_AP)*/
WHERE LENGTH(
变量3/*=( LEN_CHK_COL.COLUMN_NAME )*/
) > 变量4/*=( TO_CHAR(LEN_CHK_COL.COL_SIZE))*/
AND OPERATE_CODE IN (
变量5/*=( V_AP ¦ ¦ 'A' ¦ ¦ V_AP ¦ ¦ ',' ¦ ¦ V_AP ¦ ¦ 'M' ¦ ¦ V_AP )*/
)
AND JOB_SEQ = 变量6/*=(Action_Num)*/
UPDATE t_item_basic_work_txn
SET data_length_chk = data_length_chk || 变量1,
err_flg = 变量2
WHERE LENGTH (变量3) > 变量4 AND operate_code IN (变量5) AND job_seq = 变量6变量1= (V_AP ¦ ¦ V_SPACE ¦ ¦ LEN_CHK_COL.COLUMN_NAME ¦ ¦ V_AP ¦ ¦ )
变量2=( V_AP ¦ ¦ '1' ¦ ¦ V_AP)
变量3=( LEN_CHK_COL.COLUMN_NAME )
变量4=( TO_CHAR(LEN_CHK_COL.COL_SIZE))
变量5=( V_AP ¦ ¦ 'A' ¦ ¦ V_AP ¦ ¦ ',' ¦ ¦ V_AP ¦ ¦ 'M' ¦ ¦ V_AP )
变量6=(Action_Num)
V_AP CHAR(1) := ''''; 解析后,比如变量1= (V_AP ¦ ¦ V_SPACE ¦ ¦ LEN_CHK_COL.COLUMN_NAME ¦ ¦ V_AP ¦ ¦ )
= (''''¦ ¦ ''¦ ¦ LEN_CHK_COL.COLUMN_NAME ¦ ¦ '''' ¦ ¦ )
变量2=( V_AP ¦ ¦ '1' ¦ ¦ V_AP) = (''''¦ ¦ '1' ¦ ¦ '''')
变量5=( V_AP ¦ ¦ 'A' ¦ ¦ V_AP ¦ ¦ ',' ¦ ¦ V_AP ¦ ¦ 'M' ¦ ¦ V_AP ) =
( '''' ¦ ¦ 'A' ¦ ¦ '''' ¦ ¦ ',' ¦ ¦ '''' ¦ ¦ 'M' ¦ ¦ '''' )真不好理解,哎,谢谢各位热心的为我帮忙,准备结贴
再解释一下,||拼接的是一个个的字符串或者变量;
也就是说在你的动态sql中,||分割的每个部分都是一个独立的字符串或者变量,
而字符串的表示是用一对单引号括起来,那么如果字符串里面有了单引号怎么办呢,
就在那个单引号前再加一个单引号,使得编译出来的sql字符串中那个地方出现一个'
但是'||'会出现字符串||你一开始给出的语句可以运行吗?
V_SQL := V_SQL¦¦'SET DATA_LENGTH_CHK = DATA_LENGTH_CHK¦¦'¦¦V_AP¦¦V_SPACE¦¦LEN_CHK_COL.COLUMN_NAME¦¦V_AP¦¦',';
这一句好像拼出来不对吧