22/1     PL/SQL: SQL Statement ignored
22/29    PLS-00201: 必须说明标识符 'R_TYPE'去掉这个错,我这里可以编译通过了.

解决方案 »

  1.   

    INSERT INTO id_tbl VALUES(1,r_type,sysdate);
                                ^^^^^^
    r_type没有定义。
      

  2.   

    有以下不太理解,搂主是否能告知:
    insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
    if sqlcode<>0 then 
        rollback to b;
    else
        commit;
    end if; 
    我觉得如果insert出错程序会直接跳出的吧,rollback to b应该是走不到的。
    不过没试过,我也不太清楚。
      

  3.   

    我的意思是如果insert失败的话,全部rollback!这样不能回滚吗??
      

  4.   

    我通常是这么写的:
      insert ...
      except
        when other then
          rollback;
      ...
      

  5.   

    为什么不用异常处理
    exception
      when others then
        rollback;
    end;
      

  6.   

    你的过程的结构化,可读性很差,需要做大的修改
    -------------------------------------------
    还有,你在oracle区发的8个帖子,如果已经解决的话,希望你能揭贴。
    才揭贴1个,其它的还有什么问题吗?
      

  7.   

    现在我稍微盖了一下,你看看我应该在哪些方面作一些改进??
    create or replace procedure recp_pro(
    r_type varchar2,
    recp_name varchar2,
    location varchar2,
    recp_print number,
    recp_worker varchar2,
    memo varchar2)
     as
    recp_id varchar2(10);
    newid number;function func_lock
    return boolean is 
    res boolean;BEGIN
    res:=true;savepoint a;
    update id_tbl set id=id+1 
    where to_char(l_date,'yymmdd')=to_char(sysdate,'yymmdd');
    dbms_output.put_line(to_char(sqlcode)||'first');
    dbms_output.put_line(sqlerrm);
    if sqlcode=0 then
    if sql%rowcount=0 then 
    INSERT INTO id_tbl VALUES(1,r_type,sysdate);
    dbms_output.put_line(to_char(sqlcode)||'second');
    dbms_output.put_line(sqlerrm);
    IF SQLCode <> 0 THEN
    ROLLBACK to a;
    res:=false;
    else 
    newid:=1; 
    END IF;
    ELSE
    SELECT id INTO newid FROM id_tbl WHERE to_char(l_date,'yymmdd')=to_char(sysdate,'yymmdd');
    dbms_output.put_line(to_char(newid));
    res:=true; 
    dbms_output.put_line(to_char(sqlcode)||'third');
    dbms_output.put_line(sqlerrm); 
    END IF;
    ELSE
    ROLLBACK to a;
    res:=false;
    END IF;
    return res;
    end func_lock;beginsavepoint b;if func_lock then
    dbms_output.put_line('success');
    recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
    insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
    if sqlcode<>0 then 
    rollback to b;
    else
    commit;
    end if; 
    else
    dbms_output.put_line('faise');
    rollback to b;
    end if;
    end recp_pro;
    ////////////////////
    declare 
    r_type varchar2(10);
    recp_name varchar2(20);
    location varchar2(40);
    recp_print number(1);
    recp_worker varchar2(20);
    memo varchar2(40);
    begin
    r_type:='A';
    recp_name:='li';
    location:='西湖';
    recp_print:=0;
    recp_worker:='liha';
    memo:='空白';
    recp_pro(r_type,recp_name,location,recp_print,recp_worker,memo);
    end;
      

  8.   

    一、函数和过程分开,结构独立。
    二、在函数中一般不要执行修改数据库的操作,不是太好,否则,改用过程。
    三、注意语句的缩进,使结构化明显。
    四、单独的pl/sql块有单独的异常处理模块,靠sqlcode=0是不行的,如果发生异常,你的过程已经挂起了。象你的这种简单结构,根本上用不到rollback to checkpoint。
      

  9.   

    哦,谢谢还有个问题:
    beginsavepoint b;if func_lock then
    dbms_output.put_line('success');
    recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
    insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
    if sqlcode<>0 then 
    rollback to b;
    else
    commit;
    end if; 
    else
    dbms_output.put_line('faise');
    rollback to b;
    end if;
    end recp_pro;
    请看上面的代码,我不知道如果操作不成功,rollback to b能不能回滚到b,还有如果我不用savepoint,如果insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);执行不成功,用rollback的话回滚到哪里为止??能回滚到b这里吗?因为我还有func_lock函数
      

  10.   

    begin
      recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
      --这里oracle开启一个事务(第一个dml语句)
      insert into recpt_tbl 
        values (recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
      --如果没有错误,则提交,插入成功
      commit;
    exception
      when others then
        --如果发生错误,回滚所有操作,即开启事务处,插入失败
        rollback;
    end;
      

  11.   

    但是我要回滚到最前面的地方b处,因为前面有个函数func_lock的,因为在func_lock里我也有数据库操作(update等),我的意思就是说这两个数据库操作(一个func_lock,一个是后来的insert)作为整个事务来处理,一个不成功都不成功!这个怎么作?是不是要用到savepoint??
      

  12.   

    重新再问:
    斑竹我指的是着段代码:
    begin
    savepoint b;
    if func_lock then
    dbms_output.put_line('success');
    recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
    insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
    if sqlcode<>0 then 
    rollback to b;
    到这为止没有commit阿??我的目的是产生A021218001这样的id号,func_lock函数是一个锁定id_tbl序号表的行纪录,返回一个序号表的最大值,我不知道会不会出现func_lock=true(锁定成功,得到一个最大序号),但是insert另外一张表的时候不成功,碰到这样的情况,我想把所有的事务操作rollback?改怎么做啊,谢谢
      

  13.   

    一样啊,在异常中做。
    begin
    savepoint b;
    if func_lock then
    dbms_output.put_line('success');
    recp_id:=r_type||to_char(sysdate,'yymmdd')||to_char(newid,'fm000');
    insert into recpt_tbl values(recp_id,recp_name,location,recp_print,recp_worker,sysdate,memo);
    exception
      when others then
       rollback to b;
    end;
      

  14.   

    我就是不知道能不能rollback到b点???因为我的func_lock函数=true的话,那么就是锁定了一张表?如果不能rollback到b点,但是func_lock=true的话,就造成死锁了,一直就锁了这张表!!!