2010-12-15 5 views
0

한 명령문에서이를 수행해야한다는 요구 사항은 프로그램이 SQL 문을 처리하는 방법 때문입니다. SQL 문은 다른 테이블의 열에 저장되고 레코드 세트에서 열기를 통해 실행됩니다. 세미콜론이 명령문에있는 경우 open은 유효하지 않은 문자 오류로 응답합니다.하나의 테이블에 삽입하고 동일한 SQL 문으로 다른 테이블을 업데이트하려면 어떻게해야합니까?

시나리오 : 특정 조건에서 데이터베이스 A의 한 레코드에서 특정 필드를 업데이트하고 삽입으로 로그 테이블에 해당 변경 사실을 기록하려고합니다.

update data_table a set field1='new value' where identifier=10; 

insert into log_table (action_taken) 
values('record ' || a.identifier || ' had field1 changed to ' || a.field1); 

이 작업을 수행 할 수있는 방법이 있나요 :

는 다음 두 문장을 사용하는 예입니다?

+0

두 번째 문을 트리거로 추가 할 수 있습니다 ... – meagar

+1

단일 SQL 문에서 수행 할 수 없습니다. 옵션은 빈약 한 제안 된 트리거 또는 krefftc에서 제안한 저장 ​​프로 시저입니다. – BBlake

답변

3

둘 다 저장 프로 시저에 넣고 저장 프로 시저를 호출하십시오.

+0

불행히도, 나는 특정 절차에 의해 변경되지 않는 한 그것을 기록하고 싶지 않습니다. 트리거는 모든 변경 사항에 대해 기록합니다. 전에 저장 프로 시저를 사용하지 않았지만 쉽게 배울 수 있습니까? BTW, VB.NET에서 Oracle을 사용하고 있습니다. – user543666

0

SQL API 지원 SQL 일괄 처리 명령 인 java 또는 .net을 사용하는 경우 수행 한 작업을 SGDB에 일괄 호출 할 수 있습니다.

update data_table a set field1='new value' where identifier=10; 
GO 
insert into log_table (action_taken) 
values('record ' || a.identifier || ' had field1 changed to ' || a.field1); 
GO 

그러나 동시에 모든 시간을이 두 가지 작업을 수행하려는 경우가 가장 좋은 방법

2

난 당신이 트리거에 대한 찾고있는 생각을 때문에 당신은 krefftc 대답을 받아 들여야한다. 어떤 데이터베이스를 사용하고 있는지 알지 못해서 나는 단지 추측 할 수 있습니다.

다음은 MySQL의 트리거에 대한 정보입니다.

트리거는 테이블에 연결되어 INSERT, UPDATE 또는 DELETE와 같은 특정 이벤트에서 시작합니다. 그런 다음 트리거는 하나 이상의 SQL 문을 실행할 수 있습니다. 여기

그리고는 데이터베이스가 어떤 이유로 당신은 /는 만들지 않으 수없는 경우 오라클은 익명 PL/SQL 블록을 사용할 수 있습니다 것을 일어나는 경우가 trigger

0

를 만드는 방법입니다 저장 프로 시저 :

BEGIN 
update data_table a set field1='new value' where identifier=10; 

insert into log_table (action_taken) 
    values('record ' || a.identifier || ' had field1 changed to ' || a.field1); 
END; 
+0

실제로 Oracle에서이 작업을 시도했지만 세미콜론을 포함 할 때마다 잘못된 문자가 계속 나타납니다. 이 문제를 해결할 방법을 알고 있다면 문제가 해결 될 수 있습니다. – user543666

+0

필자가 제안한 것처럼'BEGIN'과'END' 구문을 사용하지 않을 것입니다. 그게 효과가있다. – Dan

관련 문제