create or replace procedure PRO_DZBM_UPDATE Is
  v_num  Number;
  v_xh   Varchar2(30);
  v_dzdm Varchar2(30);
  v_id   Varchar2(60);
  v_dzbm number;
  Cursor cur_dz Is Select t.id,t.DZBM From T_DZK_JBXX t Order By t.ypcsbm;
begin
  v_num:=0;
  For cur_i In cur_dz Loop
    v_num:=v_num+1;
    v_id :=cur_i.id;
        
    v_dzbm:=hz_dzbm.nextval;--此处编译通不过,hz_dzbm是sequence 见下      
    v_xh :=lpad(to_char(v_dzbm),20,'0');
    v_dzdm:=v_xh;
    
  Update T_DZK_JBXX t Set t.DZBM=v_dzdm Where t.id=v_id;  End Loop;
  If (v_num Mod 1000) =0 Then
    Commit;
  End If ;
  Commit;
end PRO_DZBM_UPDATE;create sequence HZ_DZBM
minvalue 1
maxvalue 9999999999999999999
start with 6
increment by 1
nocache;编译时报错:Compilation errors for PROCEDURE PSMIS.PRO_DZBM_UPDATEError: PLS-00357: Table,View Or Sequence reference 'HZ_DZBM.NEXTVAL' not allowed in this context
Line: 15
Text: v_dzbm:=hz_dzbm.nextval;Error: PL/SQL: Statement ignored
Line: 15
Text: v_dzbm:=hz_dzbm.nextval;

解决方案 »

  1.   

    create or replace procedure PRO_DZBM_UPDATE 
    Is
      v_num Number;
      v_xh Varchar2(30);
      v_dzdm Varchar2(30);
      v_id Varchar2(60);
      v_dzbm number;--默认情况下没有显示说明的参数的类型是in(输入型)[没有记错的话],不能够对in型的参数赋值
      Cursor cur_dz Is Select t.id,t.DZBM From T_DZK_JBXX t Order By t.ypcsbm;
    begin
      v_num:=0;
      For cur_i In cur_dz Loop
      v_num:=v_num+1;
      v_id :=cur_i.id;
        
      v_dzbm:=hz_dzbm.nextval;--此处编译通不过,hz_dzbm是sequence 见下
    一下code略
      

  2.   

    重新定义一个变量 v_var number;select hz_dzbm.nextval into v_var from dual;oracle中不能为in型的变量赋值  这是真的
      

  3.   

    11G 才支持v_var:=hz_dzbm.nextval; 
     之前的版本只能先查出序列的值再into给变量
      

  4.   

    序列号需要用 select hz_dzbm.nextval into v_dzbm from dual; 语句赋值。只有 oracle 11g 允许直接使用 v_dzbm:=hz_dzbm.nextval; 形式将序列号赋与变量。
      

  5.   


    create or replace procedure PRO_DZBM_UPDATE Is
      v_num Number;
      v_xh Varchar2(30);
      v_dzdm Varchar2(30);
      v_id Varchar2(60);
      v_dzbm number;
      Cursor cur_dz Is Select t.id,t.DZBM From T_DZK_JBXX t Order By t.ypcsbm;
    begin
      v_num:=0;
      For cur_i In cur_dz Loop
      v_num:=v_num+1;
      v_id :=cur_i.id;
        
      select hz_dzbm.nextval into v_dzbm from dual;  v_xh :=lpad(to_char(v_dzbm),20,'0');
      v_dzdm:=v_xh;
        
      Update T_DZK_JBXX t Set t.DZBM=v_dzdm Where t.id=v_id;  End Loop;
      If (v_num Mod 1000) =0 Then
      Commit;
      End If ;
      Commit;
    end PRO_DZBM_UPDATE;--你的写法要到11G才支持
      

  6.   

    支持5楼的写法,毕竟11G比较新,用不上,要充分利用 dual
      

  7.   

     v_num:=0;与v_dzbm:=hz_dzbm.nextval;(该句的正确方式select hz_dzbm.nextval into v_dzbm from dual;)的赋值方式一样吗???一个是直接赋值,一个是通过查询方式赋值!!
      

  8.   

    11G的用法,要充分利用 dual
      

  9.   

    e,看错,楼主的过程没参数,那个是程序里定义的局部变量。入参是肯定不能赋值的,会报错
    Compilation errors for PROCEDURE SCOTT.PROC_TTTTError: PLS-00363: expression  cannot be used as an assignment target