2013-11-09 2 views
0

Oracle 데이터베이스 11gR2가 있으며 블록과 함께 자동으로 트리거를 생성하려고합니다. 아래 쿼리를 실행하려면 오류가 있습니다.oracle에서 트리거를 만드는 방법은 무엇입니까?

내 블록이다

declare 
    tablesid number ; 
    tablenames varchar2(4000); 
    cursor c1 is 
    select id , title from hr.tables; 

begin 
    open c1; 
    loop 
     fetch c1 into tablesid , tablenames; 
    CREATE OR REPLACE TRIGGER tablenames||'_before_insert' 
     before insert 
     on hr.tablenames 
     DECLARE 

    columnid number ; 
     columnval number ; 
     columntitle varchar(4000); 

     cursor c2 is 
     select id from hr.columns where tableid = tablesid ; 
     BEGIN 

     -- open c2 ; 
     for rec in c2 loop 
     select title into columntitle from hr.columns where id = rec.id 
     insert into hr.rowaction(columnid,newvalue,oldvalue,actiondate) 
     (
     select id ,:new.columntitle,:old.columntitle,sysdate 
     from hr.tabletiltes 
     where id = rec.id 
    ) 
     select title into columntitle from hr.columns where id = rec.id; 
     dbms_output.put_line(columntitle); 
    end loop; 
    end; 
    end loop ;close c1; end; 

ORA-06550 : 행 11 열 6 : PLS-00103 다음 중 하나를 기대 때 발생하는 심볼이 '만들기 " (케이스 선언 시작 고토에 대한 최종 종료하면 루프 모드 널 프라그 인상 리턴 업데이트를 선택 < < 가까운 현재 삭제 가져 잠금 삽입 개방 롤백 세이브 포인트 세트 FORALL 파이프 퍼지병합 커밋 SQL 실행 계속 함께하면서06550. 00000 - "행 % s, 열 % s : \ n % s" * 원인 : 일반적으로 PL/SQL 컴파일 오류입니다. * 작업 : 바인드 변수 "새로운"선언되지 익명 블록은 바인드 변수 "새로운"선언되지 익명 블록은 트리거 코드의 독립 별도의 조각

감사

+0

의견에서 saeed.sh는 데이터베이스의 모든 테이블에 대해 변경 될 때 데이터를 저장할 트리거를 작성하는 절차를 요청했습니다. 이것은 큰 해결책입니다. –

답변

4

을 완료 완료 일반적으로 객체의 메타 데이터를 정의하는 언어 인 DDL으로 간주됩니다.

PL/SQL 블록 내에 트리거 선언을 내장 할 수 없습니다. 훌륭한 PL/SQL 코드를 즉석에서 생성해야하는 경우 - DMBS_DDL.CREATE_WRAPPED 절차를 고려하십시오. 너는 또한 EXECUTE IMMEDIATE을 염두 해두고있는 것 같다. 그렇다면 다음을 읽으십시오. (http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_ddl.htm)

PL/SQL을 실행하기 전에 트리거를 정의해야합니다. 두 개의 스크립트를 만듭니다.

+0

나는 모든 변경 사항을 데이터베이스에 저장하려고합니다. 3 테이블 : 테이블, 열, rowaction있다. 테이블에서 모든 테이블의 이름을 컬럼에 저장하고 모든 컬럼의 이름을 tableid로 저장합니다. rowaction의 테이블에 삽입하기 전후에 이전 값과 새 값을 저장하려고합니다. 그래서 프로 시저와 함께 데이터베이스의 모든 테이블에 대한 트리거를 자동으로 생성해야합니다. 나는 그 질문에 대해 설명 할 생각이있다. –

+0

이것은 전체 프로젝트입니다! 여기서는 매개 변수화 테이블을 위해이 작업을 수행했으며 이는 훌륭한 코드 조각입니다. 그러나 나 자신을 만들지 않았기 때문에 나는 그것을주지 않을 것이다. –

+0

그냥 내 경험으로, 루프에서 방아쇠를하지 않았지만 프로그래밍 방식으로 래퍼를 사용하지 않고 이와 비슷한 프로그램을 만들었을 때'CREATE OR REPLACE TRIGGER x' 명령을 'END ;'줄을 입력 한 다음 별도의 명령으로'ALTER TRIGGER x ENABLE;'을 실행하여 프로그램 적으로 트리거를 적용하고이 "Enter Binds"창을 클릭하여 클릭하십시오. 다음 명령?). 'EXECUTE IMMEDIATE'를 사용할 필요가 없었고 그런 식으로 시도했을 때 오류가있었습니다. – vapcguy

관련 문제