중복 검사를위한 간단한 SQL (트리거)이 필요합니다. 테이블 이름이 test1
이고 열이 2 개이고 code
및 sname
입니다. 새 레코드를 삽입하기 전에 레코드가 이미 있는지 확인하십시오. 레코드가 있으면 오류를 생성하고 삽입하지 마십시오. 그렇지 않으면 삽입을 진행하십시오.Informix 4GL 및 트리거
어떻게하면됩니까?
중복 검사를위한 간단한 SQL (트리거)이 필요합니다. 테이블 이름이 test1
이고 열이 2 개이고 code
및 sname
입니다. 새 레코드를 삽입하기 전에 레코드가 이미 있는지 확인하십시오. 레코드가 있으면 오류를 생성하고 삽입하지 마십시오. 그렇지 않으면 삽입을 진행하십시오.Informix 4GL 및 트리거
어떻게하면됩니까?
테이블에 중복 데이터가 전혀 트리거를 사용하지 않지만 UNIQUE 또는 PRIMARY KEY 제약 조건 사용하지 않는이 있는지 확인하는 가장 간단한, 가장 신뢰할 수있는 방법 : NULL NOT
CREATE TABLE test1
(
code INTEGER NOT NULL PRIMARY KEY,
sname VARCHAR(32) NOT NULL UNIQUE
);
네 제약 (두 , 하나의 PRIMARY KEY, 하나의 UNIQUE)는 중복 레코드가 테이블에 삽입되지 않도록 자동으로 보장합니다.
트리거를 추가하도록 선택하면 이러한 제약 조건에 의해 수행되는 작업이 복제됩니다.
트리거하는 방법에 관해서는 트리거 문에서 호출하는 저장 프로 시저를 만들어야합니다. 새 코드와 새 이름이 주어지며 일치하는 레코드가 있는지 확인하기 위해 SELECT를 수행하고 그렇지 않은 경우 예외를 발생시키고 예외가 발생하지 않으면 예외를 발생시킵니다. 그런 다음
CREATE PROCEDURE trig_insert_test1(ncode INTEGER, nname VARCHAR(32))
DEFINE ocode INTEGER;
FOREACH SELECT code INTO ocode
FROM test1
WHERE code = ncode OR sname = nname
RAISE EXCEPTION -271, -100, "Value to be inserted already exists in table test1";
END FOREACH;
END PROCEDURE
당신은 사용
인포믹스 4GL에서CREATE TRIGGER ins_test1 INSERT ON test1
REFERENCING NEW AS NEW
FOR EACH ROW (EXECUTE PROCEDURE ins_trig_test1(new.code, new.sname))
, 당신이 문을 포함하는 문자열을 만들 수 있습니다, 다음 PREPARE 및 EXECUTE (및 무료)을하거나 SQL 블록을 사용할 수 있습니다
SQL
CREATE TRIGGER ins_test1 INSERT ON test1
REFERENCING NEW AS NEW
FOR EACH ROW (EXECUTE PROCEDURE ins_trig_test1(new.code, new.sname))
END SQL
하지만 처음에 말했듯이 트리거를 사용하는 것이 최선의 방법은 아닙니다. 테이블 정의가 주어지면 중복됩니다.
SQL 또는 SPL을 서버를 지나서 실행하지 않았습니다. 당신은 SPL이 그것에 대해 까다로운 것처럼 세미콜론이 SPL의 올바른 위치에 있는지 확인해야합니다.
Informix 11.70 Information Centre에서 SQL 및 SPL 문의 구문을 찾을 수 있습니다.
설정을 조금 설명해야합니다. 데이터베이스 서버는 SE 또는 IDS (또는 드물지는 않지만 OnLine 또는 XPS)입니다. 같은 기계에있을 수도 있습니다. 어떤 버전의 I4GL을 사용하고 있습니까? ('i4gl -V'를 실행 해보세요.) 서버를 관리하지 않으면 SE가 실행 중일 수 있습니다. '$ INFORMIXDIR/lib/sqlexec -V'를 실행하여 버전을 확인하고 인쇄 할 수 있습니다. 'sqlexec' 프로그램이 없다면 SE가 없습니다. '$ INFORMIXDIR/bin/oninit' (또는 아마도 $ INFORMIXDIR/bin/tbinit')이 있어야합니다. '-V' 플래그로 버전을 구할 수 있습니다. –
SE 7.25에서 O/S가 실행 중입니까? 그리고 어떤 버전의 I4GL? –
아니오; 나는 당신이 충돌하는 프로그램을 보여주지 않았기 때문에 더 이상 당신을 도울 수 없습니다. 짧고 달콤하고 완벽해야합니다. 프로그램을 중단시킬 수 없어야합니다 ('dump core'에서와 같이). 뭔가 잘못되어 멈추게 될 수도 있습니다. 하지만 어떤 코드를 볼 수 없기 때문에 문제를 해결할 수는 없습니다. 코드를 추가하려면 질문을 편집하십시오. –
무엇을 시도 했습니까? 왜 사용하지 않았습니까? 매뉴얼은 [Informix 11.70 Information Center] (http://publib.boulder.ibm.com/infocenter/idshelp/v117/index.jsp)에서 찾을 수 있습니다. 단순히 각 열에 고유 한 제약 조건을 만드는 대신 트리거를 원하십니까? 필요하지 않으면 트리거를 코딩하지 마십시오. 비 - 트리거 제약 조건은 '더 효율적'이 될 것입니다. 그리고 I4GL이 CREATE TRIGGER 구문을 인식하는지 여부와 관련된 문제는 완전히 분리되어 있습니다. 명령.을 SQL CREATE TRIGGER ... END SQL 블록으로 -어야합니다. –
이 informix 4GL에 대해서는 잘 모릅니다. 여기에 그들은 내가 방아쇠를 만들길 원한다. 나는 선택 진술로 덧붙이려고했지만 아무 생각도하지 않았다. – MJJ3
교실 운동 인 경우 특정 제약 조건을 논의한대로 처리하기는하지만 장점이있을 수 있습니다. 프로덕션 코드의 경우에는 해당 요구 사항을 이해할 수 없다고 설명해야하며,이를 볼 수있게하거나 (또는 전자 메일 주소를 보려면 내 프로필 참조) 나와 논의하십시오. –