本帖最后由 lixiaolong09 于 2010-12-11 20:45:28 编辑

解决方案 »

  1.   


    /*
    oracle过程的语法
    declare
    ... 定义变量
    begin
    ....
    具体的操作
    exception ...
    end;
    */
    --大概修改未经测试
    declare   --未命名的过程用declare
    t_smsid  NUMBER;  --你定义变量的语法错误 位置错
    t_mobileno nvarchar2;  
    t_smsfrom  NUMBER;   
    t_content  nvarchar2;  
    begin  --begin位置错误
    OPEN out_data FOR
            SELECT smsid,mobileno,smsfrom,content 
            FROM SMS_SEND 
            where smsid in (in_strSmsId);
    loop                        
       fetch out_data into t_smsid,t_mobileno,t_smsfrom,t_content;
       exit when out_data%NOTFOUND; --循环退出条
       insert into SMS_SENDED VALUES (t_smsid,t_smsid,1,1,sysdate,'',0,'','','000001');
       commit; --提交
    end loop;
    close out_data; --关闭游标
    exception when others then  
     rollback;--异常处理
    end;
      

  2.   

    1、如果使用open for 动态游标,open for 是执行语句,则应该放在执行块里面,即begin...end之间。
    2、如果要放在说明部分,则请使用cursor c is select ....from... 来声明游标,但这个是静态游标。
    3、如果要使用动态的in列表参数,请使用动态游标,但你的写法有问题,in列表参数只能拼接。DECLARE
      t_smsid%NUMBER      ; --
      t_mobileno%NVARCHAR2; --
      t_smsfrom%NUMBER    ; --
      t_content%NVARCHAR2 ; --
    BEGIN
      OPEN out_data FOR 'SELECT smsid, mobileno, smsfrom, content
          FROM SMS_SEND
         WHERE smsid IN (' || in_strSmsId || ')';
      LOOP
        FETCH out_data
          INTO t_smsid, t_mobileno, t_smsfrom, t_content;
        EXIT WHEN out_data%NOTFOUND; --循环退出条件
        IF out_data%FOUND THEN
          --获取数据 
          INSERT INTO SMS_SENDED
          VALUES
            (t_smsid, t_smsid, 1, 1, SYSDATE, '', 0, '', '', '000001');
        END IF;
      END LOOP;
      COMMIT;
    END;