有两个表,结构如下TABLE1(
T_ID NUMBER,
T_NAME VARCHAR2(10),
T_TIME DATE
   )
   
TABLE2(
T_ID NUMBER,
T_NAME VARCHAR2(10),
T_TIME DATE,
T_DEPT VARCHAR2(10),
INDATE DATE
   )
   
   
需要写个存储过程,需求如下
传入三个参数v_starttime   v_endtime,  v_string  ,在TABLE1表中取T_TIME在v_starttime和v_endtime之间的数据,插入TABLE2表中。TABLE2比TABLE1多2个字段,多出的字段分别插入空值和当前时间SYSDATE。v_string作为辅助查询字符串
如v_string的值可以为'      and T_NAME=WANG',就相当于另外附加的查询条件。我是这么写的CREATE OR REPLACE  PROCEDURE TEST  ( 
   v_starttime    varchar2,   --开始日期
     v_endtime    varchar2,   --结束日期
     v_string     varchar2      --查询条件的字符串
     )
ISbeginfor rec1 in( select   T_ID, T_NAME, T_TIME from  TABLE1 where T_TIME>=to_date(v_starttime,'yyyymmdd') and T_TIME<=to_date(v_endtime,'yyyymmdd'))            
  loop
    insert into TABLE2( T_ID ,T_NAME ,T_TIME,T_DEPT,INDATE)
    values(rec1.T_ID, rec1.T_NAME,rec1.T_TIME,NULL,SYSDATE);
  end loop;
  
end;v_starttime和v_endtime我都用对了,可是v_string我怎么都加不进去,我就尝试让整个for循环等于一个字符串变量,用双竖线连接上v_string,再用execute immediate执行,如下CREATE OR REPLACE  PROCEDURE TEST  ( 
 v_starttime,  --开始日期
     v_endtime,  --结束日期
     v_string   --查询条件的字符串
     )
IS
cmd  varchar2(2000);
begincmd:='for rec1 in( select  T_ID, T_NAME, T_TIME  from  TABLE1 where T_TIME>=to_date('''||v_starttime||''',''yyyymmdd'') and T_TIME<=to_date('''||v_endtime||''',''yyyymmdd'')||v_string||')
loop
insert into TABLE2( T_ID ,T_NAME ,T_TIME,T_DEPT,INDATE)
values(rec1.T_ID, rec1.T_NAME,rec1.T_TIME,NULL,SYSDATE);
end loop';
execute immediate cmd;

end;
我也知道这样肯定报错,但是在不知道咋办了,大家帮帮忙。

解决方案 »


  1. --你动态sql拼接有问题
    --修改后如下:
    CREATE OR REPLACE PROCEDURE TEST (  
      v_starttime varchar2, --开始日期
      v_endtime varchar2, --结束日期
      v_string varchar2 --查询条件的字符
    )
    IS
    type    cur is ref cursor ;
    my_cur  cur;
    rs      TABLE1%ROWTYPE;
    sqlstr  VARCHAR2(4000); --动态SQL拼接
    begin
         sqlstr:='select T_ID, T_NAME, T_TIME from TABLE1 where T_TIME>=to_date('''||v_starttime||''',''yyyymmdd'') and T_TIME<=to_date('''||v_endtime||''',''yyyymmdd'') '||v_string||'';
         open my_cur for sqlstr;
         loop
             fetch my_cur into rs;
             exit when my_cur%notfound;
             insert into TABLE2( T_ID ,T_NAME ,T_TIME,T_DEPT,INDATE)
                         values(rs.T_ID, rs.T_NAME,rs.T_TIME,NULL,SYSDATE);
         end loop;
         close my_cur ;--关闭游标
         commit;
    end;
      

  2. CREATE OR REPLACE PROCEDURE TEST (  
      v_starttime varchar2, --开始日期
      v_endtime varchar2, --结束日期
      v_string varchar2 default null--查询条件的字符
    )
    IS
    begin 
    if v_string =null then 
    for rec1 in( select T_ID, T_NAME, T_TIME from TABLE1 where T_TIME>=to_date(v_starttime,'yyyymmdd') and T_TIME<=to_date(v_endtime,'yyyymmdd'))   
      loop
      insert into TABLE2( T_ID ,T_NAME ,T_TIME,T_DEPT,INDATE)
      values(rec1.T_ID, rec1.T_NAME,rec1.T_TIME,NULL,SYSDATE);
      end loop;
    else 
    for rec1 in( select T_ID, T_NAME, T_TIME from TABLE1 where T_TIME>=to_date(v_starttime,'yyyymmdd') and T_TIME<=to_date(v_endtime,'yyyymmdd')
    and T_NAME=v_string)   
      loop
      insert into TABLE2( T_ID ,T_NAME ,T_TIME,T_DEPT,INDATE)
      values(rec1.T_ID, rec1.T_NAME,rec1.T_TIME,NULL,SYSDATE);
      end loop;
    end if ;
    end TEST;
      

  3. CREATE OR REPLACE PROCEDURE TEST (  
    v_starttime, --开始日期
      v_endtime, --结束日期
      v_string --查询条件的字符串
      )
    IS
    cmd varchar2(2000);
    begin    sqlstr:='select T_ID, T_NAME, T_TIME from TABLE1 where T_TIME>=to_date('''||v_starttime||''',''yyyymmdd'') and T_TIME<=to_date('''||v_endtime||''',''yyyymmdd'') '||v_string||'';
         open my_cur for sqlstr;
         loop
             fetch my_cur into rs;
             exit when my_cur%notfound;
             insert into TABLE2( T_ID ,T_NAME ,T_TIME,T_DEPT,INDATE)
                         values(rs.T_ID, rs.T_NAME,rs.T_TIME,NULL,SYSDATE);
         end loop;
         close my_cur ;--关闭游标
         commit;
    end;
      

aliyun

类似问题 »