2012-09-27 70 views
1

我有一個表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

回答

2

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),而調用封裝程序。

5

您需要在包外部創建一次序列作爲單獨的數據庫對象。然後,在包體中的insert語句中,可以引用序列來獲取下一個值。