Zamiana triggera w procedure

0

Witajcie,
jestem dosyć poczatkujący, aczkolwiek rzucony od razu na glebokie wody. Musze zreprodukowac proces polegajacy na exporcie niektórych danych z jednej tabeli do drugiej. Muszę zatem wyciąć ciało triggera i opakowac je w procedure. Import jest z tabeli *rating *do tabeli *xtexport_table_1 *. Mam prośbe o sugestie, i podpowiedzi dotyczące składni zbudowania takiej proceury.

Sam doszedłem do tego że wszystkie warunkowe opcje triggera 'IF INSERTING', 'ELSIF UPDATING' powienienem usunąć, jednoczesnie potem w składni 'INSERT INTO', powinienem wmontować 'SELECT' zaciągającego dane z tabeli rating.

Powodzenia w łamigłówce i stokrotne dzięki z góry za support ;)

create or replace
TRIGGER TRG_RATING_EXP_DLS
BEFORE DELETE OR UPDATE OR INSERT
OF RATING_ID,EXTERNAL_ID_1,DN_RATING_ATTRIBUTE_ID,ALIGNMENT_ID,TEAM_ID,CUSTOMER_ID,AFFILIATION_ID,PRODUCT_ID,PERIOD_ID,VALUE_MIN,VALUE_MAX,TENANT_ID,USER_ACCOUNT_ID
ON RATING
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
	nOperation XTEXPORT_TABLE_1.OPERATION%TYPE	:= 0;
	nSchemaId XTEXPORT_TABLE_1.SCHEMA_ID%TYPE	:= 3600;
	nParentTag XTEXPORT_TABLE_1.PARENT_TAG%TYPE	:= -1;
	nChildTag XTEXPORT_TABLE_1.CHILD_TAG%TYPE	:= 3600;
	nExportStatus XTEXPORT_TABLE_1.STATUS%TYPE	:= 0;
	vcTransactionId XTEXPORT_TABLE_1.DBMSTRANSACTION_ID%TYPE := DBMS_TRANSACTION.LOCAL_TRANSACTION_ID;

	--Fields to be exported are
	nRatingId				RATING.RATING_ID%TYPE := NULL;
	nDnRatingAttributeId	RATING.DN_RATING_ATTRIBUTE_ID%TYPE := NULL;
	nPeriodId				RATING.PERIOD_ID%TYPE := NULL;
	nTeamId					RATING.TEAM_ID%TYPE := NULL;
	nAlignmentId			RATING.ALIGNMENT_ID%TYPE := NULL;
	nCustomerId				RATING.CUSTOMER_ID%TYPE := NULL;
	nAffiliationId			RATING.AFFILIATION_ID%TYPE := NULL;
	nProductId				RATING.PRODUCT_ID%TYPE := NULL;
	vcValuMax				RATING.VALUE_MAX%TYPE := NULL;
	vcValuMin				RATING.VALUE_MIN%TYPE := NULL;
	vcExternalId_1			RATING.EXTERNAL_ID_1%TYPE := NULL;
	nUserAccountId			RATING.USER_ACCOUNT_ID%TYPE :=NULL;
	iTenantID				NUMBER (16);
	vcPeriodIdNULL			varchar2(10):= NULL;
	vcTeamIdNULL			varchar2(10):= NULL;
	vcAlignmentIdNULL		varchar2(10):= NULL;
	vcAffiliationIdNULL		varchar2(10):= NULL;
	vcProductIdNULL			varchar2(10):= NULL;
	vcUserAccountIdNULL		varchar2(10):= NULL;
