这么长,不结合数据库pl/sql执行,肉眼找错误,何难。有一点建议
V_SQL VARCHAR2(4000);
 V_WRH VARCHAR2(4000);
 V_SOR VARCHAR2(4000);
 V_OTH VARCHAR2(4000);你把上面的几个变量都定义成4000,存储过程最后你又把这个几个拼接在一起赋值给V_SQL,超过4000了肿么办呢?VARCHAR2作为变量使用的时候,支持的长度是32767个字符,你把V_SQL定义成VARCHAR2(32767)好了。

解决方案 »

  1.   

    拼接的v_sql,最后面分号去掉
    V_SQL := 'INSERT INTO HD_REPORT.HDTMP_DXD_PHMX
    (NUM,CLS,FILDATE,GDCODE,STCODE)
    SELECT DISTINCT 1,V_CKSEQ,TRUNC(SYSDATE),nvl(GOODS.CODE,''-''),D.CODE
    FROM BUSINVS A,WAREHOUSE WAREHOUSE,SORTNAME SORTNAME,STORE D,GOODS GOODS
    WHERE A.GDGID=GOODS.GID AND A.WRH=WAREHOUSE.GID AND A.STORE=D.GID AND GOODS.SORT=SORTNAME.SCODE'
    ||' AND ('||V_WRH||
    ') AND ('||V_SOR||
    ') AND ('||V_OTH||
    ')AND (D.GID='||V_STORE||')';
    EXECUTE IMMEDIATE V_SQL;
      

  2.   

    打印最后执行的sql或者改成存储过程,调用debug
      

  3.   

    正解,如果还有问题,把你v_sql最终的文本你自己执行一下,就知道错在哪了。
      

  4.   

    ++
    PS:楼主这种动态SQL要注意把拼装的SQL输出出来手动执行,查错。