我写的存储过程在执行时顺利通过了,调用时报缺失表达式,求大神给看看怎么回事?create or replace procedure get_form_data(p_date varchar2,str1 varchar2,str2 varchar2,str3 varchar2,str4 varchar2,str5 varchar2)ISt_date date;
t_dept varchar2(36);
t_identity varchar2(36);
t_charge varchar2(36);
t_operator varchar2(36);
t_type varchar2(36);
t_time varchar2(36);
t_outp number(6,2);
t_emer number(6,2);
t_daytimeoutp number(6,2);
t_daytimeemer number(6,2);
t_night number(6,2);
t_holidayoutp number(6,2);
t_holidayemer number(6,2);
t_export number(6,2);
t_regist number(6,2);
CUR1 SYS_REFCURSOR;
sql_statement varchar2(3000):='select dim_date,'||str1||','||str2||','||str3||','||str4||','||str5||',sum(t.outp_nums) OUPT_NUMS,sum(emer_nums) EMER_NUMS,
sum(daytime_outp_nums) DAYTIME_OUTP_NUMS,sum(daytime_emer_nums) DAYTIME_EMER_NUMS,
SUM(NIGHT_OUTP_NUMS) NIGHT_OUTP_NUMS,SUM(HOLIDAY_OUTP_NUMS) HOLIDAY_OUTP_NUMS,SUM(HOLIDAY_EMER_NUMS) HOLIDAY_EMER_NUMS,SUM(EXPORT_OUTP_NUMS) EXPORT_OUTP_NUMS,
SUM(REGIST_CHARGES) REGIST_CHARGES
 from VDSS_CLINIC_MASTER_REC t where  t.DIM_DATE=to_date('||p_date||',"yyyy/MM/dd") and rownum <=2000 group by '||str1||','||str2||','||str3||','||str4||','||str5||';';BEGIN
 delete from temp_form_data;
 open CUR1 for sql_statement;
   loop
     fetch cur1 into t_date,t_dept,t_identity,t_charge,t_operator,t_type,t_time,t_outp,t_emer,t_daytimeoutp,t_daytimeemer,t_night,t_holidayoutp,
     t_holidayemer,t_export,t_regist;
     exit when CUR1%notfound;
     insert into temp_form_data values(t_date,t_dept,t_identity,t_charge,t_operator,t_type,t_time,t_outp,t_emer,t_daytimeoutp,t_daytimeemer,t_night,t_holidayoutp,
     t_holidayemer,t_export,t_regist);
     end loop;
     close CUR1;
     commit;
     END;

解决方案 »

  1.   

    报错位置是打开游标那一行
    open cur1 for sql_statement 报缺失表达式
      

  2.   

    你把sql_statement 的字符串写在begin后面试试,自己打印一下sql_statement 看看SQL有没有问题
      

  3.   

    应该是你的SQL拼的有问题,打印出来看看吧
      

  4.   


    sql没问题的,我是测试完写进存储过程的
      

  5.   

    应该是你的SQL拼的有问题,打印出来看看吧我也觉得是SQL的问题,但是单独执行没错的,能帮我看看连接符有啥问题不,尤其是date转换那块,但是我别的连接方法都试了就这个方法编译通过了
      

  6.   

    大神在哪里,帮我看看动态sql连接符问题,我之前CALL是想看看传空的过去能不能行,结果报缺失表达式,刚才参数写全,给我报“”“yyyy/MM//dd”标识符无效
      

  7.   

    动态SQL里的字符串拼接是三个单引号,你怎么是3个双引号,是什么鬼
      

  8.   

    我把传入日期改成date类型了又报sql没正确结束,sql反复测试没问题啊
      

  9.   

    动态SQL就能搞定了,你用游标效率可能还底点SQL> create table t(id int,nn varchar2(50));表已创建。SQL> select * from emp;     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
          7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
          7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
          7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
          7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
          7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30
          7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10
          7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
          7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
          7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
          7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
          7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30
          7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20
          7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    10已选择14行。SQL> select * from t;未选定行SQL> declare v_empno varchar2(50);
      2  v_ename varchar2(50);
      3  v_sql varchar2(1000);
      4  begin
      5  v_empno:='empno';
      6  v_ename:='ename';
      7  v_sql:='insert into t select '||v_empno||','||v_ename||' from emp where sal>2500';
      8  execute immediate v_sql;
      9  end;
     10  /PL/SQL 过程已成功完成。SQL> select * from t;        ID NN
    ---------- --------------------------------------------------
          7566 JONES
          7698 BLAKE
          7788 SCOTT
          7839 KING
          7902 FORD
      

  10.   

    我找到问题在哪了,动态sql一传入日期就报错,删掉日期的限定就没问题,现在我不知道怎么给日期传值了