在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” 期待之一,当以下:
末开始编译功能程序亚型类型与此
错误...
答
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语句中,可以引用序列来获取下一个值。
您将不得不使用'EXECUTE IMMEDIATE CREATE SEQUENCE ....'来从PLSQL中执行该操作。 – Annjawn