Pl\pgSQL questions

centur
Дата: 15.03.2004 23:12:31
Есть парочка =)
1. Как можно пройтись по RECORD в цикле
for record in execute query loop

end loop;

если query у нас динамический формируется на основе пришедих переменных в функцию и я не могу точно знать какие имена у полей record'а . т.е. Как не зная имен полей использовать значения в запросах ? ну даже хотя бы и зная имена, в переменной хранятся
ну что то типа
''select * from table where a<>'' record. || tmp где tmp содержит имя поля в Record
т.е. tmp= a_kod и нужно чтобы запрос выглядел примерно так

select * from table where a<> 25
(а record.a_kod=25 )

2. По поводу Null значений - кто как осуществляет проверку Null. а то выяснилось например что если в триггере или в функции будет запись вида
query:= ''select 4to to tam from || table_name_var || ''where blablabla''
И при каких либо условиях наступает что table_name_var - null , то query автоматически становится Null
такая же байда и с if

конструкция
IF var1 != var2 then
else
end if;
при ситуации что одна переменная Null - Всегда вываливается в else (т.е. проверка - false).
очень неудобно в триггерах проверять такую ситуацию - изменилось или нет значение поля
IF OLD.a != NEW.a then
else
end if

при OLD.a - null получаем всегда false, хотя зачение изменилось и new.a уже не null. приходится писать
IF OLD.a != NEW.a OR (OLD.a is null and new.a is not null) then (или обратную проверку OLD.a is not null and new.a is null . А для обоих случаев вообще некрасиво все выглядит )

кто как это обходит - неприятная "непроработка" (имхо, все же определенная переменная a<>b, при b=null должна возвращать true) в языке.
Vladimir K.
Дата: 16.03.2004 10:14:54
Читайте доки - там все есть!
и про: "is null ..." "not is null ..."
и про SQL: "select $1 as a, $2 as b ..."
centur
Дата: 18.03.2004 22:15:23
по селекту у меня как раз не SQL а pgSQL ...
про null not null читал, а также практически всю доку перелопатил - внятного решения проблемы - не нашел. может, если такой гуру - ткнете конкретно в раздел\страницу ?
Shweik
Дата: 18.03.2004 23:25:50
Между прочим ни слова в исхоном посте ни о версии postgres ни о структуре таблицы.
Пока что в 7.4 я не повторить ситуацию с конструкцией
IF OLD.a != NEW.a then
else
end if
полчуил ожидаемый результат - управление передатеся как положено.
Может я что-то не так понял -завтра еще раз попробую перепроверить 8)
centur
Дата: 19.03.2004 09:46:19
7.4.1 версия.

Хмм... у меня стабильно если в триггере приходит null то при таком сравнении всегда false.
Структура таблицы - не важна, на всех такое дело, независимо от структуры.


попробуй на переменных провести опыт - по умолчанию declared переменная - null вроде. вот и функция примерно такого вида



func
'
declare
a int
b int

begin
b:=100; (a - null т.к. не определяем)
if a!=b then
raise notice '
' if'' ;
else
raise notice '
' else'' ;
end if
end;'



а по первому вопросу есть идеи какие-нить ? как это сваять ???
для пояснения - нужна например функция которая по переданным параметрам (строка полей, имя поля, таблица)
формирует упорядоченный список distinct "строка полей" from "таблица"
потом пронумеровывает эти строки спец образом (любым, уже реализовано)

и делает в эту же таблицу апдейт "имя поля" = номер
это примерно вот так должно в результате выглядеть

select distinct f1,f2,key_field from a
F1----F2----key_field
a ---- a---- 1
a ---- b---- 2
b ---- a---- 3

при этом строк типа a-a-1 (и др.) может быть много...

хочется чтобы такая функция работала на любую переданную таблицу.
пришедшую строку полей разбираем по "," и сможем загнать имена полей в переменные, но как потом при выборке для апдейта сформировать условия where