procedure procunit
as
sqlstr varchar2(2000):='create or replace view v_tmp as select "d.drugdesc"';
begin
  for cur1 in (select distinct u.class from unit u)
  loop
    sqlstr:=sqlstr||',count(decode(u.class,'||cur1.class||',1))"'||cur1.class||'"';
  end loop;
  sqlstr:=sqlstr||' from casecrime_drug c  left join cddrug d on c.drugid=d.drugid
left join casesecurity y on y.caseno=c.caseno 
left join unit u on u.unitid=y.inputunitid 
left join suspect s on s.caseno=y.caseno 
group by d.drugdesc';
DBMS_OUTPUT.PUT_LINE(sqlstr);
  execute immediate sqlstr;
end;
这个存储过程怎么执行不了的,谁懂帮我修改下,我在sql navigator 5中执行不了这是怎么回事!急死人了。

解决方案 »

  1.   

    1、创建procedure语法是:create or replace procedure procunit as。
    2、Oracle中两个单引号为一个“'”,因此你过程中的动态SQL拼接有问题,你可以看你DBMS_OUTPUT.PUT_LINE(sqlstr);输出的SQL语句是不是你想要的,你就知道了
      

  2.   

    CREATE OR REPLACE PROCEDURE procunit AS
      sqlstr VARCHAR2(2000) := 'create or replace view v_tmp as select d.drugdesc';
    BEGIN
      FOR cur1 IN (SELECT DISTINCT u.class FROM unit u) LOOP
        sqlstr := sqlstr || ',count(decode(u.class,' || cur1.class || ',1)) ' || cur1.class;
      END LOOP;
      sqlstr := sqlstr || ' from casecrime_drug c left join cddrug d on c.drugid=d.drugid
                          left join casesecurity y on y.caseno=c.caseno 
                          left join unit u on u.unitid=y.inputunitid 
                          left join suspect s on s.caseno=y.caseno 
                          group by d.drugdesc';
      DBMS_OUTPUT.PUT_LINE(sqlstr);
      EXECUTE IMMEDIATE sqlstr;
    END;
      

  3.   

    --如果class为varchar2型,应该这样
    CREATE OR REPLACE PROCEDURE procunit AS
      sqlstr VARCHAR2(2000) := 'create or replace view v_tmp as select d.drugdesc';
    BEGIN
      FOR cur1 IN (SELECT DISTINCT u.class FROM unit u) LOOP
        sqlstr := sqlstr || ',count(decode(u.class,''' || cur1.class || ''',1)) ' || cur1.class;
      END LOOP;
      sqlstr := sqlstr || ' from casecrime_drug c left join cddrug d on c.drugid=d.drugid
                          left join casesecurity y on y.caseno=c.caseno 
                          left join unit u on u.unitid=y.inputunitid 
                          left join suspect s on s.caseno=y.caseno 
                          group by d.drugdesc';
      DBMS_OUTPUT.PUT_LINE(sqlstr);
      EXECUTE IMMEDIATE sqlstr;
    END;
      

  4.   

    那是怎么执行存储过程呢???
    我这样exec procunit;  执行调试查看结果集不得,这是为什么呢?是怎么执行的呀
    真是急死人了