BEGIN

	IF (Xtelligent.DI_fnRPLUser(USER) = TRUE OR Xtelligent.DI_fnIDLUser(USER) = TRUE) THEN
		RETURN;
	END IF;
	IF (TENANT_PKG.TriggersEnabled ('XTDE') = 0 ) THEN
		RETURN;
	END IF;

	IF INSERTING THEN

		IF (:NEW.EXTERNAL_ID_1 IS NULL) THEN
			:NEW.EXTERNAL_ID_1 :=:NEW.RATING_ID;
			vcExternalId_1 := :NEW.RATING_ID;
		ELSE
			vcExternalId_1 := :NEW.EXTERNAL_ID_1;
		END IF;

		IF (:NEW.GLOBAL_RATING_ID IS NULL) THEN
			SELECT SEQ_IS_GLOBAL_IDENTIFIER.NEXTVAL INTO :NEW.GLOBAL_RATING_ID FROM dual;
		END IF;

		nOperation				:= 1;
		nRatingId				:= :NEW.RATING_ID;
		nDnRatingAttributeId	:= :NEW.DN_RATING_ATTRIBUTE_ID;
		nPeriodId				:= :NEW.PERIOD_ID;
		nTeamId					:= :NEW.TEAM_ID;
		nAlignmentId			:= :NEW.ALIGNMENT_ID;
		nCustomerId				:= :NEW.CUSTOMER_ID;
		nAffiliationId			:= :NEW.AFFILIATION_ID;
		nProductId				:= :NEW.PRODUCT_ID;
		vcValuMax				:= :NEW.VALUE_MAX;
		vcValuMin				:= :NEW.VALUE_MIN;
		iTenantID				:= :NEW.TENANT_ID;
		nUserAccountId          := :NEW.USER_ACCOUNT_ID;
	ELSIF UPDATING THEN

		IF (:NEW.EXTERNAL_ID_1 IS NULL) THEN
			:NEW.EXTERNAL_ID_1 :=:NEW.RATING_ID;
			vcExternalId_1 := :NEW.RATING_ID;
		ELSE
			vcExternalId_1 := :NEW.EXTERNAL_ID_1;
		END IF;

		nOperation := 0;	-- update request 0
		nRatingId := :NEW.RATING_ID;
		nDnRatingAttributeId := :NEW.DN_RATING_ATTRIBUTE_ID;
		nCustomerId := :NEW.CUSTOMER_ID;
		iTenantID := :NEW.TENANT_ID;

		IF (:NEW.PERIOD_ID is NULL and :OLD.PERIOD_ID is NOT NULL) THEN
			vcPeriodIdNULL :='$$$$';
		ELSE
			nPeriodId := :NEW.PERIOD_ID;
		END IF;
		IF (:NEW.TEAM_ID is NULL and :OLD.TEAM_ID is NOT NULL) THEN
			vcTeamIdNULL :='$$$$';
		ELSE
			nTeamId := :NEW.TEAM_ID;
		END IF;

		IF (:NEW.ALIGNMENT_ID is NULL and :OLD.ALIGNMENT_ID is NOT NULL) THEN
			vcAlignmentIdNULL :='$$$$';
		ELSE
			nAlignmentId := :NEW.ALIGNMENT_ID;
		END IF;

		IF (:NEW.AFFILIATION_ID is NULL and :OLD.AFFILIATION_ID is NOT NULL) THEN
			vcAffiliationIdNULL :='$$$$';
		ELSE
			nAffiliationId := :NEW.AFFILIATION_ID;
		END IF;

		IF (:NEW.PRODUCT_ID is NULL and :OLD.PRODUCT_ID is NOT NULL) THEN
			vcProductIdNULL :='$$$$';
		ELSE
			nProductId := :NEW.PRODUCT_ID;
		END IF;

		IF (:NEW.VALUE_MAX is NULL and :OLD.VALUE_MAX is NOT NULL) THEN
			vcValuMax :='$$$$';
		ELSE
			vcValuMax := :NEW.VALUE_MAX;
		END IF;
		IF (:NEW.VALUE_MIN is NULL and :OLD.VALUE_MIN is NOT NULL) THEN
			vcValuMin :='$$$$';
		ELSE
			vcValuMin := :NEW.VALUE_MIN;
		END IF;

		IF (:NEW.USER_ACCOUNT_ID is NULL and :OLD.USER_ACCOUNT_ID is NOT NULL) THEN
			vcUserAccountIdNULL :='$$$$';
		ELSE
			nUserAccountId := :NEW.USER_ACCOUNT_ID;
		END IF;

	ELSIF DELETING THEN

		nOperation				:= -2;-- delete request -2
		nRatingId				:= :OLD.RATING_ID;
		nDnRatingAttributeId	:= :OLD.DN_RATING_ATTRIBUTE_ID;
		nPeriodId				:= :OLD.PERIOD_ID;
		nTeamId					:= :OLD.TEAM_ID;
		nAlignmentId			:= :OLD.ALIGNMENT_ID;
		nCustomerId				:= :OLD.CUSTOMER_ID;
		nAffiliationId			:= :OLD.AFFILIATION_ID;
		nProductId				:= :OLD.PRODUCT_ID;
		vcValuMax				:= :OLD.VALUE_MAX;
		vcValuMin				:= :OLD.VALUE_MIN;
		iTenantID				:= :OLD.TENANT_ID;
		nUserAccountId          := :OLD.USER_ACCOUNT_ID;
 	   	IF (:OLD.EXTERNAL_ID_1 IS NULL) THEN
			vcExternalId_1 := :OLD.RATING_ID;
		ELSE
			 vcExternalId_1 := :OLD.EXTERNAL_ID_1;
		END IF;

	END IF;

	INSERT INTO XTEXPORT_TABLE_1
	(
		XTEXPORT_ID,
		SCHEMA_ID,
		OPERATION,
		PARENT_TAG,
		CHILD_TAG,
		STATUS,
		TIME_STAMP,
		DBMSTRANSACTION_ID,
		KEY_1,
		IDENTIFIER_1,
		IDENTIFIER_2,
		IDENTIFIER_3,
		IDENTIFIER_4,
		IDENTIFIER_5,
		IDENTIFIER_6,
		IDENTIFIER_7,
		STRING_1,
		STRING_2,
		IDENTIFIER_8,
		CODE_1,
		CODE_2,
		CODE_3,
		CODE_4,
		CODE_5,
		CODE_6,
		TENANT_ID
	)
	VALUES
	(
		XTEXPORT_ID_SEQ.NEXTVAL,
		nSchemaId,
		nOperation,
		nParentTag,
		nChildTag,
		nExportStatus,
		SYSDATE,
		vcTransactionId,
		vcExternalId_1,
		nDnRatingAttributeId,
		nPeriodId,
		nTeamId,
		nAlignmentId,
		nCustomerId,
		nAffiliationId,
		nProductId,
		vcValuMin,
		vcValuMax,
		nUserAccountId,
		vcPeriodIdNULL,
		vcTeamIdNULL,
		vcAlignmentIdNULL,
		vcAffiliationIdNULL,
		vcProductIdNULL,
		vcUserAccountIdNULL,
		iTenantID
	);

