2012-09-27 3 views
1

J'ai une table non_employee avec emp_no comme clé primaire et un paquet avec une procédure à insérer dans cette table.créer/déclarer une séquence dans une procédure stockée dans oracle

Je dois pouvoir auto-incrémenter l'emp_no lorsque la procédure est exécutée. J'ai essayé de créer une séquence dans la procédure comme ceci, mais en obtenant des erreurs. S'il vous plaît voir ci-dessous et des conseils.

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; 

Im obtenir PLS-00103: Rencontrés le symbole "CREATE" si vous attendez une des opérations suivantes:

commencent fonction fin pragma type de sous-type de procédure

erreur avec ce ...

+0

Vous devrez utiliser 'EXECUTE IMMEDIATE CREATE SEQUENCE ....' pour pouvoir faire cela à partir d'un PLSQL. – Annjawn

Répondre

2

répar-

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

Ce s Il devrait se trouver à l'intérieur d'un corps de procédure ou de fonction et non dans la section de déclaration, c'est-à-dire être traité comme une instruction exécutable.

La création d'une séquence à l'aide de SQL dynamique est une mauvaise idée et je ne sais pas pourquoi vous voudriez le faire. Toutefois, si vous créez une séquence dynamique alors souvenez-vous de laisser tomber aussi bien après avoir terminé, en utilisant

EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_NAME'; 

De cette façon, vous atleast pas rencontrer des problèmes (comme ORA-00955) tout en appelant la procédure de package.

5

Vous devez créer la séquence une seule fois en dehors du package en tant qu'objet de base de données distinct. Ensuite, dans l'instruction d'insertion dans le corps du package, vous pouvez référencer la séquence pour obtenir la valeur suivante.

Questions connexes