create or replace procedure BILLDATE_PROC
 (
   strdate VARCHAR2,
   strenddate VARCHAR2,
   strBiz VARCHAR2
 )
 AS
 BEGIN
 EXECUTE IMMEDIATE 'create table TESTONESTR as(select ''20080401-20080417'' 日期,
 (select propertyvalue from machineinfo where propertycode=''20'' and
 macid=PAYMENTINFO.MACID) 营业厅, (select machinecode from machineindex
  where macid=PAYMENTINFO.MACID) 设备编号,(select selectitemname from
  dropdownlist where ddlname=''缴费状态'' and selectitemvalue=PAYSTATE)
  缴费状态,count(PAYMONEY) 交易笔数, sum(PAYMONEY) 交易金额 from PAYMENTINFO
  where (PAYMENTINFO.PAYDATETIME between to_date('||strdate||',''yyyymmdd'') and
  to_date('||strenddate||',''yyyymmdd'')) and PAYMENTINFO.MACID in (select macid from
  machineinfo where PropertyCode=''20'' and propertyvalue='||strBiz||')
  group by PAYMENTINFO.MACID,PAYMENTINFO.PAYSTATE) order by 营业厅,设备编号,缴费状态';
  END;这是我写的存储过程,我写execute BILLDATE_PROC('20080415','20080415','芙蓉区营业厅'); 调用
但是报错
*
ERROR 位于第 1 行:
ORA-00904: 无效列名
ORA-06512: 在"USERNAME.BILLDATE_PROC", line 9
ORA-06512: 在line 1
有哪位高手知道啥原因不,我把SQL语句独立出来是可以运行的。。

解决方案 »

  1.   

    要在SQL\Plus里面运行execute BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
    或者在PL\SQL的Command模式运行execute BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');
      

  2.   

    试了英文,还是一样的  *
    ERROR 位于第 1 行:
    ORA-00904: 无效列名
    ORA-06512: 在"USERNAME.BILLDATE_PROC", line 9
    ORA-06512: 在line 1
      

  3.   


    我是在SQL/PLUS里面运行的
      

  4.   

    是你的动态sql写的有问题,应该是某个字段名不存在或写错了,按如下方式调试:先按这样修改过程: 
    create or replace procedure BILLDATE_PROC 
     ( 
       strdate VARCHAR2, 
       strenddate VARCHAR2, 
       strBiz VARCHAR2 
     ) 
     AS 
     var_sql varchar2(8000);
     BEGIN 
     var_sql := 'create table TESTONESTR as(select ''20080401-20080417'' 日期, 
     (select propertyvalue from machineinfo where propertycode=''20'' and 
     macid=PAYMENTINFO.MACID) 营业厅, (select machinecode from machineindex 
      where macid=PAYMENTINFO.MACID) 设备编号,(select selectitemname from 
      dropdownlist where ddlname=''缴费状态'' and selectitemvalue=PAYSTATE) 
      缴费状态,count(PAYMONEY) 交易笔数, sum(PAYMONEY) 交易金额 from PAYMENTINFO 
      where (PAYMENTINFO.PAYDATETIME between to_date(' ¦ ¦strdate ¦ ¦',''yyyymmdd'') and 
      to_date(' ¦ ¦strenddate ¦ ¦',''yyyymmdd'')) and PAYMENTINFO.MACID in (select macid from 
      machineinfo where PropertyCode=''20'' and propertyvalue=' ¦ ¦strBiz ¦ ¦') 
      group by PAYMENTINFO.MACID,PAYMENTINFO.PAYSTATE) order by 营业厅,设备编号,缴费状态'; 
      dbms_output.put_line(trim(var_sql));
      --EXECUTE IMMEDIATE var_sql;
      END; 
    拿到testwindow去测试:
    declare
      i number;
    begin
      BILLDATE_PROC('20080415','20080415','芙蓉区营业厅'); 
    end;
    查看testwindow的dbms output区里的sql语句,将其copy到sqlwindow去执行一下,看报哪个字段不存在的错误,修正那个字段名后再执行就可以了
      

  5.   

    我试了下 adaizi1980 的方法
    declare 
      i number; 
    begin 
      BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');  
    end; 
    我在执行这段代码的时候编译就通不过,还是报 无效列名的错误,
    但是我把存储过程修改了一下,propertyvalue=' ¦ ¦strBiz ¦ ¦')这里
    不传参数,直接写成propertyvalue=''芙蓉区营业厅''这样就可以了,
    郁闷,不知道是什么原因
      

  6.   

    刚又发现把propertyvalue=' ¦ ¦strBiz ¦ ¦'  这里改成两个单引号 PropertyValue=''||strBiz||''
    就可以执行成功了,但是查不出数据,我想两个双引号应该是变成这样 ‘芙蓉区营业厅’ 然后跟数据库的去匹配
    所以匹配不上,有没有哪个高手可以解答啊。
    为什么我前面两个参数都能用,这里就不行呢?
      

  7.   

    注意要修改你的存储过程,在存储过程里要做成只输出sql语句而不执行sql语句,然后看你输出的sql语句是否有问题;
    单纯执行
    declare  
      i number;  
    begin  
      BILLDATE_PROC('20080415','20080415','芙蓉区营业厅');   
    end;  
    是没用的另:注意引号的用法,举例如下
    SQL> select '''' from dual;''''
    ----
    'SQL> select ',''' from dual;','''
    -----
    ,'SQL> select '''a'',' from dual;'''A'','
    --------
    'a',SQL> select ''||'a'||',' from dual;''||'A'||','
    ------------
    a,SQL> 
      

  8.   

    严格按照我在6楼说的做一遍,注意,必须用我给你改了以后的过程而不能直接用你自己的过程;
    然后发跟踪到的sql语句,即var_sql的值上来