首页 文章

在oracle中的存储过程中创建/声明一个序列

提问于
浏览
1

我有一个表non_employee,其中emp_no作为主键,并且包含一个包含插入此表的过程的包 .

我需要能够在程序运行时自动增加emp_no . 我尝试在这样的过程中创建一个序列,但是得到了错误 . 请看下面的建议 .

CREATE OR REPLACE PACKAGE BODY WFDDEV."ERD" IS

create SEQUENCE @seq_emp_nmbr;

PROCEDURE INS_NON_EMPLOYEES
(
in_DATE_ADDED        DATE,  
in_EMPLOYEE_NAME     VARCHAR2,
in_DEPT_ID           VARCHAR2,
in_SUB_DEPARTMENT    VARCHAR2,
in_LOCATION          VARCHAR2,
in_WORK_TEL_NO       VARCHAR2,
in_TOUR              VARCHAR2,
in_REST_DAYS         VARCHAR2,
in_HOME_ADDRESS      VARCHAR2,
in_CITY              VARCHAR2,
in_STATE             VARCHAR2,
in_ZIP               VARCHAR2,
in_HOME_TEL_NO       VARCHAR2,
in_GENDER            VARCHAR2,
in_RACE              VARCHAR2,
in_DATE_OF_BIRTH     DATE,
in_AGE               VARCHAR2,
in_HIRE_DATE         DATE,
in_UNION_AFFILIATION VARCHAR2,
in_TITLE             VARCHAR2,
in_NON_EE_INDICATOR  VARCHAR2
) IS
BEGIN



INSERT INTO WFDDEV.NON_EMPLOYEES
  (
  EMP_NO,
  DATE_ADDED,
  EMPLOYEE_NAME,
  DEPT_ID,
  SUB_DEPARTMENT,
  LOCATION,
  WORK_TEL_NO,
  TOUR,
  REST_DAYS,
  HOME_ADDRESS,
  CITY,
  STATE,
  ZIP,
  HOME_TEL_NO,
  GENDER,
  RACE,
  DATE_OF_BIRTH,
  AGE,
  HIRE_DATE,
  UNION_AFFILIATION,
  TITLE,
  NON_EE_INDICATOR
  )
VALUES
  (
 emp_no.NEXTVAL,
  in_DATE_ADDED,
  in_EMPLOYEE_NAME,
  in_DEPT_ID,
  in_SUB_DEPARTMENT,
  in_LOCATION,
  in_WORK_TEL_NO,
  in_TOUR,
  in_REST_DAYS,
  in_HOME_ADDRESS,
  in_CITY,
  in_STATE,
  in_ZIP,
  in_HOME_TEL_NO,
  in_GENDER,
  in_RACE,
  in_DATE_OF_BIRTH,
  in_AGE,
  in_HIRE_DATE,
  in_UNION_AFFILIATION,
  in_TITLE,
  in_NON_EE_INDICATOR
  );
END;

我得到PLS-00103:遇到以下其中一项时遇到符号“CREATE”:

begin end function pragma procedure子类型

错误...

2 回答

  • 2

    您需要在包外部创建一个序列作为单独的数据库对象 . 然后,在包体中的insert语句中,您可以引用序列以获取下一个值 .

  • 5

    尝试-

    EXECUTE IMMEDIATE 'CREATE SEQUENCE SEQ_NAME  START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 1000000 NOCYCLE NOCACHE ORDER';
    

    这应该在一个过程或函数体内,而不是在声明部分,即这应该被视为可执行语句 .

    使用动态SQL创建序列是一个坏主意,我不确定为什么要这样做 . 但是,如果您正在动态创建一个序列,那么请记住在完成后使用它来删除它

    EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_NAME';
    

    这样,在调用包过程时,您至少不会遇到错误(如 ORA-00955 ) .

相关问题