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

问题描述:

我有一个表emp_no作为主键的non_employee和一个包含插入到这个表的过程的包。在oracle的存储过程中创建/声明一个序列

我需要能够在程序运行时自动增加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” 期待之一,当以下:

末开始编译功能程序亚型类型与此

错误...

+0

您将不得不使用'EXECUTE IMMEDIATE CREATE SEQUENCE ....'来从PLSQL中执行该操作。 – Annjawn

Try-

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

This s应该在程序或函数体内,而不在声明部分,即应该将其视为可执行语句。

使用动态SQL创建序列是一个坏主意,我不确定为什么你想这样做。但是,如果你是动态创建一个序列,然后记完账后放弃它为好,使用

EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_NAME'; 

这样你就不会ATLEAST碰到的错误(如ORA-00955),而调用封装程序。

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