programing

Oracle 생성 트리거 오류(나쁜 바인딩 변수)

stoneblock 2023. 9. 21. 20:02

Oracle 생성 트리거 오류(나쁜 바인딩 변수)

나는 다음 코드로 트리거를 만들려고 합니다.

CREATE OR REPLACE TRIGGER MYTABLE_TRG 
BEFORE INSERT ON MYTABLE 
FOR EACH ROW 
BEGIN 
 select MYTABLE_SEQ.nextval into :new.id from dual; 
END;

오류가 납니다.

Error(2,52): PLS-00049: bad bind variable 'NEW.ID'

무슨 생각 있어요?감사해요.

오류 코드가 테이블에 그런 컬럼 ID가 없다는 것을 알려주는 것 같습니다.

어떻게든 당신의 환경은 당신의 코드를 DDL 문이 아닌 SQL로 취급하고 있습니다.이것은 나에게 효과가 있습니다(sqlplus에서 실행됨).명령 프롬프트에서 exe):

SQL> create sequence mytable_seq;

Sequence created.

SQL> create table mytable (id number);

Table created.

SQL> CREATE OR REPLACE TRIGGER MYTABLE_TRG
  2  BEFORE INSERT ON MYTABLE
  3  FOR EACH ROW
  4  BEGIN
  5   select MYTABLE_SEQ.nextval into :new.id from dual;
  6  END;
  7  /

Trigger created.

후행 "/" - 이는 컴파일 중인 응용프로그램에서 중요할 수 있습니다.

만약 누군가가 적절한 명명 규칙을 사용한다면, 이러한 유형의 오류를 발견하는 것은 훨씬 더 쉬워질 것입니다. (적절한 수단이 사전 및 사후 수정을 사용하는 경우) 그들의 목적에 대해 더 잘 암시하는 일반적인 객체 이름에 대해. 즉, 이와 같은 것은 정답을 발견했을 것입니다.

  --START -- CREATE A SEQUENCE
  /*
  create table "TBL_NAME" (
     "TBL_NAME_ID"      number(19,0) NOT NULL 
    , ... 
  */  
  --------------------------------------------------------
  --  drop the sequence if it exists
  -- select * from user_sequences ; 
  --------------------------------------------------------
  declare
     c int;
  begin
     select count(*) into c from user_sequences 
      where SEQUENCE_NAME = upper('SEQ_TBL_NAME');
     if c = 1 then
        execute immediate 'DROP SEQUENCE SEQ_TBL_NAME';
     end if;
  end;
  /

  CREATE SEQUENCE  "SEQ_TBL_NAME"  
  MINVALUE 1 MAXVALUE 999999999999999999999999999 
  INCREMENT BY 1 START WITH 1 
  CACHE 20 NOORDER  NOCYCLE ;


  -- CREATE  
  CREATE OR REPLACE TRIGGER "TRG_TBL_NAME" 
  BEFORE INSERT
  ON "TBL_NAME"
  REFERENCING NEW AS New OLD AS Old
  FOR EACH ROW
  DECLARE
  tmpVar NUMBER;

  BEGIN
     tmpVar := 1 ;

     SELECT SEQ_TBL_NAME.NEXTVAL INTO tmpVar FROM dual;
     :NEW.TBL_NAME_ID := tmpVar;

  END TRG_TBL_NAME; 
  /
  ALTER TRIGGER "TRG_TBL_NAME" ENABLE;
  -- STOP  -- CREATE THE TRIGGER

만약 당신이 나와 비슷하고 당신의 코드가 작동해야 한다면, 당신이 트리거를 다시 만들기 전에 명시적으로 삭제해 보세요.바보같은 오라클.

언급URL : https://stackoverflow.com/questions/14993980/oracle-create-trigger-error-bad-bind-variable