create or replace procedure PROC_PM002
(
 sStartDate       VARCHAR,
 sEndDate         VARCHAR,
 sDeptID          VARCHAR

is
  nTemp           NUMBER;
begin
     delete from GT_PM002;
     
     If sDeptID = '0' Then
        insert into GT_PM002
              select 
                  t1.DIC_ITEM_NAME,
                  (select count(*) 
                  from TB_DEMAND t2 
                  where t2.dem_applydeptname like '%' || t1.dic_item_name || '%'),0,0,0,0,0,0
              from TB_PUBLIC_DIC t1 
              where t1.dic_name = '需求提出单位';
     End If;
end PROC_PM002;

解决方案 »

  1.   

    支持楼上的
    不知道楼主说的错误信息是什么?
    另建议楼主把
    delete from GT_PM002;改成
    execute immediate 'truncate table tb';
    这样执行速度会快很多。
      

  2.   

    因为oracle没有String和Integer类型,只有varchar2(varchar)和number类型
      

  3.   

    slyfox123456() 
    更正一下,ORACLE中有String和IntegerSQL817> declare a string(9);
      2  b integer;
      3  begin
      4  a:='opi';
      5  b:=89;
      6  dbms_output.put_line(a);
      7  dbms_output.put_line(b);
      8  end;
      9  /
    opi
    89PL/SQL 过程已成功完成。SQL817>
      

  4.   

    支持 ORARichard(没钱的日子......) 删除垃圾数据的方式!
      

  5.   

    错误不是String和Integer!
    在PLSQL Developer里错误提示如下:Compilation errors for PROCEDURE PROMANAGER.PROC_PM002Error: PLS-00103: 出现符号 "SELECT"在需要下列之一时:
           (-+modnotnullothers
              <an identifier><a double-quoted delimited-identifier>
              <a bind variable>avgcountcurrentexistsmaxminpriorsqlstddev
              sumvarianceexecuteforalltimetimestampintervaldate
              <a string literal with character set specification>
              <a number><a single-quoted SQL string>
    Line: 16
    Text: (select count(*)Error: PLS-00103: 出现符号 ","在需要下列之一时:
           ;returnreturningandor
    Line: 18
    Text: where t2.dem_applydeptname like '%' || t1.dic_item_name || '%'),0,0,0,0,0,0Error: PLS-00103: 出现符号 "FROM"在需要下列之一时:
           ),
    Line: 19
    Text: from TB_PUBLIC_DIC t1
      

  6.   

    2 : ORARichard(没钱的日子......) delete from GT_PM002;改成
    execute immediate 'truncate table tb';上面建议不好
    如果出错不能回滚.
    而且会commit之前的语句,非常不妙.
    除非楼主没有事务处理
      

  7.   

    create or replace procedure PROC_PM002
    (
     sStartDate       VARCHAR,
     sEndDate         VARCHAR,
     sDeptID          VARCHAR

    is
      nTemp           NUMBER;
    begin
         delete from GT_PM002;
         
         If sDeptID = '0' Then
            insert into GT_PM002             
                  select 
                      t1.DIC_ITEM_NAME,t2.countnum
                      ,0,0,0,0,0,0
                  from TB_PUBLIC_DIC t1,
                       (select count(*) as countnum
                      from TB_DEMAND t2 
                      where t2.dem_applydeptname like '%' || t1.dic_item_name || '%')  t2           
                  where t1.dic_name = '需求提出单位';
         End If;
    end PROC_PM002;可以吗?!
      

  8.   

    大家还是先帮我解决主要问题吧!PLSQL里总是说“(select count(*) from TB_DEMAND t2 where t2.dem_applydeptname like '%' || t1.dic_item_name || '%')”代码有错误,可是我把整个Insert语句拿出来执行是一点错误都没有的,为什么放到存储过程里总是出错?急!
      

  9.   

    to:ashzs((可以包含中文字符)) ,不行啊,你那(select count(*) as countnum
                      from TB_DEMAND t2 
                      where t2.dem_applydeptname like '%' || t1.dic_item_name || '%')  t2 里的t1是无法识别的!
      

  10.   

    用execute immediate ' sql ' 执行动态sql.因为plsql语法中只有select ..into...
      

  11.   

    insert into GT_PM002             
                  select 
                      t1.DIC_ITEM_NAME,t2.countnum
                      ,0,0,0,0,0,0
                  from TB_PUBLIC_DIC t1,
                       (select count(*) as countnum
                      from TB_DEMAND
                      )  t2           
                  where t1.dic_name = '需求提出单位' 
                        and 
                        t2.dem_applydeptname like '%' || t1.dic_item_name || '%';ok?
      

  12.   

    要把那个子查询放到from后面去,做多表查询
      

  13.   

    要把那个子查询放到from后面去,做多表查询
      

  14.   

    --trycreate or replace procedure PROC_PM002
    (
     sStartDate       String,
     sEndDate         String,
     sDeptID          String

    is
      nTemp           Integer;
    begin
         delete from GT_PM002;
         
         If sDeptID = '0' Then
            insert into GT_PM002
              select t1.dic_item_name,count(0),0,0,0,0,0,0 from tb_public_dic t1,tb_demand t2
                where t2.dem_applydeptname like '%'||t1.dic_item_name||'%' and
                      t1.dic_name='需求提出单位'
                group by t1.dic_item_name;
         End If;
    end PROC_PM002;
      

  15.   

    create or replace procedure PROC_PM002
    (
     sStartDate       VARCHAR,
     sEndDate         VARCHAR,
     sDeptID          VARCHAR

    is
      nTemp           NUMBER;
    begin
         delete from GT_PM002;
         
         If sDeptID = '0' Then
            insert into GT_PM002             
                  select 
                      t1.DIC_ITEM_NAME,t2.countnum
                      ,0,0,0,0,0,0
                  from TB_PUBLIC_DIC t1,
                       (select count(*) as countnum
                      from TB_DEMAND,TB_PUBLIC_DIC 
                      where TB_DEMAND.dem_applydeptname like '%' || TB_PUBLIC_DIC.dic_item_name || '%')  t2           
                  where t1.dic_name = '需求提出单位';
         End If;
    end PROC_PM002;
      

  16.   

    ashzs((可以包含中文字符)) 的最后那个应该是对的了,不过是不是应该
    create or replace procedure PROC_PM002
    (
     sStartDate  in     VARCHAR,
     sEndDate    in     VARCHAR,
     sDeptID     in   VARCHAR
    ) is
    .....
      

  17.   

    改过的存储过程如下:
    create or replace procedure PROC_PM002
    (
     sStartDate       varchar2,  --数据库类型为什么?如是日期型要定义成date型的。
     sEndDate         varchar2,  --或用 GT_PM002.sEndDate%Type (数据库是什么类型的,那么它就是什么类型的)
     sDeptID          varchar2

    is
      nTemp           Integer;
    begin
         delete from GT_PM002;
         
         If sDeptID = '0' Then
            strSql = 'insert into GT_PM002
                  select 
                      t1.DIC_ITEM_NAME,
                      (select count(*) 
                      from TB_DEMAND t2 
                      where t2.dem_applydeptname like ''%'' || t1.dic_item_name || ''%''),0,0,0,0,0,0
                  from TB_PUBLIC_DIC t1 
                  where t1.dic_name = ''需求提出单位'';'     execute immediate strSql;
         End If;end PROC_PM002;--***说明:1 在oracle 中String类型为 varchar2,而你的sStartDate的数据库类型为什么?如是日期型要定义成date型的。
              2 先把待执行的拼好SQL,再对数据库处理;如strSQL = 'xxxxSQL语句' 中含单引号,要把单引号变成双引号的。
      

  18.   

    补充:sorry,上面有手误,赋值符应为 strSql = --> strSql :=
      

  19.   

    补充2:改过的存储过程如下:
    create or replace procedure PROC_PM002
    (
     sStartDate       varchar2,  --数据库类型为什么?如是日期型要定义成date型的。
     sEndDate         varchar2,  --或用 GT_PM002.sEndDate%Type (数据库是什么类型的,那么它就是什么类型的)
     sDeptID          varchar2,
     strSql           varchar2(2000)

    is
      nTemp           Integer;
    begin
         delete from GT_PM002;
         
         If sDeptID = '0' Then
            strSql := 'insert into GT_PM002
                  select 
                      t1.DIC_ITEM_NAME,
                      (select count(*) 
                      from TB_DEMAND t2 
                      where t2.dem_applydeptname like ''%'' || t1.dic_item_name || ''%''),0,0,0,0,0,0
                  from TB_PUBLIC_DIC t1 
                  where t1.dic_name = ''需求提出单位'';'     execute immediate strSql;
         End If;end PROC_PM002;--***说明:1 在oracle 中String类型为 varchar2,而你的sStartDate的数据库类型为什么?如是日期型要定义成date型的。
              2 先把待执行的拼好SQL,再对数据库处理;如strSQL = 'xxxxSQL语句' 中含单引号,要把单引号变成双引号的。
              
      

  20.   

    我想报错的原因可能是在pl/sql编译的时候,编译器遇到select关键字就要看看其后是否有相应的into关键字,如果没有则报错。这个也是挺讨厌的还是通过表关联,group by来实现吧
      

  21.   

    没有关系的.因为你是在插入操作里面用select.因此不会出现楼上所说的错误.