我在一个包里面写了一个函数,用来设置当某些插入进来的字段为空值时,将他的值默认为了0或1。  create or replace package body COMMON_FUNCTION is
   PRAGMA SERIALLY_REUSABLE;
   /*递归域关系表所有数据移到新库中*/
   PROCEDURE INSERT_DOMAINRELATION(DOMAIN DOMAIN_TYPE) IS
        
        。。
         。。
         。。
        END INSERT_DOMAINRELATION;
  
   /*判断是否为数字*/
   FUNCTION ISNUMERIC(NUM VARCHAR2) RETURN BOOLEAN AS
         。。
          。。
    END ISNUMERIC;
    
    /*非数字性字符处理*/
   FUNCTION CHECKNUMBER(NUM VARCHAR2,COLUMN_NAME VARCHAR2) RETURN NUMBER AS 
    
    BEGIN
      IF NUM IS NULL THEN
        IF COLUMN_NAME='isalarm_account' OR COLUMN_NAME='child_num' THEN
          RETURN 0;
          END IF;
        IF COLUMN_NAME='state' OR COLUMN_NAME='login_no' OR COLUMN_NAME='isowe' THEN
           RETURN 1;
        END IF;
     END IF;
     RETURN TO_NUMBER(NUM);
     /*EXCEPTION
       WHEN OTHERS THEN
          RETURN 0;*/
   END CHECKNUMBER;
   
END COMMON_FUNCTION;红色的就是报错的函数然后调用程序如下:
FOR MY_USERINFO IN USERINFO LOOP
        SELECT ID INTO ACCOUNTID FROM ACCOUNT WHERE NAME=MY_USERINFO.NAME;
        --SELECT USER_INFO_ID.NEXTVAL INTO NEXT_ID FROM DUAL;
        INSERT INTO USER_INFO
         VALUES(ACCOUNTID,
              MY_USERINFO.idcard,
              MY_USERINFO.cellphone,
              MY_USERINFO.phone,
              MY_USERINFO.address,
              MY_USERINFO.main_phone,
              COMMON_FUNCTION.CHECKNUMBER(MY_USERINFO.isalarm_account,'isalarm_account'),
              COMMON_FUNCTION.CHECKNUMBER(MY_USERINFO.state,'state'),
              COMMON_FUNCTION.CHECKNUMBER(MY_USERINFO.child_num,'child_num'),
              MY_USERINFO.init_password,
              COMMON_FUNCTION.CHECKNUMBER(MY_USERINFO.login_no,'login_no'),
              MY_USERINFO.email,
              COMMON_FUNCTION.CHECKNUMBER(MY_USERINFO.isowe,'isowe'),
              MY_USERINFO.create_time,
              sysdate,
              MY_USERINFO.bookin,
              0--用户区域
        );
    END LOOP;
但是执行后系统就报错:
ORA-06534: 无法访问可连续重用的程序包 "PLSQL.COMMON_FUNCTION",希望高手指点一下,为什么会报这样的错。谢谢了。

解决方案 »

  1.   

    把包中的PRAGMA SERIALLY_REUSABLE; 去掉试试。
      

  2.   

    如果我们使用了 SERIALLY_REUSABLE pragma,每次调用包都会先初始化变量
    你包里面是不是有用type type_name is?你尝试去掉SERIALLY_REUSABLE pragma,再看看行不?
      

  3.   

    原来如此,还真是这个原因,我的包头里面确实定义了一个 TYPE 类型数据。
    去掉了SERIALLY_REUSABLE pragma 就可以调用了,真是多谢搂上几位了。