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;这么多单引号串联什么意思啊?

解决方案 »

  1.   

    "'"相当于web中的双引号,"||"相当于web中的加号
      

  2.   

    连续四个只有单独出现引号时才用
    比如说要拼个语句 select * from a where temp='1234'
    用动态sql 拼,1234是个变量的拼法temp_sql:='select * from a where temp='''||temp_str||'''';
    看到嘛,只有拼单独的引号才会出现4个,'select * from a where temp=''',这部分里,前面是一个,后面是三个,
    后面三个里,前两个表示是字符串里的',后面一个与第一个对应的,反正一个字符串必定是前一个,后一个
      

  3.   

    动态SQL最搞的就是'的地方
    原则如下
    如果是在字符串当中,原来一个的变成两个
    如果是字符串开头或者结尾的,就变成三个
    如果字符串单独是个',就变成4个
      

  4.   

    原来没有,头和尾各加一个
    select * from a where temp='1234' 
    变成动态sql无变量后
    'select * from a where temp=''1234''' 
    1234是变量
    'select * from a where temp='''||1234||'''' 
      

  5.   

    如果是在字符串当中,原来一个的变成两个 
    如果是字符串开头或者结尾的,就变成三个 按着这句话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'的情况总是和字符串连着,不算单独把?
      

  6.   

      v_SDate :=  to_date ( '||''''|| v_Date ||''''|| ' ,' ||''''||'YYYY/MM/DD'||''''|| ') 
      如果 v_Date 是2007/10/01
      实际上是v_SDate= TO_DATE('2007/10/01','YYYY/MM/DD')
      

  7.   

    ...
    你不如这样理解,对于一个字符串'...',在内容中如果再出现了',就需要再前面再加一个',可以理解为转义字符。
    所以
    temp_sql:='select * from a where temp='''¦¦temp_str¦¦'''
    应该是前3后4
    temp_sql:='select * from a where temp='''¦¦temp_str¦¦''''你可以使用PL/SQL Developer之类的东西,在窗口中编辑,引号用的不对可以直接看出来
      

  8.   

    v_SDate= TO_DATE('2007/10/01','YYYY/MM/DD')变成动态SQL后到底是
    v_SDate :=  to_date ( ' ¦ ¦'''' ¦ ¦ v_Date ¦ ¦'''' ¦ ¦ ' ,' ¦ ¦'''' ¦ ¦'YYYY/MM/DD' ¦ ¦'''' ¦ ¦ ')
    还是
    v_SDate :=  to_date ( ' ¦ ¦'''' ¦ ¦ v_Date ¦ ¦'''' ¦ ¦ ' ,' ¦ ¦'''' ¦ ¦YYYY/MM/DD ¦ ¦'''' ¦ ¦ ')区别YYYY/MM/DD处的单引号没了,请指教,出现了那单引号我就又不明白了
      

  9.   

    v_SDate= TO_DATE('2007/10/01','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'')'
      

  10.   

    把你的动态SQL解析出来就是下面这样的
    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)*/
      

  11.   

    重新写一下,应该看得清楚点
    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)
      

  12.   

    V_SPACE          CHAR(1) := ' '; 
    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' ¦ ¦ '''' )真不好理解,哎,谢谢各位热心的为我帮忙,准备结贴
      

  13.   

    午睡归来,你举的那个to_date的例子不对啊
    再解释一下,||拼接的是一个个的字符串或者变量;
    也就是说在你的动态sql中,||分割的每个部分都是一个独立的字符串或者变量,
    而字符串的表示是用一对单引号括起来,那么如果字符串里面有了单引号怎么办呢,
    就在那个单引号前再加一个单引号,使得编译出来的sql字符串中那个地方出现一个'
    但是'||'会出现字符串||你一开始给出的语句可以运行吗?
     V_SQL := V_SQL¦¦'SET DATA_LENGTH_CHK = DATA_LENGTH_CHK¦¦'¦¦V_AP¦¦V_SPACE¦¦LEN_CHK_COL.COLUMN_NAME¦¦V_AP¦¦','; 
    这一句好像拼出来不对吧