2013-03-21 2 views
1

모든 데이터를 대문자로 삽입해야합니다. Oracle 데이터베이스를 사용하고 있으며 작업을 수행 할 수있는 방아쇠를 썼습니다. 문제는 다음과 같은 사실을 알지 못한다는 것입니다.대문자로 삽입하기 전에 행

이것은 내 코드입니다.

CREATE OR REPLACE TRIGGER my_trigger 
    BEFORE INSERT OR UPDATE ON MY_TABLE 
    FOR EACH ROW 
     DECLARE 
      CURSOR fields IS 
       SELECT COLUMN_NAME FROM user_tab_columns WHERE table_name='MY_TABLE'; 
      field user_tab_columns%ROWTYPE; 
    BEGIN 
     FOR field IN fields LOOP 
      DECLARE 
       theField VARCHAR2(100) := field.COLUMN_NAME; 
       newValue NVARCHAR2(1000) := :NEW."MY_FIELD"; 
       BEGIN 
        :NEW."MY_FIELD" := UPPER(nValor); 
       END; 
     END LOOP; 
    END; 
/

"MY_FIELD"필드와 작동하지만 대신 "myField"변수를 사용해야합니다. 그런 식으로 테이블의 모든 필드를 바꿀 수 있다고 생각합니다.

누군가가 저를 도울 수 있거나, 저에게 다른 방법을 제안 할 수 있기를 바랍니다.

감사합니다.

+0

나는 그렇게 할 방법을 모른다. 테이블에있는 모든 열 이름을 이미 알지 못합니까? 처리 할 것으로 예상되는 기간 당 삽입 횟수는 확실하지 않지만 반복적으로 데이터 사전을 읽는 것은 그리 적합하지 않습니다. 나는 방아쇠의 큰 팬이 아니다. 그들은 목적이 있습니다. 이것은 하나 일 수 있습니다. 호출 응용 프로그램에서 insert 문에 "upper"함수를 호출 할 수없는 이유는 무엇입니까? – OldProgrammer

+0

답장을 보내 주셔서 감사합니다. 열 이름을 알고, 문제는 테이블이 많이 있다는 것입니다. 게다가, 같은 데이터베이스를 사용하는 많은 응용 프로그램이 있기 때문에 나는 응용 프로그램을 수정할 수 없습니다. 그리고 그들 중 두 개가 alredy를 준수했습니다. – miguemx

+1

그런 다음 PL/SQL 스크립트를 작성하여 테이블에 의해 구동되는 트리거 코드를 작성하십시오. – OldProgrammer

답변

2

코드를 작동시키는 방식은 도전적으로 비효율적입니다. 수정 된 행마다 상상해보십시오. 오라클은 테이블의 모든 열을 반복해야합니다!

는 모든 테이블이를 작성하는 도전에 직면, 이제 다음

:NEW.FIRST_NAME = UPPER(:NEW.FIRST_NAME); 
:NEW.LAST_NAME = UPPER(:NEW.LAST_NAME); 

같은 일반적인 방법으로 트리거를 작성합니다. 이를 위해서는 코드를 생성하는 PL/SQL 코드를 작성하는 것이 좋습니다. 테이블 이름을 지정하면 코드에서 CREATE TRIGGER 코드를 생성합니다.

FOR C IN (SELECT COLUMN_NAME AS CNAME FROM user_tab_columns WHERE table_name='MY_TABLE') 
DBMS_OUTPUT.PUT_LINE(':NEW.'||CNAME || ':=UPPER(:NEW.'||CNAME ||')'); 
END LOOP; 

너무 많은 열과 테이블이있는 경우 DBMS_OUT 버퍼가 가득 찰 수 있습니다. 임시 테이블에 코드를 삽입하는 것이 좋습니다.

+0

숫자와 날짜에'upper'를 적용하려는 시도를 피하려면 ('VARCHAR2', 'CLOB')'에 조건과 DATA_TYPE을 추가하는 것이 좋습니다. –

관련 문제