CREATE or replace 
PROCEDURE TraceBatch
(
    StartTime nvarchar2,
    EndTIme nvarchar2,
    Line nvarchar2,
    PartNo nvarchar2    

Is
Strsql nvarchar2(300);
Num number;BEGIN
     Strsql:='select count(panel_sn) into Num from N_SMT_SNTRACE_T A join n_smt_panelflash_t b on a.sn_operate_code=b.sn_operate_code where 
b.create_time between to_date('||StartTime||',''yyyy-mm-dd hh24:mi:ss'') and to_date('||EndTime||',''yyyy-mm-dd hh24:mi:ss'')';
    execute immediate Strsql;
dbms_output.put_line(Num);
END TraceBatch;以上这个存储过程在编译的时候报表达式类型错误,请问是怎么回事?我初学Oracle,对他的很多用法都不太熟悉,以前一直是用SqlServer做开发的,请大侠路过指导一下,谢谢!

解决方案 »

  1.   

    Strsql:=N'select count(panel_sn) into Num from N_SMT_SNTRACE_T A join n_smt_panelflash_t b on a.sn_operate_code=b.sn_operate_code where  
    b.create_time between to_date('||StartTime||N',''yyyy-mm-dd hh24:mi:ss'') and to_date('||EndTime||N',''yyyy-mm-dd hh24:mi:ss'')';
      execute immediate Strsql;数据类型不对吧,试下看看.
      

  2.   

    CREATE or replace PROCEDURE sfcrfmaster.TraceBatch
    (
        StartTime nvarchar2,
        EndTIme nvarchar2,
        Line nvarchar2,
        PartNo nvarchar2    

    Is
    strsql nvarchar2(300);
    Num number;BEGIN
         strsql:='select count(panel_sn)  from N_SMT_SNTRACE_T A join n_smt_panelflash_t b on a.sn_operate_code=b.sn_operate_code'; 
        execute immediate strsql ;
    END TraceBatch;我把问题再简化一点吧,我按以上这个写法去执行都报错:表达式类型错误,但是如果我以下这样写
    CREATE or replace PROCEDURE sfcrfmaster.TraceBatch
    (
        StartTime nvarchar2,
        EndTIme nvarchar2,
        Line nvarchar2,
        PartNo nvarchar2    

    Is
    strsql nvarchar2(300);
    Num number;BEGIN
        execute immediate 'select count(panel_sn)  from N_SMT_SNTRACE_T A join n_smt_panelflash_t b on a.sn_operate_code=b.sn_operate_code' ;
    END TraceBatch;却可以,我怀疑是不是execute immediate 的问题?
      

  3.   

    execute immediate strsql using 变量名;试试
      

  4.   

    dbms_output.put_line(Num); --> number型变量Num怎么可以直接输出呢?
    应该是 dbms_output.put_line(to_char(Num));
      

  5.   


    CREATE OR REPLACE PROCEDURE TraceBatch
    ( StartTime nvarchar2,
      EndTime nvarchar2,
      Line nvarchar2,
      PartNo nvarchar2
    )
    IS
      strsql nvarchar2(1000);
      num number(18,0);
    BEGIN
      strsql := ' select count(panel_sn) into Num from N_SMT_SNTRACE_T A join n_smt_panelflash_t b on a.sn_operate_code=b.sn_operate_code ';
      strsql := strsql||' where b.create_time between to_date(:starttime),''yyyy-mm-dd hh24:mi:ss'' and to_date(:endtime),''yyyy-mm-dd hh24:mi:ss'')';
      execute immediate strsql using StartTime, EndTime;
      dbms_output.put_line(to_char(num));
    END TraceBatch;
    /
      

  6.   

    -- 建议:
    -- *(1) 日期区间尽量少用between ... and ... ,具体原因请参考:http://topic.csdn.net/u/20110324/09/12bf9066-57c8-4cdf-8481-d9efad646c5c.html
    -- *(2) 尽量使用绑定变量,如上所示: to_date(:starttime)...to_date(:endtime)...  using StartTime, EndTime;
      

  7.   

    CREATE OR REPLACE PROCEDURE TraceBatch(StartTime nvarchar2,
                                           EndTIme   nvarchar2,
                                           Line      nvarchar2,
                                           PartNo    nvarchar2) Is
      Strsql varchar2(300);
      Num    number;BEGIN
      Strsql := 'select count(panel_sn)  from N_SMT_SNTRACE_T A join n_smt_panelflash_t b on a.sn_operate_code=b.sn_operate_code and
    b.create_time between to_date(''  StartTime 
                '',''yyyy-mm-dd hh24:mi:ss'') 
                and to_date(''EndTime '',''yyyy-mm-dd hh24:mi:ss'')';
      execute immediate Strsql
        into num;
      dbms_output.put_line(Num);
    END TraceBatch;
    --试试看
      

  8.   

    晕,我copy你的过程下来编译可以通过啊。
      

  9.   

    我也认为是execute immediate的问题,
    当你把SQL用execute immediate 'sql语句'的时候编译就没有问题了。
    但是为什么CREATE or replace PROCEDURE TraceBatch(StartTime nvarchar2,
                                           EndTIme   nvarchar2,
                                           Line      nvarchar2,
                                           PartNo    nvarchar2) Is
      Strsql nvarchar2(300);
      Num    number;BEGIN
      execute immediate 'select count(panel_sn) into Num from N_SMT_SNTRACE_T A join n_smt_panelflash_t b on a.sn_operate_code=b.sn_operate_code where 
    b.create_time between to_date(' || StartTime ||
                ',''yyyy-mm-dd hh24:mi:ss'') and to_date(' || EndTime ||
                ',''yyyy-mm-dd hh24:mi:ss'')';
      
      dbms_output.put_line(Num);
    END TraceBatch;
    这样就行,没有找到原因
      

  10.   

    楼主的问题简单,直接把strsql串中的 into Num 拿到execute immediate后就可以了。就是strsql中不要 into Num,再把execute immediate Strsql;改成execute immediate Strsql into Num;
      

  11.   

    楼主,我以前也是从sqlserver转做的oracle 你先看看oracle的基本语法、函数 再去学过程