动态sql可以改成如下的形式
declare
  sql  varchar(4000);
begin
  sql := 'select username,';
  sql := sql || 'sum(decode(procductname,'|| '''' ||procedurtname||''''||' 1, 0)) as '||procedurtname||' from buyinfo group by username' ;
  execute immediate sql;
end if;

解决方案 »

  1.   

    dbms_sql , there are plenty of example
      

  2.   

    declare
      sql  varchar(4000);
    begin
    sql := 'select username,';
    sql := sql || 'sum(decode(procductname,'||procedurtname||', 1, 0))  procedurtname from buyinfo group by username' ;
    execute immediate sql;
    end;
    /
    请解释set @sql=left(@sql,len(@sql)-1)+'from buyinfo group by username'作用
      

  3.   

    有一些笔误:
    动态sql可以改成如下的形式
    declare
      sql  varchar(4000);
    begin
      sql := 'select username,';
      sql := sql || 'sum(decode(procductname,'|| '''' || procedurtname || ''''||', 1, 0)) as '||procedurtname||' from buyinfo group by username' ;
      execute immediate sql;
    end ;
    /
      

  4.   

    set @sql=left(@sql,len(@sql)-1)+'from buyinfo group by username'作用
    赋值,去掉了最后一个","错误提示:
    Lastdrop(空杯) 必须说明标识符procedurtname
      

  5.   

    procedurtname倒底是变量还是什么?你得声明。
      

  6.   

    源:select 'sum(case when procductname='''+procedurtname+'''
     then 1 else 0 end) as '+procedurtname+',' from procduct
    procedurtname是表procduct的字段。
    我怎么声明?
      

  7.   

    这样可有点麻烦,我以为procedurtname是变量,那么
    select @sql=@sql+'sum(case when procductname='''+procedurtname+'''
     then 1 else 0 end) as '+procedurtname+',' from procduct这句的作用是什么,MSSQL我也用过,这个好像有点不大明白。
      

  8.   

    sql:='select username,sum(decode(procductname,'||v_procedurtname||', 1, 0)) as procedurtname from buyinfo group by username';
    最好变量设成v_procedurtname,容易区分,至于到了oracle编译为以上句法.
      

  9.   

    --这样可有点麻烦,我以为procedurtname是变量,那么
    --select @sql=@sql+'sum(case when procductname='''+procedurtname+'''
    -- then 1 else 0 end) as '+procedurtname+',' from procduct--这句的作用是什么,MSSQL我也用过,这个好像有点不大明白。这句的作用就是把
    select 'sum(case when procductname='''+procedurtname+'''
     then 1 else 0 end) as '+procedurtname+',' from procduct
    出来的结果赋值给变量@sql.
      

  10.   

    明白了,那就用cursor 吧。
    declare
      sql  varchar(4000);
      v_procedurtname  varchar(255);
      cursor pro_cur is select procedurtname from procduct;
    begin
      sql := 'select username ';
      open pro_cur;
      loop
        fetch pro_cur into v_procedurtname;
        exit when pro_cur%NOTFOUND;
        sql := sql || ', sum(decode(procductname,'|| '''' ||  
           v_procedurtname || ''''||', 1, 0)) as '||v_procedurtname ;  
      end loop;
      close pro_cur;
      sql := sql || ' from buyinfo group by username' ;
      execute immediate sql;
    end ;
    /