1

主キーとして emp_no を持つテーブル non_employee と、このテーブルに挿入するプロシージャを持つパッケージがあります。

プロシージャの実行時に 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 関数プラグマ プロシージャ サブタイプ タイプ

これでエラー...

4

2 に答える 2

5

別のデータベース オブジェクトとして、パッケージの外部でシーケンスを 1 回だけ作成する必要があります。次に、パッケージ本体の挿入ステートメントで、シーケンスを参照して次の値を取得できます。

于 2012-09-27T15:50:24.143 に答える
2

試す-

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このようにして、パッケージプロシージャの呼び出し中に少なくともエラー(など)が発生することはありません。

于 2012-09-27T15:24:40.463 に答える