CREATE OR REPLACE FUNCTION "public"."uspGetPolicyPeriod" ( ProdId INT, EnrolDate DATE, HasCycles BIT = B'0', PolicyStage VARCHAR(1) = N'N' ) RETURNS TABLE("StartDate" DATE, "ExpiryDate" DATE, "HasCycle" BIT) AS $$ DECLARE StartCycle1 DATE; StartCycle2 DATE; StartCycle3 DATE; StartCycle4 DATE; -- I select the start cycles into these sc* variables so I can construct a proper date with them. Selecting text (e.g. 06-01) directly into date variable throws errors sc1 VARCHAR(5); sc2 VARCHAR(5); sc3 VARCHAR(5); sc4 VARCHAR(5); GracePeriod INT; StartDate DATE; InsurancePeriod INT; AdministratorPeriod INT; ExpiryDate DATE; BEGIN --Add administration period to the enrolment date and then check the cycle SELECT "AdministrationPeriod" INTO AdministratorPeriod FROM "tblProduct" WHERE "ProdID" = ProdId; AdministratorPeriod = COALESCE(AdministratorPeriod,0); IF PolicyStage = N'N' THEN EnrolDate = DATEADD_MONTH(AdministratorPeriod, EnrolDate); END IF; --Check if they work on cycles IF EXISTS(SELECT 1 FROM "tblProduct" WHERE "ProdID" = ProdId AND "StartCycle1" IS NOT NULL) THEN HasCycles = B'1'; SELECT "StartCycle1", "StartCycle2", "StartCycle3", "StartCycle4", "GracePeriod", "InsurancePeriod" INTO sc1, sc2, sc3, sc4, GracePeriod, InsurancePeriod FROM "tblProduct" WHERE "ProdID" = ProdId; StartCycle1 = to_date(CONCAT(YEAR(EnrolDate)::VARCHAR(4), sc1), 'YYYYDD-MM'); StartCycle2 = to_date(CONCAT(YEAR(EnrolDate)::VARCHAR(4), COALESCE(NULLIF(sc2,''),sc1)), 'YYYYDD-MM'); StartCycle3 = to_date(CONCAT(YEAR(EnrolDate)::VARCHAR(4), COALESCE(NULLIF(sc3,''),COALESCE(NULLIF(sc2,''),sc1))), 'YYYYDD-MM'); StartCycle4 = to_date(CONCAT(YEAR(EnrolDate)::VARCHAR(4), COALESCE(NULLIF(sc4,''),COALESCE(NULLIF(sc3,''),COALESCE(NULLIF(sc2,''),sc1)))), 'YYYYDD-MM'); IF EnrolDate < DATEADD_MONTH(GracePeriod,StartCycle1) THEN StartDate = StartCycle1; ELSIF EnrolDate < DATEADD_MONTH(GracePeriod,StartCycle2) THEN StartDate = StartCycle2; ELSIF EnrolDate < DATEADD_MONTH(GracePeriod,StartCycle3) THEN StartDate = StartCycle3; ELSIF EnrolDate < DATEADD_MONTH(GracePeriod,StartCycle4) THEN StartDate = StartCycle4; ELSE StartDate = DATEADD_YEAR(1,StartCycle1); END IF; ELSE --They don't work on cycles so get the enrolment date as start date and derive expiry date from product period HasCycles = B'0'; SELECT "InsurancePeriod" INTO InsurancePeriod FROM "tblProduct" WHERE "ProdID" = ProdId; StartDate = EnrolDate; END IF; ExpiryDate = DATEADD_DAY(-1, DATEADD_MONTH(InsurancePeriod, StartDate)); RETURN QUERY SELECT StartDate, ExpiryDate, HasCycles; END $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION "public"."uspPolicyValue" ( FamilyId INT =0, --Provide if policy is not saved ProdId INT =0, --Provide if policy is not saved PolicyId INT = 0, --Provide if policy id is known PolicyStage CHAR(1) = NULL, --Provide N if new policy, R if renewal EnrollDate DATE = NULL, --Enrollment date of the policy PreviousPolicyId INT = 0, --To determine the Expiry Date (For Renewal) ErrorCode INT = 0 ) RETURNS DECIMAL(18,2) AS $$ DECLARE ExpiryDate DATE; HasCycle BIT; StartDate DATE; MinDiscountDateR DATE; MinDiscountDateN DATE; PreviousExpiryDate DATE = NULL; LumpSum DECIMAL(18,2) = 0; PremiumAdult DECIMAL(18,2) = 0; PremiumChild DECIMAL(18,2) = 0; RegistrationLumpSum DECIMAL(18,2) = 0; RegistrationFee DECIMAL(18,2) = 0; GeneralAssemblyLumpSum DECIMAL(18,2) = 0; GeneralAssemblyFee DECIMAL(18,2) = 0; Threshold SMALLINT = 0; MemberCount INT = 0; AdultMembers INT =0; ChildMembers INT = 0; OAdultMembers INT =0; OChildMembers INT = 0; Registration DECIMAL(18,2) = 0; GeneralAssembly DECIMAL(18,2) = 0; Contribution DECIMAL(18,2) = 0; PolicyValue DECIMAL(18,2) = 0; ExtraAdult INT = 0; ExtraChild INT = 0; AddonAdult DECIMAL(18,2) = 0; AddonChild DECIMAL(18,2) = 0; DiscountPeriodR INT = 0; DiscountPercentR DECIMAL(18,2) =0; DiscountPeriodN INT = 0; DiscountPercentN DECIMAL(18,2) =0; ValidityTo DATE = NULL; LegacyId INT = NULL; BEGIN /* ********ERROR CODE*********** -1 : Policy does not exists at the time of enrolment -2 : Policy was deleted at the time of enrolment */ ErrorCode = 0; IF EnrollDate IS NULL THEN EnrollDate = NOW(); END IF; --This means you are calculating existing policy IF PolicyId > 0 THEN SELECT "FamilyId", "ProdId", "PolicyStage", "EnrollDate", "ExpiryDate" INTO FamilyId, ProdId, PolicyStage, EnrollDate, ExpiryDate FROM "tblPolicy" WHERE "PolicyID" = PolicyId LIMIT 1; END IF; /*--Get all the required fiedls from product (Valide product at the enrollment time)--*/ SELECT "LumpSum", "PremiumAdult", "PremiumChild", "RegistrationLumpSum", "RegistrationFee", "GeneralAssemblyLumpSum", "GeneralAssemblyFee", "Threshold", "MemberCount", "ValidityTo", "LegacyID", "RenewalDiscountPeriod", "RenewalDiscountPerc", "EnrolmentDiscountPeriod", "EnrolmentDiscountPerc" INTO LumpSum, PremiumAdult, PremiumChild, RegistrationLumpSum, RegistrationFee, GeneralAssemblyLumpSum, GeneralAssemblyFee, Threshold, MemberCount, ValidityTo, LegacyId, DiscountPeriodR, DiscountPercentR, DiscountPeriodN, DiscountPercentN FROM "tblProduct" WHERE ("ProdID" = ProdId OR "LegacyID" = ProdId) AND DATE("ValidityFrom") <= EnrollDate ORDER BY "ValidityFrom" Desc LIMIT 1; IF NOT FOUND THEN --No policy found ErrorCode = -1; RETURN ErrorCode; END IF; IF NOT ValidityTo IS NULL AND LegacyId IS NULL THEN --Policy is deleted by the time of enrollment ErrorCode = -2; RETURN ErrorCode; END IF; /* ISNULL = COALESCE had to be moved outside the SELECT statement */ LumpSum = COALESCE(LumpSum,0); PremiumAdult = COALESCE(PremiumAdult,0); PremiumChild = COALESCE(PremiumChild,0); RegistrationLumpSum = COALESCE(RegistrationLumpSum,0); RegistrationFee = COALESCE(RegistrationFee,0); GeneralAssemblyLumpSum = COALESCE(GeneralAssemblyLumpSum,0); GeneralAssemblyFee = COALESCE(GeneralAssemblyFee,0); Threshold = COALESCE(Threshold,0); MemberCount = COALESCE(MemberCount,0); DiscountPeriodR = COALESCE(DiscountPeriodR,0); DiscountPercentR = COALESCE(DiscountPercentR,0); DiscountPeriodN = COALESCE(DiscountPeriodN,0); DiscountPercentN = COALESCE(DiscountPercentN,0); /* Relationships to be excluded from the normal family Count 7: Others */ --Get only valid insurees according to the maximum members of the product from the family CREATE TEMP TABLE tempTblInsuree AS SELECT * FROM "tblInsuree" WHERE "FamilyID" = FamilyId AND "ValidityTo" IS NULL; CREATE TEMP TABLE TempIns AS SELECT ROW_NUMBER() OVER(ORDER BY "ValidityFrom") Number, * FROM tempTblInsuree; DELETE FROM tempTblInsuree USING tempTblInsuree I INNER JOIN TempIns T ON I."InsureeID" = T."InsureeID" WHERE Number > MemberCount; --Get the number of adults, Children, OtherAdult and Other Children from the family AdultMembers = (SELECT COUNT("InsureeID") FROM tempTblInsuree WHERE DATEDIFF_YEAR("DOB",NOW()) >= 18 AND COALESCE("Relationship",0) <> 7 AND "ValidityTo" IS NULL AND "FamilyID" = FamilyId); ChildMembers = (SELECT COUNT("InsureeID") FROM tempTblInsuree WHERE DATEDIFF_YEAR("DOB",NOW()) < 18 AND COALESCE("Relationship",0) <> 7 AND "ValidityTo" IS NULL AND "FamilyID" = FamilyId); OAdultMembers = (SELECT COUNT("InsureeID") FROM tempTblInsuree WHERE DATEDIFF_YEAR("DOB",NOW()) >= 18 AND COALESCE("Relationship",0) = 7 AND "ValidityTo" IS NULL AND "FamilyID" = FamilyId); OChildMembers = (SELECT COUNT("InsureeID") FROM tempTblInsuree WHERE DATEDIFF_YEAR("DOB",NOW()) < 18 AND COALESCE("Relationship",0) = 7 AND "ValidityTo" IS NULL AND "FamilyID" = FamilyId); --Get extra members in family IF Threshold > 0 AND AdultMembers > Threshold THEN ExtraAdult = AdultMembers - Threshold; END IF; IF Threshold > 0 AND ChildMembers > (Threshold - AdultMembers + ExtraAdult) THEN ExtraChild = ChildMembers - ((Threshold - AdultMembers + ExtraAdult)); END IF; --Get the Contribution IF LumpSum > 0 THEN Contribution = LumpSum; ELSE Contribution = (AdultMembers * PremiumAdult) + (ChildMembers * PremiumChild); END IF; --Get the Assembly IF GeneralAssemblyLumpSum > 0 THEN GeneralAssembly = GeneralAssemblyLumpSum; ELSE GeneralAssembly = (AdultMembers + ChildMembers + OAdultMembers + OChildMembers) * GeneralAssemblyFee; END IF; --Get the Registration IF PolicyStage = N'N' THEN --Don't calculate if it's renewal IF RegistrationLumpSum > 0 THEN Registration = RegistrationLumpSum; ELSE Registration = (AdultMembers + ChildMembers + OAdultMembers + OChildMembers) * RegistrationFee; END IF; END IF; /* Any member above the maximum member count or with excluded relationship calculate the extra addon amount */ AddonAdult = (ExtraAdult + OAdultMembers) * PremiumAdult; AddonChild = (ExtraChild + OChildMembers) * PremiumChild; Contribution = Contribution + AddonAdult + AddonChild; --Line below was a mistake, All adults and children are already included in GeneralAssembly and Registration --SET @GeneralAssembly += (@OAdultMembers + @OChildMembers + @ExtraAdult + @ExtraChild) * @GeneralAssemblyFee; --IF @PolicyStage = N'N' -- SET @Registration += (@OAdultMembers + @OChildMembers + @ExtraAdult + @ExtraChild) * @RegistrationFee; PolicyValue = Contribution + GeneralAssembly + Registration; --The total policy value is calculated, So if the enroldate is earlier than the discount period then apply discount --CREATE TEMP TABLE tblPeriod AS SELECT "StartDate", "ExpiryDate", "HasCycle" --FROM uspGetPolicyPeriod(ProdId, EnrollDate, HasCycle, PolicyStage); CREATE TEMP TABLE tblPeriod AS SELECT * FROM "uspGetPolicyPeriod"(ProdId, EnrollDate, HasCycle, PolicyStage); StartDate = (SELECT "StartDate" FROM tblPeriod); IF PolicyStage = N'N' THEN MinDiscountDateN = DATEADD_MONTH(-(DiscountPeriodN),StartDate); IF EnrollDate <= MinDiscountDateN AND HasCycle = 1 THEN PolicyValue = PolicyValue - (PolicyValue * 0.01 * DiscountPercentN); END IF; ELSIF PolicyStage = N'R' THEN IF PreviousPolicyId > 0 THEN SELECT "ExpiryDate" INTO PreviousExpiryDate FROM "tblPolicy" WHERE "ValidityTo" IS NULL AND "tblPolicy"."PolicyID" = PreviousPolicyId; PreviousExpiryDate = DATEADD_DAY(1, PreviousExpiryDate); ELSE PreviousExpiryDate = StartDate; END IF; MinDiscountDateR = DATEADD_MONTH(-(DiscountPeriodR),PreviousExpiryDate); IF EnrollDate <= MinDiscountDateR THEN PolicyValue = PolicyValue - (PolicyValue * 0.01 * DiscountPercentR); END IF; END IF; DROP TABLE tempTblInsuree; DROP TABLE TempIns; DROP TABLE tblPeriod; RETURN PolicyValue; END $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION public."uspSSRSPolicyStatus"( rangefrom timestamp without time zone, rangeto timestamp without time zone, "OfficerID" integer DEFAULT 0, "RegionID" integer DEFAULT 0, "DistrictID" integer DEFAULT 0, villageid integer DEFAULT 0, wardid integer DEFAULT 0, policystatus integer DEFAULT 0) RETURNS TABLE("PolicyID" integer, "FamilyID" integer, "RenewalDate" date, policyvalue numeric, "InsureeID" integer, "ProductID" integer, productcode character varying, productname character varying, "ProductFromDate" date, "ProductToDate" date, "DistrictName" character varying, "VillageName" character varying, "WardName" character varying, "CHFID" character varying, "InsLastName" character varying, "InsOtherNames" character varying, "InsDOB" date, "ConvProdID" integer, "OffID" integer, "OffCode" character varying, "OffLastName" character varying, "OffOtherNames" character varying, "OffPhone" character varying, "OffSubstID" integer, "OffWorkTo" date) AS $$ -- I got fed up with getting errors because sometimes variable names are the same as column names of the table we're working on. This setting makes it so whenever nothing is specified postgres assumes we're using the variable (and not the column of a table). #variable_conflict use_variable /* There is no equivalent to "SET NOCOUNT ON" in PostgreSQL, but Stack Overflow claims it's not needed? -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; */ DECLARE --items record; "RenewalID" int; "PolicyID" int; "FamilyID" int; "RenewalDate" date; "InsureeID" int; "ProductID" int; ProductCode varchar(8); ProductName varchar(100); "ProductFromDate" date; "ProductToDate" date; "DistrictName" varchar(50); "VillageName" varchar(50); "WardName" varchar(50); "CHFID" varchar(12); "InsLastName" varchar(100); "InsOtherNames" varchar(100); "InsDOB" date; "ConvProdID" int; "OffCode" varchar(15); "OffLastName" varchar(50); "OffOtherNames" varchar(50); "OffPhone" varchar(50); "OffSubstID" int; "OffWorkTo" date; "OffID" INT; SMSStatus smallint; iCount int; tempRow RECORD; PolicyValue DECIMAL(18,4) = 0; BEGIN CREATE TEMP TABLE tblResult( "PolicyID" INT, "FamilyID" INT, "RenewalDate" DATE, "PolicyValue" NUMERIC(18,4), "InsureeID" INT, "ProductID" INT, "ProductCode" VARCHAR(8), "ProductName" VARCHAR(100), "DateFrom" DATE, "DateTo" DATE, "DistrictName" VARCHAR(50), "VillageName" VARCHAR(50), "WardName" VARCHAR(50), "CHFID" VARCHAR(12), "LastName" VARCHAR(100), "OtherNames" VARCHAR(100), "DOB" DATE, "ConversionProdId" INT, "OfficerID" INT, "Code" VARCHAR(15), "OffLastName" VARCHAR(50), "OffOtherNames" VARCHAR(50), "Phone" VARCHAR(50), "OfficerIdSubst" INT, "WorksTo" DATE); << loop1 >> FOR tempRow IN SELECT PL."PolicyID", PL."FamilyID", DATEADD_DAY(1, PL."ExpiryDate") AS "RenewalDate", F."InsureeID", Prod."ProdID", Prod."ProductCode", Prod."ProductName", Prod."DateFrom", Prod."DateTo", D."DistrictName", V."VillageName", W."WardName", I."CHFID", I."LastName", I."OtherNames", I."DOB", Prod."ConversionProdID", O."OfficerID", O."Code", O."LastName" "OffLastName", O."OtherNames" "OffOtherNames", O."Phone", O."OfficerIDSubst", O."WorksTo", PL."PolicyValue" FROM "tblPolicy" PL INNER JOIN "tblFamilies" F ON PL."FamilyID" = F."FamilyID" INNER JOIN "tblInsuree" I ON F."InsureeID" = I."InsureeID" INNER JOIN "tblProduct" Prod ON PL."ProdID" = Prod."ProdID" INNER JOIN "tblVillages" V ON V."VillageId" = F."LocationId" INNER JOIN "tblWards" W ON W."WardId" = V."WardId" INNER JOIN "tblDistricts" D ON D."DistrictId" = W."DistrictId" INNER JOIN "tblRegions" R ON R."RegionId" = D."Region" INNER JOIN "tblOfficer" O ON PL."OfficerID" = O."OfficerID" AND PL."ExpiryDate" BETWEEN RangeFrom AND RangeTo WHERE PL."ValidityTo" IS NULL AND F."ValidityTo" IS NULL AND R."ValidityTo" IS NULL AND D."ValidityTo" IS NULL AND V."ValidityTo" IS NULL AND W."ValidityTo" IS NULL AND I."ValidityTo" IS NULL AND O."ValidityTo" IS NULL AND PL."ExpiryDate" BETWEEN RangeFrom AND RangeTo --AND (O."OfficerId" = @"OfficerId" OR @"OfficerId" = 0) AND (R."RegionId" = "RegionID" OR "RegionID" = 0) AND (D."DistrictId" = "DistrictID" OR "DistrictID" = 0) AND (V."VillageId" = "VillageId" OR "VillageId" = 0) AND (W."WardId" = WardID OR WardID = 0) AND (PL."PolicyStatus" = PolicyStatus OR PolicyStatus = 0) AND (PL."PolicyStatus" > 1) --Do not renew Idle policies ORDER BY "RenewalDate" DESC --Added by Rogers LOOP SELECT tempRow."PolicyID", tempRow."FamilyID", tempRow."RenewalDate", tempRow."InsureeID", tempRow."ProdID", tempRow."ProductCode", tempRow."ProductName", tempRow."DateFrom", tempRow."DateTo", tempRow."DistrictName", tempRow."VillageName", tempRow."WardName", tempRow."CHFID", tempRow."LastName", tempRow."OtherNames", tempRow."DOB", tempRow."ConversionProdID", tempRow."OfficerID", tempRow."Code", tempRow."OffLastName", tempRow."OffOtherNames", tempRow."Phone", tempRow."OfficerIDSubst", tempRow."WorksTo", tempRow."PolicyValue" INTO "PolicyID","FamilyID","RenewalDate","InsureeID","ProductID", ProductCode,ProductName,"ProductFromDate","ProductToDate","DistrictName","VillageName","WardName","CHFID","InsLastName","InsOtherNames","InsDOB","ConvProdID","OffID", "OffCode","OffLastName","OffOtherNames","OffPhone","OffSubstID","OffWorkTo",PolicyValue; --GET ProductCode or the substitution IF COALESCE("ConvProdID",0) > 0 THEN iCount = 0; WHILE "ConvProdID" <> 0 AND iCount < 20 LOOP --this to prevent a recursive loop by wrong datra entries --get new product info "ProductID" = "ConvProdID"; SELECT "ConversionProdID" INTO "ConvProdID" FROM "tblProduct" WHERE "ProdID" = "ProductID"; IF COALESCE("ConvProdID",0) = 0 THEN SELECT "ProductCode", "ProductName", "DateFrom", "DateTo" INTO ProductCode, ProductName, "ProductFromDate", "ProductToDate" FROM "tblProduct" WHERE "ProdID" = "ProductID"; END IF; iCount = iCount + 1; END LOOP; END IF; IF COALESCE("OffID" ,0) > 0 THEN --GET Officer"Code" or the substitution IF COALESCE("OffSubstID",0) > 0 THEN iCount = 0; WHILE "OffSubstID" <> 0 AND iCount < 20 AND "OffWorkTo" < @"RenewalDate" LOOP --this to prevent a recursive loop by wrong datra entries --get new product info "OffID" = "OffSubstID"; SELECT "OfficerIDSubst" INTO "OffSubstID" FROM "tblOfficer" WHERE "OfficerID" = "OffID"; IF COALESCE("OffSubstID",0) = 0 THEN SELECT "Code", "LastName", "OtherNames", "Phone", "WorksTo" INTO "OffCode", "OffLastName", "OffOtherNames", "OffPhone", "OffWorkTo" FROM "tblOfficer" WHERE "OfficerID" = "OffID"; END IF; iCount = iCount + 1; END LOOP; END IF; END IF; --"Code" added by Hiren to check if the policy has another following policy CONTINUE loop1 WHEN EXISTS (SELECT * FROM "tblPolicy" WHERE "tblPolicy"."FamilyID" = "FamilyID" AND ("tblPolicy"."ProdID" = "ProductID" OR "tblPolicy"."ProdID" = "ConvProdID") AND "tblPolicy"."StartDate" >= "RenewalDate" AND "tblPolicy"."ValidityTo" IS NULL LIMIT 1 ); --Added by Rogers to check if the policy is alread in a family CONTINUE loop1 WHEN EXISTS(SELECT FROM tblResult WHERE tblResult."FamilyID" = "FamilyID" AND tblResult."ProductID" = "ProductID" OR tblResult."ProductID" = "ConvProdID" LIMIT 1); PolicyValue = "uspPolicyValue"("FamilyID", "ProductID", 0, CAST('R' AS CHAR(1)), "RenewalDate", "PolicyID", 0); INSERT INTO tblResult ("PolicyID", "FamilyID", "RenewalDate", "PolicyValue", "InsureeID", "ProductID", "ProductCode", "ProductName", "DateFrom", "DateTo", "DistrictName", "VillageName", "WardName", "CHFID", "LastName", "OtherNames", "DOB", "ConversionProdId", "OfficerID", "Code", "OffLastName", "OffOtherNames", "Phone", "OfficerIdSubst", "WorksTo") VALUES("PolicyID", "FamilyID", "RenewalDate", PolicyValue, "InsureeID", "ProductID", ProductCode, ProductName, "ProductFromDate", "ProductToDate", "DistrictName", "VillageName", "WardName", "CHFID", "InsLastName", "InsOtherNames", "InsDOB", "ConvProdID", "OffID", "OffCode", "OffLastName", "OffOtherNames", "OffPhone", "OffSubstID", "OffWorkTo"); /* These next few lines are a hack. Whenever I just return this query as a whole after the for loop, I just get a table where every row is replaced with the last row of the table. Copying every row individually gives the correct result but I have to empty the table every iteration. At least it works. */ RETURN QUERY SELECT "PolicyID", "FamilyID", "RenewalDate", PolicyValue, "InsureeID", "ProductID", ProductCode, ProductName, "ProductFromDate", "ProductToDate", "DistrictName", "VillageName", "WardName", "CHFID", "InsLastName", "InsOtherNames", "InsDOB", "ConvProdID", "OffID", "OffCode", "OffLastName", "OffOtherNames", "OffPhone", "OffSubstID", "OffWorkTo" FROM tblResult WHERE ("OfficerID" = "OffID" OR "OfficerID" = 0); TRUNCATE tblresult; END LOOP; /* This is the query that doesn't work. I'll keep it here, just in case You notice what I'm doing wrong. */ /*RETURN QUERY SELECT "PolicyID", "FamilyID", "RenewalDate", PolicyValue, "InsureeID", "ProductID", ProductCode, ProductName, "ProductFromDate", "ProductToDate", "DistrictName", "VillageName", "WardName", "CHFID", "InsLastName", "InsOtherNames", "InsDOB", "ConvProdID", "OffID", "OffCode", "OffLastName", "OffOtherNames", "OffPhone", "OffSubstID", "OffWorkTo" FROM tblResult WHERE ("OfficerID" = "OffID" OR "OfficerID" = 0);*/ DROP TABLE tblResult; RETURN; END $$ LANGUAGE plpgsql;