У меня есть такая рабочая функция:
DROP FUNCTION org_sbase2_func.mis_sjekk_lovlige_lmkolonner(integer);
CREATE OR REPLACE FUNCTION org_sbase2_func.mis_sjekk_lovlige_lmkolonner(livsm integer)
RETURNS void AS
$BODY$
DECLARE
feil text;
lmrad RECORD;
colname text;
BEGIN
-- Test if all mandatory attributes exists
-- For all rows
FOR lmrad IN select * from org_sbase2_tmp.ban492lmpol_5_0_kurs where livsmiljo = livsm LOOP
--For all columns in tmp
FOR colname IN (select kol_navn from org_sbase2_func.mis_lovlige_kolonner_alle_lm UNION select kol_navn from org_sbase2_func.mis_lovlige_kolonner_lmX where livsmiljo = livsm) LOOP
--If column exists in tmp and is not null, but the column is not mandatory: ERROR - value must be null
IF colname IN (SELECT column_name from information_schema.columns WHERE table_schema LIKE 'org_sbase2_tmp' AND table_name LIKE 'ban492lmpol_5_0_kurs')
--and colname.value is not null)
AND colname in (select kol_navn from org_sbase2_func.mis_lovlige_kolonner_alle_lm UNION select kol_navn from org_sbase2_func.mis_lovlige_kolonner_lmX where livsmiljo != livsm) THEN
feil = 'Livsmiljø ' || lmrad.livsmiljo || ' and column ' || colname ||' must be empty, but has value.';
PERFORM org_sbase2_func.mis_registrer_feil_pa_objekt('lmpol', lmrad.ogc_fid,'ban492',feil,'mis_sjekk_lovlige_lmkolonner');
END IF;
END LOOP;
END LOOP;
RAISE NOTICE 'Ferdig med mis_sjekk_lovlige_lmkolonner';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Я запускаю функцию с select org_sbase2_func.mis_sjekk_lovlige_lmkolonner(2);
Она работает.Однако мне нужно изменить его, так как мне нужно включить что-то вроде and lmrad.||colname|| is not null
.Я пытаюсь с EXECUTE.Для начала (просто для проверки EXECUTE) я использую тот же код, что и выше (перед тем, как включить проверку значения равным нулю для определенного столбца в строке), просто чтобы попытаться получить все «правильные»:
DROP FUNCTION org_sbase2_func.mis_sjekk_lovlige_lmkolonner(integer);
CREATE OR REPLACE FUNCTION org_sbase2_func.mis_sjekk_lovlige_lmkolonner(livsm integer)
RETURNS void AS
$BODY$
DECLARE
feil text;
lmrad RECORD;
colname text;
BEGIN
-- Test if all mandatory attributes exists
-- For all rows
FOR lmrad IN select * from org_sbase2_tmp.ban492lmpol_5_0_kurs where livsmiljo = livsm LOOP
--For all columns in tmp
FOR colname IN (select kol_navn from org_sbase2_func.mis_lovlige_kolonner_alle_lm UNION select kol_navn from org_sbase2_func.mis_lovlige_kolonner_lmX where livsmiljo = livsm) LOOP
--If column exists in tmp and is not null, but the column is not mandator: ERROR - value must be null
EXECUTE 'IF '||colname||' IN (SELECT column_name from information_schema.columns WHERE table_schema LIKE ''org_sbase2_tmp'' AND table_name LIKE ''ban492lmpol_5_0_kurs'') --and lmrad.'||colname||' is not null
AND '||colname||' in (select kol_navn from org_sbase2_func.mis_lovlige_kolonner_alle_lm UNION select kol_navn from org_sbase2_func.mis_lovlige_kolonner_lmX where livsmiljo != livsm) THEN
feil = ''Livsmiljø '' || lmrad.livsmiljo || '' og kolonne '' || colname ||'' skulle vært tom, men har verdi'';
PERFORM org_sbase2_func.mis_registrer_feil_pa_objekt(''lmpol'', lmrad.ogc_fid,''ban492'',feil,''mis_sjekk_lovlige_lmkolonner'');
END IF;';
END LOOP;
END LOOP;
RAISE NOTICE 'Ferdig med mis_sjekk_lovlige_lmkolonner';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Теперь при запуске select org_sbase2_func.mis_sjekk_lovlige_lmkolonner(2);
выдается ошибка:
ERROR: syntax error at or near "IF"
LINE 1: IF LDVLAUS302 IN (SELECT column_name from information_schema...
^
QUERY: IF LDVLAUS302 IN (SELECT column_name from information_schema.columns WHERE table_schema LIKE 'org_sbase2_tmp' AND table_name LIKE 'ban492lmpol_5_0_kurs') --and lmrad.LDVLAUS302 is not null
AND LDVLAUS302 in (select kol_navn from org_sbase2_func.mis_lovlige_kolonner_alle_lm UNION select kol_navn from org_sbase2_func.mis_lovlige_kolonner_lmX where livsmiljo != livsm) THEN
feil = 'Livsmiljø ' || lmrad.livsmiljo || ' og kolonne ' || colname ||' skulle vært tom, men har verdi';
PERFORM org_sbase2_func.mis_registrer_feil_pa_objekt('lmpol', lmrad.ogc_fid,'ban492',feil,'mis_sjekk_lovlige_lmkolonner');
END IF;
CONTEXT: PL/pgSQL function org_sbase2_func.mis_sjekk_lovlige_lmkolonner(integer) line 15 at EXECUTE
Как выполнить условие IF - если это возможно?