CREATE OR REPLACE PROCEDURE TESTDTA.GETITEMRANKING
IS
TCount integer;
StrSql varchar2(4000);
begin
select COUNT(*) INTO TCount from all_all_tables where  table_Name='ITEMRANKING';
if TCount>0 then
  execute immediate 'drop table testdta.ITEMRANKING';
end if;
declare
StrSql varchar2(4000);
begin
StrSql:='create table testdta.ITEMRANKING as SELECT a.IBITM,'' '' as ranking,B.ITEM_VALUES,B.TOTAL_VALUES,frequency FROM TESTDTA.F4102 A LEFT OUTER JOIN (
SELECT SDITM,round(SUM(SDITWT/10000),2) AS ITEM_VALUES,(SELECT round(SUM(SDITWT/10000),2) FROM TESTDTA.f42119 
WHERE SDDCTO<>''SW'' AND  SDprp4=''THD'' AND SDMCU=''       HK101''
AND SDIVD BETWEEN to_jde_date(TRUNC(Trunc(SYSDATE,''MONTH'') - 1,''MONTH'')-366)
       AND to_jde_date(Trunc(SYSDATE, ''MONTH'') - 1 / 86400)) AS TOTAL_VALUES FROM TESTDTA.f42119 
WHERE SDDCTO<>''SW'' AND  SDprp4=''THD'' AND SDMCU=''       HK101''
AND SDIVD BETWEEN to_jde_date(TRUNC(Trunc(SYSDATE,''MONTH'') - 1,''MONTH'')-366)
       AND to_jde_date(Trunc(SYSDATE, ''MONTH'') - 1 / 86400)
GROUP BY SDITM
ORDER BY ITEM_VALUES DESC
) B ON A.IBITM=B.SDITM 
LEFT OUTER JOIN 
(SELECT SDITM,COUNT(SDDOCO) as frequency FROM(
SELECT DISTINCT SDDOCO,SDITM FROM TESTDTA.F42119 
WHERE SDDCTO<>''SW'' AND  SDprp4=''THD'' AND SDMCU=''       HK101''
AND SDIVD BETWEEN to_jde_date(TRUNC(Trunc(SYSDATE,''MONTH'') - 1,''MONTH'')-366)
       AND to_jde_date(Trunc(SYSDATE, ''MONTH'') - 1 / 86400))
GROUP BY SDITM
)C on a.ibitm=c.sditm
WHERE IBMCU=''       HK101''  and a.ibprp4=''THD''
ORDER BY B.ITEM_VALUES desc';
--dbms_output.put_line(StrSql);
execute immediate StrSql;
--commit;
--UPDATE TESTDTA.ITEMRANKING SET ranking='F' WHERE ranking IS NULL OR ranking=' ';
--COMMIT;
END;
下面是运行结果提示:
SQL> EXEC TESTDTA.GETITEMRANKING;PL/SQL procedure successfully completedSQL> EXEC TESTDTA.GETITEMRANKING;begin TESTDTA.GETITEMRANKING; end;ORA-00904: "TO_JDE_DATE": invalid identifier
ORA-06512: at "TESTDTA.GETITEMRANKING", line 32
ORA-06512: at line 1SQL> 

解决方案 »

  1.   

    在子查询里面不可以用ORDER BY ITEM_VALUES DESC 
    你把它去掉试试看
      

  2.   

    你的select 语句拼的有错,打印出来执行一下,看错在哪里
      

  3.   

    执行的错误提示是:SQL> EXEC TESTDTA.GETITEMRANKING; PL/SQL procedure successfully completed SQL> EXEC TESTDTA.GETITEMRANKING; begin TESTDTA.GETITEMRANKING; end; ORA-00904: "TO_JDE_DATE": invalid identifier 
    ORA-06512: at "TESTDTA.GETITEMRANKING", line 32 
    ORA-06512: at line 1 
      

  4.   


      AND to_jde_date(Trunc(SYSDATE, ''MONTH'') - 1 / 86400)) AS TOTAL_VALUES FROM TESTDTA.f42119 TO_JDE_DATE  oracle好像没有这个函数,难道是我见识太少?郁闷
      

  5.   

    这个函数是我自己建立的,是有的,直接运行sql语句是没有问题的,就是用动态的就不可以了
      

  6.   


    USE SYS TO DO:
    SQL> grant select on yourUSER.TO_JDE_DATE to yourUSER;
      

  7.   

    SQL> grant execute on yourUSER.TO_JDE_DATE to yourUSER;
      

  8.   

    还有应该TO_JDE_DATE是在另一个SCHEMA下面建立的自定义函数,用时需注意以下几点...
    1:确保有相应的权限访问.
    2:在不同的SCHEMA中引用时最好前面加上SCHEMA NAME.
      

  9.   

    LZ的:
    SDIVD BETWEEN to_jde_date(TRUNC(Trunc(SYSDATE,''MONTH'') - 1,''MONTH'')-366) 
          AND to_jde_date(Trunc(SYSDATE, ''MONTH'') - 1 / 86400))
    大致是什么意思?
      

  10.   

    此函数to_jde_date是在本用户下吗?