END TRG_RATING_EXP_DLS;
0

Nie wiem, czy wycinanie IF'ów jest dobrym pomysłem. Nie mam czasu na analizę całego triggera, ale już na pierwszy rzut oka widać, że trochę inne rzeczy dzieją się przy INSERT, niż przy UPDATE, a jeszcze inne przy DELETE - być może Ciebie z założenia powinien interesować tylko jeden z tych przypadków.

Ja bym zrobił procedurę z trzema parametrami: stary_rekord rating%rowtype, nowy_rekord rating%rowtype, typ_operacji char.
Potem zamiast pisać np. :OLD.PERIOD_ID piszesz stary_rekord.PERIOD_ID. Ewentualnie commita można dodać po insercie, bo w triggerze go nie mogło być. Ale to jak wolisz - możesz commitować zewnętrznie - ręcznie, w nadrzędnej procedurze, w języku z którego wołasz ten kod itp.

0

Ale chodzi o to że ten trigger jest wywołany przez te zmiany: INSERT, UPDATE czy DELETE. A ja chcę zbudować taką procedurę która tylko wyciągnie mi dane z jednej tabeli i wyeksportuje do drugiej. Problem w tym, że nie wiem jak powinna wyglądać prawidłowa składnia, ponadto w nowej tabeli (xtexport..) są wypełniane inne kolumny dla których wcześniej deklarowane są pewne wartości, z którymi tez mam problem.

Ale dzięki za respond ;)

0

napisz najpierw selecta, który wyciągnie Ci dokładnie te dane, które chcesz zapisać do nowej tabeli. Jak to zrobisz to potem będzie z górki

0

Jestem totalnie nieogarnięty jeżeli chodzi o te zmienne złożone. Próbowałem zmontować coś takiegom ale niestety nie bangla(complied with errorrs, których nie pokazuje):

create or replace
procedure procedura_testowa

is

begin

	nOperation kopia_xtexport_table_1 .OPERATION%TYPE	:= 0;
	nSchemaId kopia_xtexport_table_1 .SCHEMA_ID%TYPE	:= 3600;
	nParentTag kopia_xtexport_table_1 .PARENT_TAG%TYPE	:= -1;
	nChildTag kopia_xtexport_table_1 .CHILD_TAG%TYPE	:= 3600;
	nExportStatus kopia_xtexport_table_1 .STATUS%TYPE	:= 0;
	vcTransactionId kopia_xtexport_table_1 .DBMSTRANSACTION_ID%TYPE := DBMS_TRANSACTION.LOCAL_TRANSACTION_ID;

	--Fields to be exported are
	nRatingId				RATING.RATING_ID%TYPE := NULL;
	nDnRatingAttributeId	RATING.DN_RATING_ATTRIBUTE_ID%TYPE := NULL;
	nPeriodId				RATING.PERIOD_ID%TYPE := NULL;
	nTeamId					RATING.TEAM_ID%TYPE := NULL;
	nAlignmentId			RATING.ALIGNMENT_ID%TYPE := NULL;
	nCustomerId				RATING.CUSTOMER_ID%TYPE := NULL;
	nAffiliationId			RATING.AFFILIATION_ID%TYPE := NULL;
	nProductId				RATING.PRODUCT_ID%TYPE := NULL;
	vcValuMax				RATING.VALUE_MAX%TYPE := NULL;
	vcValuMin				RATING.VALUE_MIN%TYPE := NULL;
	vcExternalId_1			RATING.EXTERNAL_ID_1%TYPE := NULL;
	nUserAccountId			RATING.USER_ACCOUNT_ID%TYPE :=NULL;
	iTenantID				NUMBER (16);
	vcPeriodIdNULL			varchar2(10):= NULL;
	vcTeamIdNULL			varchar2(10):= NULL;
	vcAlignmentIdNULL		varchar2(10):= NULL;
	vcAffiliationIdNULL		varchar2(10):= NULL;
	vcProductIdNULL			varchar2(10):= NULL,
	vcUserAccountIdNULL		varchar2(10):= NULL

INSERT INTO kopia_xtexport_table_1 (
		XTEXPORT_ID,
		SCHEMA_ID,
		OPERATION,
		PARENT_TAG,
		CHILD_TAG,
		STATUS,
		TIME_STAMP,
		DBMSTRANSACTION_ID,
		KEY_1,
		IDENTIFIER_1,
		IDENTIFIER_2,
		IDENTIFIER_3,
		IDENTIFIER_4,
		IDENTIFIER_5,
		IDENTIFIER_6,
		IDENTIFIER_7,
		STRING_1,
		STRING_2,
		IDENTIFIER_8,
		CODE_1,
		CODE_2,
		CODE_3,
		CODE_4,
		CODE_5,
		CODE_6,
		TENANT_ID
	)
  
	VALUES
  
	(
		XTEXPORT_ID_SEQ.NEXTVAL,
		nSchemaId,
		nOperation,
		nParentTag,
		nChildTag,
		nExportStatus,
		SYSDATE,
		DBMSTRANSACTION_ID_seq.nextval,
    (SELECT
    External_id_1,
    dn_rating_attribute_id,
    period_id,
    team_id,
    alignment_id,
    customer_id,
    affiliation_id,
    product_id,
    value_min,
    value_max,
    user_account_id FROM rating),
    vcPeriodIdNULL,
		vcTeamIdNULL,
		vcAlignmentIdNULL,
		vcAffiliationIdNULL,
		vcProductIdNULL,
		vcUserAccountIdNULL,
    (SELECT tenant_id FROM rating)
    
		)
    end 
    ;
0
Misiekd napisał(a)

napisz najpierw selecta, który wyciągnie Ci dokładnie te dane, które chcesz zapisać do nowej tabeli. Jak to zrobisz to potem będzie z górki

0

no ale w czym masz problem bo ja cały czas nie wiem. Jak masz selecta, który zwraca Ci WSZYSTKO to co chcesz to co za problem napisać

INSERT INTO dupa(dupa_1, dupa_2, dupa_n) SELECT i_tutaj_pola_które_już_masz FROM tabela_z_której_ma_to_być

i to CAŁA procedura. Możesz do niej przekazywać jakieś ID czy coś innego aby zawęzić wyniki selecta.

Zauważ, że te dane, które chcesz JUŻ SĄ w tabeli.

0

Dzięki Scovron, Misiekd za rady (pomocne) i Madmike za correcte :) ogarnąłem budując poprawną składnię i pozbywając się tych zmiennych wmontowywując je w SELECTA.

Pozdrówki, zamykam temat

1 użytkowników online, w tym zalogowanych: 0, gości: 1