Date: 07.03.2024 19:06:56
SQL-фaйл PostgesSQL-БД: roamer55_ru_pg_funcs
==========================
--
-- PostgreSQL database dump
--
-- Dumped from database version 9.5.6
-- Dumped by pg_dump version 9.5.6
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
--
-- Name: roamer55_ru_pg_funcs; Type: COMMENT; Schema: -; Owner: postgres
--
COMMENT ON DATABASE roamer55_ru_pg_funcs IS 'PostgreSQL. Полезные функции.
Для сайта roamer55.ru.
Начато: 2021.12.07';
--
-- Name: tmp; Type: SCHEMA; Schema: -; Owner: postgres
--
CREATE SCHEMA tmp;
ALTER SCHEMA tmp OWNER TO postgres;
--
-- Name: SCHEMA tmp; Type: COMMENT; Schema: -; Owner: postgres
--
COMMENT ON SCHEMA tmp IS 'Временная...';
--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
--
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
--
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
SET search_path = public, pg_catalog;
--
-- Name: t_float; Type: DOMAIN; Schema: public; Owner: postgres
--
CREATE DOMAIN t_float AS double precision;
ALTER DOMAIN t_float OWNER TO postgres;
--
-- Name: DOMAIN t_float; Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON DOMAIN t_float IS 'Вещественное число (double precision). Используется в интерпретаторе скриптов';
--
-- Name: bigint_as_str(bigint); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION bigint_as_str(v bigint) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
BEGIN
-- Конвертировать bigint в строку
-- select * from bigint_as_str(12);
-- select * from bigint_as_str(-999999999);
res = '0';
v = bigint_is_null(v);
res = cast(v as character varying);
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.bigint_as_str(v bigint) OWNER TO postgres;
--
-- Name: FUNCTION bigint_as_str(v bigint); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION bigint_as_str(v bigint) IS 'Конвертировать bigint в строку';
--
-- Name: bigint_is_null(bigint, bigint); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION bigint_is_null(sx bigint, sdef bigint DEFAULT 0) RETURNS bigint
LANGUAGE plpgsql
AS $$
BEGIN
-- Контроль значения типа bigint (проверка на NULL и замена NULL на значение по умочанию)
/*
select * from bigint_is_null(null, -5);
select * from bigint_is_null(null);
select * from bigint_is_null(0, -5);
*/
IF (sx is NULL) THEN
IF (sdef is NULL) THEN sdef=0; END IF;
RETURN sdef;
ELSE
RETURN sx;
END IF;
END;
$$;
ALTER FUNCTION public.bigint_is_null(sx bigint, sdef bigint) OWNER TO postgres;
--
-- Name: FUNCTION bigint_is_null(sx bigint, sdef bigint); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION bigint_is_null(sx bigint, sdef bigint) IS 'Контроль значения типа bigint (проверка на NULL и замена NULL на значение по умочанию)';
--
-- Name: bool_as_str(boolean, integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION bool_as_str(v boolean, nr integer DEFAULT 0) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE res character varying;
BEGIN
/*
Конвертировать логическое значение в строку
select * from bool_as_str(true);
select * from bool_as_str(true, 1);
select * from bool_as_str(true, 2);
select * from bool_as_str(true, 3);
select * from bool_as_str(true, 4);
*/
res = '';
v = bool_is_null(v);
nr = int_is_null(nr);
IF (nr<0) THEN nr=0; END IF;
IF (nr>4) THEN nr=4; END IF;
IF (v = true) THEN
IF (nr=0) THEN res = 'True' ; END IF;
IF (nr=1) THEN res = 'T' ; END IF;
IF (nr=2) THEN res = '1' ; END IF;
IF (nr=3) THEN res = 'Истина' ; END IF;
IF (nr=4) THEN res = 'Да' ; END IF;
ELSE
IF (nr=0) THEN res = 'False' ; END IF;
IF (nr=1) THEN res = 'F' ; END IF;
IF (nr=2) THEN res = '0' ; END IF;
IF (nr=3) THEN res = 'Фальш' ; END IF;
IF (nr=4) THEN res = 'Нет' ; END IF;
END IF;
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.bool_as_str(v boolean, nr integer) OWNER TO postgres;
--
-- Name: FUNCTION bool_as_str(v boolean, nr integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION bool_as_str(v boolean, nr integer) IS 'Конвертировать логическое значение в строку';
--
-- Name: bool_is_null(boolean, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION bool_is_null(sx boolean, sdef boolean DEFAULT false) RETURNS boolean
LANGUAGE plpgsql
AS $$
BEGIN
-- Контроль значения типа boolean (проверка на NULL и замена NULL на значение по умочанию)
/*
select * from bool_is_null(null);
select * from bool_is_null(null, true);
select * from bool_is_null(null, null);
*/
IF (sx is NULL) THEN
IF (sdef is NULL) THEN sdef=false; END IF;
RETURN sdef;
ELSE
RETURN sx;
END IF;
END;
$$;
ALTER FUNCTION public.bool_is_null(sx boolean, sdef boolean) OWNER TO postgres;
--
-- Name: FUNCTION bool_is_null(sx boolean, sdef boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION bool_is_null(sx boolean, sdef boolean) IS 'Контроль значения типа boolean (проверка на NULL и замена NULL на значение по умочанию)';
--
-- Name: exec_select(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_select(query text) RETURNS SETOF record
LANGUAGE plpgsql
AS $$
begin
/*
Выполнить запрос (SELECT ) заданный во входном параметре типа text.
Пример:
select * from exec_select('code, name_max::t_namemax from public.props_types where code>0') as ds(code integer, name_max t_namemax);
select * from exec_select('code::integer, name_max::t_namemax from public.props_types where code>0') as ds(code integer, name_max t_namemax);
select * from exec_select('code, name_max::t_namemax from public.props_types where upper(mnemocode)=' || upper(chr(39) || 'time' || chr(39)) ) as ds(code integer, name_max t_namemax);
select * from exec_select('code, name_max::t_namemax from public.props_types where upper(mnemocode)=' || upper(q39_add_lr('time'))) as ds(code integer, name_max t_namemax);
select * from exec_select('code, name_max::text from public.props_types where code>0') as ds(code integer, name_max text);
*/
return query execute 'select ' || query;
end;
$$;
ALTER FUNCTION public.exec_select(query text) OWNER TO postgres;
--
-- Name: FUNCTION exec_select(query text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_select(query text) IS 'Выполнить запрос (SELECT ) заданный во входном параметре типа text';
--
-- Name: exec_sql_select(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_sql_select(query text) RETURNS SETOF record
LANGUAGE plpgsql
AS $$
begin
/*
Пример:
Выполнить запрос SELECT заданный во входном параметре типа text
select * from exec_select('code, name_max::t_namemax from public.props_types where code>0') as ds(code integer, name_max t_namemax);
select * from exec_select('code::integer, name_max::t_namemax from public.props_types where code>0') as ds(code integer, name_max t_namemax);
select * from exec_select('code, name_max::t_namemax from public.props_types where upper(mnemocode)=' || upper(chr(39) || 'time' || chr(39)) ) as ds(code integer, name_max t_namemax);
select * from exec_select('code, name_max::t_namemax from public.props_types where upper(mnemocode)=' || upper(q39_add_lr('time'))) as ds(code integer, name_max t_namemax);
select * from exec_select('code, name_max::text from public.props_types where code>0') as ds(code integer, name_max text);
select * from exec_select('code, name_max::text from public.props_types where mnemocode=' || q39_lr(null)) as ds(code integer, name_max text);
select * from exec_select('code, name_max::text from public.props_types where code > ' || '0') as ds(code integer, name_max text);
*/
return query execute query;
end;
$$;
ALTER FUNCTION public.exec_sql_select(query text) OWNER TO postgres;
--
-- Name: FUNCTION exec_sql_select(query text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_sql_select(query text) IS 'Выполнить запрос SELECT заданный во входном параметре типа text';
--
-- Name: exec_sql_text(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_sql_text(sql text) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE res boolean;
begin
/*
Выполнить команду execute.
sql - текст соответствующего SQL-запроса
*/
res = false;
sql = str_is_null(sql);
IF (sql <> '') THEN
execute sql;
res = true;
END IF;
RETURN res;
end;
$$;
ALTER FUNCTION public.exec_sql_text(sql text) OWNER TO postgres;
--
-- Name: FUNCTION exec_sql_text(sql text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_sql_text(sql text) IS 'Выполнить команду execute';
--
-- Name: exec_to_bigint(text, bigint); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_to_bigint(sql text, sval bigint DEFAULT 0) RETURNS bigint
LANGUAGE plpgsql
AS $$
DECLARE
res bigint;
sres text;
begin
/*
Выполнить команду execute с возвратом значения типа bigint
*/
sval = bigint_is_null(sval);
res = sval;
sql = str_is_null(sql);
IF (sql <> '') THEN
execute sql into sres;
sres = str_is_null(sres);
IF (its_bigint(sres) = true) THEN
res = str_as_bigint(sres, sval);
res = bigint_is_null(res);
END IF;
END IF;
RETURN res;
end;
$$;
ALTER FUNCTION public.exec_to_bigint(sql text, sval bigint) OWNER TO postgres;
--
-- Name: FUNCTION exec_to_bigint(sql text, sval bigint); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_to_bigint(sql text, sval bigint) IS 'Выполнить команду execute с возвратом значения типа bigint';
--
-- Name: exec_to_bool(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_to_bool(sql text) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sres text;
begin
/*
Выполнить команду execute с возвратом значения типа boolean
*/
res = false;
sql = str_is_null(sql);
IF (sql <> '') THEN
execute sql into sres;
sres = str_is_null(sres);
res = str_as_bool(sres);
res = bool_is_null(res);
END IF;
RETURN res;
end;
$$;
ALTER FUNCTION public.exec_to_bool(sql text) OWNER TO postgres;
--
-- Name: FUNCTION exec_to_bool(sql text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_to_bool(sql text) IS 'Выполнить команду execute с возвратом значения типа boolean';
--
-- Name: exec_to_double_precision(text, double precision); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_to_double_precision(sql text, sval double precision DEFAULT 0.0) RETURNS double precision
LANGUAGE plpgsql
AS $$
DECLARE
res double precision;
sres text;
begin
/*
Выполнить команду execute с возвратом значения типа exec_to_double_precision
*/
sval = float_is_null(sval);
res = sval;
sql = str_is_null(sql);
IF (sql <> '') THEN
execute sql into sres;
sres = str_is_null(sres);
IF (its_float(sres) = true) THEN
res = str_as_float(sres, sval);
res = float_is_null(res);
END IF;
END IF;
RETURN res;
end;
$$;
ALTER FUNCTION public.exec_to_double_precision(sql text, sval double precision) OWNER TO postgres;
--
-- Name: FUNCTION exec_to_double_precision(sql text, sval double precision); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_to_double_precision(sql text, sval double precision) IS 'Выполнить команду execute с возвратом значения типа exec_to_double_precision';
--
-- Name: exec_to_integer(text, integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_to_integer(sql text, sval integer DEFAULT 0) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
res integer;
sres text;
begin
/*
Выполнить команду execute с возвратом значения типа integer
*/
sval = int_is_null(sval);
res = sval;
sql = str_is_null(sql);
IF (sql <> '') THEN
execute sql into sres;
sres = str_is_null(sres);
IF (its_integer(sres) = true) THEN
res = str_as_int(sres, sval);
res = int_is_null(res);
END IF;
END IF;
RETURN res;
end;
$$;
ALTER FUNCTION public.exec_to_integer(sql text, sval integer) OWNER TO postgres;
--
-- Name: FUNCTION exec_to_integer(sql text, sval integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_to_integer(sql text, sval integer) IS 'Выполнить команду execute с возвратом значения типа integer';
--
-- Name: exec_to_str(text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_to_str(sql text, sval character varying DEFAULT ''::character varying) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE res character varying;
begin
/*
Выполнить команду execute с возвратом значения типа character varying
Пример:
select * from exec_to_str('select * from proptype_name_get(5);');
SELECT (select * from exec_to_str('select * from proptype_name_get(5); ')), (select * from exec_to_str('select * from proptype_name_get(1);'));
SELECT (select * from exec_to_str('select * from proptype_name_get(5); ')) || ' : ' || (select * from exec_to_str('select * from proptype_name_get(1);'));
*/
sval = str_is_null(sval);
res = sval;
sql = str_is_null(sql);
IF (sql <> '') THEN
execute sql into res;
res = str_is_null(res, sval);
END IF;
RETURN res;
end;
$$;
ALTER FUNCTION public.exec_to_str(sql text, sval character varying) OWNER TO postgres;
--
-- Name: FUNCTION exec_to_str(sql text, sval character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_to_str(sql text, sval character varying) IS 'Выполнить команду execute с возвратом значения типа character varying';
--
-- Name: exec_to_text(text, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION exec_to_text(sql text, sval text DEFAULT ''::text) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE res text;
begin
/*
Выполнить команду execute с возвратом значения типа text
Пример:
select * from exec_to_text('select * from proptype_name_get(5);');
SELECT (select * from exec_to_text('select * from proptype_name_get(5); ')), (select * from exec_to_text('select * from proptype_name_get(1);'));
SELECT (select * from exec_to_text('select * from proptype_name_get(5); ')) ||' : ' || (select * from exec_to_text('select * from proptype_name_get(1);'));
*/
sval = str_is_null(sval);
res = sval;
sql = str_is_null(sql);
IF (sql <> '') THEN
execute sql into res;
res = str_is_null(res, sval);
END IF;
RETURN res;
end;
$$;
ALTER FUNCTION public.exec_to_text(sql text, sval text) OWNER TO postgres;
--
-- Name: FUNCTION exec_to_text(sql text, sval text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION exec_to_text(sql text, sval text) IS 'Выполнить команду execute с возвратом значения типа text';
--
-- Name: float_as_str(double precision); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION float_as_str(v double precision) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
BEGIN
-- Конвертировать double precision в строку
-- select * from float_as_str(12.5);
-- select * from float_as_str(12);
-- select * from float_as_str(-99999.99999);
res = 0;
v = float_is_null(v);
res = cast(v as character varying);
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.float_as_str(v double precision) OWNER TO postgres;
--
-- Name: FUNCTION float_as_str(v double precision); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION float_as_str(v double precision) IS 'Конвертировать double precision в строку';
--
-- Name: float_is_null(double precision, double precision); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION float_is_null(sx double precision, sdef double precision DEFAULT 0.0) RETURNS double precision
LANGUAGE plpgsql
AS $$
BEGIN
-- Контроль значения типа double precision (проверка на NULL и замена NULL на значение по умочанию)
/*
select * from public.float_is_null(5, 20); -- 5
select * from public.float_is_null(null, 20); -- 20
select * from public.float_is_null(null, -20); -- -20
select * from public.float_is_null(null); -- 0
*/
IF (sx is NULL) THEN
IF (sdef is NULL) THEN sdef=0.0; END IF;
RETURN sdef;
ELSE
RETURN sx;
END IF;
END;
$$;
ALTER FUNCTION public.float_is_null(sx double precision, sdef double precision) OWNER TO postgres;
--
-- Name: FUNCTION float_is_null(sx double precision, sdef double precision); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION float_is_null(sx double precision, sdef double precision) IS 'Контроль значения типа double precision (проверка на NULL и замена NULL на значение по умочанию)';
--
-- Name: float_str_normal(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION float_str_normal(sx character varying, ch_point character varying DEFAULT '.'::character varying) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
k integer;
BEGIN
-- Нормализовать строку, как float
/*
Примеры:
select * from float_str_normal('12.5');
select * from float_str_normal('12,5');
select * from float_str_normal('12,5',',');
select * from float_str_normal('12');
select * from float_str_normal('12',',');
*/
res = str_is_null(sx);
ch_point = str_is_null(ch_point);
IF (ch_point = '') THEN ch_point = '.'; END IF;
IF (its_float(res, ch_point) = false) THEN res = '0'; END IF;
k = position(ch_point in res);
IF (k<=0) THEN res = res || ch_point || '0'; END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.float_str_normal(sx character varying, ch_point character varying) OWNER TO postgres;
--
-- Name: FUNCTION float_str_normal(sx character varying, ch_point character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION float_str_normal(sx character varying, ch_point character varying) IS 'Нормализовать строку, как float';
--
-- Name: fn_calc_as_float(text, t_float); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION fn_calc_as_float(sexpr text, val_def t_float DEFAULT 0) RETURNS t_float
LANGUAGE plpgsql
AS $$
DECLARE res t_float;
stext text;
begin
/*
Вычисление арифметического выражения заданного строкой символов
Пример:
select * from fn_calc_as_float('2 + 2 * 2'); -- 6
select * from fn_calc_as_float('(2 + 2) * 2'); -- 8
select * from fn_calc_as_float('(1*3.003+2+5.0/3)*4'); -- 26.6786666666667
select * from fn_calc_as_float('(a*3.003+2+5.0/3)*4'); -- ошибка (а - не определено)
*/
val_def = float_is_null(val_def);
res = val_def;
sexpr = str_is_null(sexpr);
IF (sexpr <> '') THEN
execute 'select 1.0*(' || sexpr || ');' into stext;
stext = str_is_null(stext, cast(val_def as character varying));
res = cast(stext as t_float);
END IF;
RETURN res;
end;
$$;
ALTER FUNCTION public.fn_calc_as_float(sexpr text, val_def t_float) OWNER TO postgres;
--
-- Name: FUNCTION fn_calc_as_float(sexpr text, val_def t_float); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION fn_calc_as_float(sexpr text, val_def t_float) IS 'Вычисление арифметического выражения заданного строкой символов';
--
-- Name: if_then(boolean, text, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION if_then(v boolean, syes text DEFAULT 'TRUE'::text, sno text DEFAULT 'FALSE'::text) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE res text;
BEGIN
-- Конвертация значений типа boolean в заданную строку символов
sno = str_is_null(sno);
IF (sno = '') THEN sno = 'FALSE'; END IF;
v = bool_is_null(v);
if (v = TRUE) THEN
syes = str_is_null(syes);
IF (syes = '') THEN syes = 'TRUE'; END IF;
res = syes;
ELSE
res = sno ;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.if_then(v boolean, syes text, sno text) OWNER TO postgres;
--
-- Name: FUNCTION if_then(v boolean, syes text, sno text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION if_then(v boolean, syes text, sno text) IS 'Конвертация значений типа boolean в заданную строку символов';
--
-- Name: int_as_str(integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION int_as_str(v integer) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
BEGIN
-- Конвертировать integer в строку
-- select * from int_as_str(12);
-- select * from int_as_str(-22759881);
res = '0';
v = int_is_null(v);
res = cast(v as character varying);
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.int_as_str(v integer) OWNER TO postgres;
--
-- Name: FUNCTION int_as_str(v integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION int_as_str(v integer) IS 'Конвертировать integer в строку';
--
-- Name: int_is_null(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION int_is_null(sx integer, sdef integer DEFAULT 0) RETURNS integer
LANGUAGE plpgsql
AS $$
BEGIN
-- Контроль значения типа integer (проверка на NULL и замена NULL на значение по умочанию)
/*
select * from int_is_null(null, -5);
select * from int_is_null(null);
select * from int_is_null(0, -5);
*/
IF (sx is NULL) THEN
IF (sdef is NULL) THEN sdef=0; END IF;
RETURN sdef;
ELSE
RETURN sx;
END IF;
END;
$$;
ALTER FUNCTION public.int_is_null(sx integer, sdef integer) OWNER TO postgres;
--
-- Name: FUNCTION int_is_null(sx integer, sdef integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION int_is_null(sx integer, sdef integer) IS 'Контроль значения типа integer (проверка на NULL и замена NULL на значение по умочанию)';
--
-- Name: its_bigint(character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION its_bigint(sx character varying, yes_sign boolean DEFAULT true) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
v float;
b boolean;
BEGIN
/*
Проверка, что строка - это целое число (bigint)
sx - тестируемая строка
yes_sign - флаг. Если >0, то учитывать знак (+/-)
Пример вызова:
select * from its_bigint('-127739.',true); -- false
select * from its_bigint('-127.739',true); -- false
select * from its_bigint('-127739',true); -- true
select * from its_bigint('-127739',false); -- false
select * from its_bigint('127739',false); -- true
*/
res = false;
sx = str_is_null(sx);
IF (sx <> '') THEN
IF (position('.' in sx)<=0) THEN
IF (position(',' in sx)<=0) THEN
b = its_float(sx,'',yes_sign,false,false);
IF (b=TRUE) THEN
res = true;
V = CAST(sx as float);
IF (v < -9223372036854775808) THEN
res = false;
ELSE
IF (v > 9223372036854775807) THEN
res = false;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.its_bigint(sx character varying, yes_sign boolean) OWNER TO postgres;
--
-- Name: FUNCTION its_bigint(sx character varying, yes_sign boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION its_bigint(sx character varying, yes_sign boolean) IS 'Проверка, что строка - это целое число (bigint)';
--
-- Name: its_bool(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION its_bool(v character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE res boolean;
BEGIN
-- Проверка, что строка - это логическое значение (boolean)
-- select * from its_bool('9');
-- select * from its_bool('ФальшЬ');
-- select * from its_bool('Y');
-- select * from its_bool('Д');
-- select * from its_bool('N');
-- select * from its_bool('Nt');
-- select * from its_bool('Н');
-- select * from its_bool('.t.');
res = false;
v = upper(str_is_null(v));
if (v = '.T.') THEN res = true; END IF;
if (v = 'T') THEN res = true; END IF;
if (v = 'TRUE') THEN res = true; END IF;
if (v = '.F.') THEN res = true; END IF;
if (v = 'F') THEN res = true; END IF;
if (v = 'FALSE') THEN res = true; END IF;
if (v = 'Y') THEN res = true; END IF;
if (v = 'YES') THEN res = true; END IF;
if (v = 'YE') THEN res = true; END IF;
if (v = 'N') THEN res = true; END IF;
if (v = 'NOT') THEN res = true; END IF;
if (v = 'NO') THEN res = true; END IF;
if (v = '1') THEN res = true; END IF;
if (v = '0') THEN res = true; END IF;
if (v = '+') THEN res = true; END IF;
if (v = '-') THEN res = true; END IF;
if (v = 'OK') THEN res = true; END IF;
if (v = 'CANCEL') THEN res = true; END IF;
if (v = 'Д') THEN res = true; END IF;
if (v = 'ДА') THEN res = true; END IF;
if (v = 'Н') THEN res = true; END IF;
if (v = 'НЕ') THEN res = true; END IF;
if (v = 'НЕТ') THEN res = true; END IF;
if (v = 'ИСТИНА') THEN res = true; END IF;
if (v = 'И') THEN res = true; END IF;
if (v = 'ФАЛЬШ') THEN res = true; END IF;
if (v = 'ФАЛЬШЬ') THEN res = true; END IF;
if (v = 'Ф') THEN res = true; END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.its_bool(v character varying) OWNER TO postgres;
--
-- Name: FUNCTION its_bool(v character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION its_bool(v character varying) IS 'роверка, что строка - это логическое значение (boolean)?';
--
-- Name: its_float(character varying, character varying, boolean, boolean, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION its_float(sx character varying, ch_point character varying DEFAULT '.,'::character varying, yes_sign boolean DEFAULT true, yes_point_start boolean DEFAULT false, yes_point_end boolean DEFAULT false) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
i integer;
m integer;
ch varchar(1);
c integer;
cp integer;
ch_ok varchar(20);
v float;
res boolean;
BEGIN
/*
Проверка, что строка - это число (float)
sx - тестируемая строка
ch_point - строка символов-разделителей целой и дробной части числа (точка и запятая)...
yes_sign - флаг. Если >0, то учитывать знак (+/-)
yes_point_start - если true, то точка может быть первым символом
yes_point_end - если true, то точка может быть последним символом
Пример вызова:
select * from its_float('-127739.','.',true,false,false);
select * from its_float('-127739.','.',true,false,true);
select * from its_float('-1277.39','.',true); -- Результат: true
select * from its_float('-1277.39','.',true); -- Результат: true
select * from its_float('12773,99','.',true,false,true);
select * from its_float('12773,99',',.',true,false,true); //допустимы два разделителя
select * from its_float('12773.99','.',true,false,true);
select * from its_float('0.12773','.',true,false,true);
select * from its_float('.12773','.',true,false,true);
select * from its_float('.12773','.',true,true,true);
select * from its_float('.12773.','.',true,true,true);
*/
res = false;
sx = str_is_null(sx);
c = CHAR_LENGTH(sx);
IF (c >0) THEN
ch_point = str_is_null(ch_point);
IF (ch_point = '') THEN ch_point = '.,'; END IF;
yes_sign = bool_is_null(yes_sign, true);
yes_point_start = bool_is_null(yes_point_start);
yes_point_end = bool_is_null(yes_point_end);
cp = 0;
ch_ok = '0123456789' || ch_point;
IF (yes_sign = true) THEN
ch_ok = ch_ok || '+-';
END IF;
res = true;
i = 0;
WHILE (i < c) LOOP
i = i + 1;
ch = substring(sx,i,1);
IF (POSITION(ch in ch_point)>0) THEN
cp = cp + 1;
/* ......................................... */
-- контроль корректности в контексте точки в начале
IF (yes_point_start = false) THEN
IF (i = 1) THEN
res=false;
i = c + 1; /* exit */
END IF;
END IF;
/* ......................................... */
/* ......................................... */
-- контроль корректности в контексте точки в конце
IF (yes_point_end = false) THEN
IF (i = c) THEN
res=false;
i = c + 1; /* exit */
END IF;
END IF;
/* ......................................... */
END IF;
m = POSITION(ch in ch_ok);
IF (m <= 0) THEN
/* встретился запрещенный символ */
res=false;
i = c + 1; /* exit */
ELSE
/* проверяем знак +/- */
IF (yes_sign = TRUE) THEN
m = POSITION(ch in '+-');
IF (m > 0) THEN
IF (i > 1) THEN
/* знак +/- не на своем месте */
res=false;
i = c + 1; /* exit */
END IF;
END IF;
END IF;
END IF;
END LOOP;
IF (cp > 1) THEN res = false; END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.its_float(sx character varying, ch_point character varying, yes_sign boolean, yes_point_start boolean, yes_point_end boolean) OWNER TO postgres;
--
-- Name: FUNCTION its_float(sx character varying, ch_point character varying, yes_sign boolean, yes_point_start boolean, yes_point_end boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION its_float(sx character varying, ch_point character varying, yes_sign boolean, yes_point_start boolean, yes_point_end boolean) IS 'Проверка, что строка - это число (float)';
--
-- Name: its_integer(character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION its_integer(sx character varying, yes_sign boolean DEFAULT true) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
v float;
-- k integer;
b boolean;
BEGIN
/*
Проверка, что строка - это целое число (integer)
sx - тестируемая строка
yes_sign - флаг. Если >0, то учитывать знак (+/-)
Пример вызова:
select * from its_integer('-127739.',true); -- false
select * from its_integer('-127.739',true); -- false
select * from its_integer('-127739',true); -- true
select * from its_integer('-127739',false); -- false
select * from its_integer('127739',false); -- true
*/
res = false;
sx = str_is_null(sx);
IF (sx <> '') THEN
IF (position('.' in sx)<=0) THEN
IF (position(',' in sx)<=0) THEN
b = its_float(sx,'',yes_sign,false,false);
IF (b=TRUE) THEN
res = true;
V = CAST(sx as float);
IF (v < -2147483648) THEN
res = false;
ELSE
IF (v > 2147483647) THEN
res = false;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.its_integer(sx character varying, yes_sign boolean) OWNER TO postgres;
--
-- Name: FUNCTION its_integer(sx character varying, yes_sign boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION its_integer(sx character varying, yes_sign boolean) IS 'Проверка, что строка - это целое число (integer)';
--
-- Name: q39_dub(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION q39_dub(sx text) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
BEGIN
/*
Продублировать одинарные кавычки к строке (text)
Пример:
select ('абв ' || chr(39) || 'гд' || chr(39));
select * from q39_dub('абв ' || chr(39) || 'гд' || chr(39));
select * from q39_dub(null);
*/
res = str_is_null(sx, '', false);
res = replace(res, chr(39), chr(39) || chr(39));
return res;
END;
$$;
ALTER FUNCTION public.q39_dub(sx text) OWNER TO postgres;
--
-- Name: FUNCTION q39_dub(sx text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION q39_dub(sx text) IS 'Продублировать одинарные кавычки к строке (text)';
--
-- Name: q39_lr(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION q39_lr(sx text) RETURNS text
LANGUAGE plpgsql
AS $$
BEGIN
/*
Добавить одинарные кавычки к строке (text) слева и справа. Контроль NULL. Удаление пробелов во входной строке (text) слева и справа
Пример:
select * from q39_lr('абвгд');
select * from q39_lr(null);
*/
return chr(39) || str_is_null(sx) || chr(39);
END;
$$;
ALTER FUNCTION public.q39_lr(sx text) OWNER TO postgres;
--
-- Name: FUNCTION q39_lr(sx text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION q39_lr(sx text) IS 'Добавить одинарные кавычки к строке (text) слева и справа. Контроль NULL. Удаление пробелов во входной строке (text) слева и справа';
--
-- Name: q39_lr(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION q39_lr(sx character varying) RETURNS character varying
LANGUAGE plpgsql
AS $$
BEGIN
/*
Добавить одинарные кавычки к строке слева и справа. Контроль NULL. Удаление пробелов во входной строке слева и справа
Пример:
select * from q39_lr('абвгд');
select * from q39_lr(null);
*/
return chr(39) || str_is_null(sx) || chr(39);
END;
$$;
ALTER FUNCTION public.q39_lr(sx character varying) OWNER TO postgres;
--
-- Name: FUNCTION q39_lr(sx character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION q39_lr(sx character varying) IS 'Добавить одинарные кавычки к строке слева и справа';
--
-- Name: script_pg_execute(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_execute(scr text) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
b boolean;
yes_next boolean;
yes_done boolean;
v_name character varying;
v_expr text;
v_val character varying;
v_tmp t_float;
scom text;
s_left text /*character varying*/;
s_right text /*character varying*/;
code_op integer;
--cline integer;
--iline integer;
k integer;
k1 integer;
k2 integer;
iline integer;
lines_count integer;
n_rec integer;
n1_block integer;
n2_block integer;
slt integer;
v t_float;
v_left t_float;
v_right t_float;
BEGIN
-- Выполнить pg-скрипт
/*
-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from script_pg_execute
('
m:=0;
');
select * from scr_pg_vars_tt999 order by var_name;
-- select * from scr_pg_000_tt999 order by n;
-- select * from script_pg_vars_table_tmp_drop();
-- ................................................
-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from script_pg_execute
('
m:=0;
s:=0;
z:=0;
j:=0;
WHILE z<10 do
z := z + 1;
j:=0;
WHILE j<10 do
j := j + 1;
s := s+1;
if s <= 3 then
m:=m+1;
else
m := m+10;
end_if;
a:=333.4;
b := 444;
d:=55;
x:=(a + b) / (a - b) * d + 17.5;
IF X>99 THEN
b := x-5;
IF b>3 THEN
d:=34;
ELSE
d:= 72;
END_IF;
END_IF;
END_WHILE;
END_WHILE;
');
select * from scr_pg_vars_tt999 order by var_name;
-- select * from scr_pg_000_tt999 order by n;
-- select * from script_pg_vars_table_tmp_drop();
-- ................................................
-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999 order by var_name;
select * from script_pg_execute
(
'
a:=333.4;
b := 444;
d:=55;
x:=(a + b) / (a - b) * d + 17.5;
'
);
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
-- ................................................
-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999 order by var_name;
select * from public.script_pg_execute
(
'
a:=333.4;
Перем_Строка:="Привет, как дела?";
'
);
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
-- ................................................
-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999 order by var_name;
select * from public.script_pg_execute
(
'
Npp:=ТаблицаПолеЗначениеКакЧислоПолучить("tmp.docs_list", "npp", "id=2");
note:=ТаблицаПолеЗначениеКакСтрокаПолучить("tmp.docs_list", "note", "id=2");
doc_name:=ТаблицаПолеЗначениеКакСтрокаПолучить("tmp.docs_list", "doc_name", "id=2");
B:=ТаблицаПолеЗначениеКакЛогическоеПолучить("tmp.docs_list", "its_actual", "id=2");
Сум_Npp:=ТаблицаПолеЗначениеКакЧислоПолучить("tmp.docs_list", "sum(npp)", "id>0");
'
);
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
-- ................................................
-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999 order by var_name;
select * from public.script_pg_execute
(
'
ФИО:=ТаблицаПолеЗначениеКакСтрокаПолучить("tmp.fio_list", "fio", "code=106");
ФИО_изм := "Некто Новый...";
Результат_Записи_ФИО:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "fio", "code=106", ФИО_изм);
Оклад := ТаблицаПолеЗначениеКакЧислоПолучить("tmp.fio_list", "oklad", "code=106");
Оклад_Расчетный := (Оклад + 100) * 1.8;
Результат_Записи_Оклада:=ТаблицаПолеЗначениеКакЧислоЗаписать("tmp.fio_list", "oklad", "code=106", Оклад_Расчетный);
Активность:=ТаблицаПолеЗначениеКакЛогическоеПолучить("tmp.fio_list", "yes_active", "code=106");
Результат_Записи_Активности:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "yes_active", "code=106", "True");
Результат_Записи_Даты1:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "d1", "code=106", "2022-07-01");
Результат_Записи_Даты2:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "d2", "code=106", "2022-07-31");
Результат_Записи_Прим:=ТаблицаПолеЗначениеКакСтрокаЗаписать("tmp.fio_list", "note", "code=106", "Примечание какое-то");
'
);
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
-- ................................................
*/
/*
301 ТаблицаПолеЗначениеКакЧислоПолучить
302 ТаблицаПолеЗначениеКакСтрокаПолучить
303 ТаблицаПолеЗначениеКакЛогическоеПолучить
331 ТаблицаПолеЗначениеКакЧислоЗаписать
332 ТаблицаПолеЗначениеКакСтрокаЗаписать
333 ТаблицаПолеЗначениеКакЛогическоеЗаписать
*/
res = false;
scr= str_is_null(scr);
IF (scr <> '') THEN
b = script_pg_table_tmp_000_create();
lines_count = script_pg_parse(scr);
IF (lines_count>0) THEN
iline = 0;
WHILE (iline<lines_count) LOOP
iline = iline + 1;
select
n, -- номер строки (команды) скрипта
sline_type, -- тип строки скрипта. 0-"обычная", 1-формула, 2-IF, 3-ELSE, 4-END_IF, 5-WHILE, 6-END_WHILE
block_n1, -- начало блока (номер строки)
block_n2, -- конец блока (номер строки)
sline -- текст строки (команды) скрипта
into
n_rec, slt, n1_block, n2_block, scom
from
scr_pg_000_tt999
where
n = iline;
scom = str_is_null(scom );
res = true;
n_rec = int_is_null(n_rec);
n1_block = int_is_null(n1_block);
n2_block = int_is_null(n2_block);
slt = int_is_null(slt);
yes_done = false;
-- ............................................................
IF ((slt = 1) or (slt between 100 and 999)) THEN -- формула или спец.функции
k1 = position(':=' in scom );
IF (k1>0) THEN
v_name = substr(scom, 1, k1-1);
v_name = str_is_null(v_name);
IF (v_name <> '') THEN
v_expr = substr(scom, k1+2, char_length(scom));
v_expr = str_is_null(v_expr);
IF (v_expr <> '') THEN
yes_next = true;
END IF;
END IF;
END IF;
IF (yes_next = true) THEN
k1 = position('"' in v_expr);
IF (k1<=0) THEN k1 = position(chr(39) in v_expr); END IF;
IF (slt = 1) THEN -- формула
--v_tmp = 0.0;
IF (k1<=0) THEN
v_tmp = script_pg_line_as_formula_execute(v_expr);
b = script_pg_var_as_float_set(v_name, v_tmp);
ELSE
v_expr = str_char1_trim(v_expr, '"', true);
b = script_pg_var_as_str_set(v_name, v_expr);
END IF;
ELSE -- спец.функции
v_expr = script_pg_spec_func_execute(slt, v_expr);
IF (its_float(v_expr)=true) THEN
b = script_pg_var_as_float_set(v_name, str_as_float(v_expr, 0.0));
ELSE
b = script_pg_var_as_str_set(v_name, v_expr);
END IF;
END IF;
END IF;
END IF;
-- ............................................................
-- ............................................................
IF (slt = 3) THEN -- ELSE
iline = n2_block; -- переходим ЗА "свой" END_IF
END IF;
-- ............................................................
-- ............................................................
IF (slt = 4) THEN -- END_IF
-- ничего не делаем
END IF;
-- ............................................................
-- ............................................................
IF (slt = 6) THEN -- END_WHILE
iline = n1_block-1; -- возвращаемся на "свой" WHILE
END IF;
-- ............................................................
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IF (slt in (2,5)) THEN -- IF, WHILE
s_left='';
s_right='';
code_op = 0;
IF (slt = 5) THEN
-- PERFORM debuglog_add( 'script_pg_execute', 'WHILE', 'scom ', iline, scom, '');
END IF;
-- ........................................
-- порядок не менять!!!
k1 = 0;
IF (k1<=0) THEN k1=position('><' in upper(scom)); END IF;
IF (k1<=0) THEN k1=position('=>' in upper(scom)); END IF;
IF (k1<=0) THEN k1=position('=<' in upper(scom)); END IF;
IF (k1<=0) THEN k1=position('==' in upper(scom)); END IF;
IF (k1<=0) THEN k1=position('>>' in upper(scom)); END IF;
IF (k1<=0) THEN k1=position('<<' in upper(scom)); END IF;
IF (k1<=0) THEN
k1=position('<>' in upper(scom));
IF (k1>0) THEN
code_op = 1;
s_left = substring(scom , 1, k1-1);
s_left = str_is_null(s_left);
s_right = substring(scom , k1+char_length('<>'), char_length(scom ));
s_right = str_is_null(s_right);
END IF;
END IF;
IF (k1<=0) THEN
k1=position('<=' in upper(scom));
IF (k1>0) THEN
code_op = 2;
s_left = substring(scom , 1, k1-1);
s_left = str_is_null(s_left);
s_right = substring(scom , k1+char_length('<='), char_length(scom ));
s_right = str_is_null(s_right);
END IF;
END IF;
IF (k1<=0) THEN
k1=position('>=' in upper(scom));
IF (k1>0) THEN
code_op = 3;
s_left = substring(scom , 1, k1-1);
s_left = str_is_null(s_left);
s_right = substring(scom , k1+char_length('>='), char_length(scom ));
s_right = str_is_null(s_right);
END IF;
END IF;
IF (k1<=0) THEN
k1=position('=' in upper(scom));
IF (k1>0) THEN
code_op = 4;
s_left = substring(scom , 1, k1-1);
s_left = str_is_null(s_left);
s_right = substring(scom , k1+char_length('='), char_length(scom ));
s_right = str_is_null(s_right);
END IF;
END IF;
IF (k1<=0) THEN
k1=position('<' in upper(scom));
IF (k1>0) THEN
code_op = 5;
s_left = substring(scom , 1, k1-1);
s_left = str_is_null(s_left);
s_right = substring(scom , k1+char_length('<'), char_length(scom ));
s_right = str_is_null(s_right);
END IF;
END IF;
IF (k1<=0) THEN
k1=position('>' in upper(scom));
IF (k1>0) THEN
code_op = 6;
s_left = substring(scom , 1, k1-1);
s_left = str_is_null(s_left);
s_right = substring(scom , k1+char_length('>'), char_length(scom ));
s_right = str_is_null(s_right);
END IF;
END IF;
-- ........................................
-- ****************************************************
IF (code_op>0) THEN
v_left = 0;
v_right = 0;
IF (s_left <> '') THEN
IF (its_float(s_left) = false) THEN
v_left = script_pg_var_as_float_get(s_left);
ELSE
v_left = str_as_float(s_left);
END IF;
ELSE
res = false;
EXIT;
END IF;
IF (s_right <> '') THEN
IF (its_float(s_right) = false) THEN
v_right = script_pg_var_as_float_get(s_right);
ELSE
v_right = str_as_float(s_right);
END IF;
ELSE
res = false;
EXIT;
END IF;
-- ........................................
IF (slt in (2, 5)) THEN -- IF или WHILE
IF (code_op = 1) THEN -- <>
IF (v_left = v_right) THEN -- условие НЕ выполнено
iline = n2_block; -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
END IF;
END IF;
IF (code_op = 2) THEN -- <=
IF (v_left > v_right) THEN -- условие НЕ выполнено
iline = n2_block; -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
END IF;
END IF;
IF (code_op = 3) THEN -- >=
IF (v_left < v_right) THEN -- условие НЕ выполнено
iline = n2_block; -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
END IF;
END IF;
IF (code_op = 4) THEN -- =
IF (v_left <> v_right) THEN -- условие НЕ выполнено
iline = n2_block; -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
END IF;
END IF;
IF (code_op = 5) THEN -- <
IF (v_left >= v_right) THEN -- условие НЕ выполнено
iline = n2_block; -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
END IF;
END IF;
IF (code_op = 6) THEN -- >
IF (v_left <= v_right) THEN -- условие НЕ выполнено
iline = n2_block; -- "уходим" ЗА пределы "своего" ELSE, END_IF или END_WHILE
END IF;
END IF;
END IF;
-- ........................................
ELSE
-- Выход с ошибкой
res = false;
EXIT;
END IF;
-- ****************************************************
END IF;
-- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
END LOOP;
END IF;
b = script_pg_table_tmp_000_drop();
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_execute(scr text) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_execute(scr text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_execute(scr text) IS 'Выполнить pg-скрипт';
--
-- Name: script_pg_line_as_formula_execute(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_line_as_formula_execute(scr text) RETURNS t_float
LANGUAGE plpgsql
AS $$
DECLARE
res t_float;
BEGIN
-- Вычислить строку-формулу (pg-скрипт)
/*
select * from public.script_pg_line_as_formula_execute('(1+2) / (3-5)');
select * from public.script_pg_line_as_formula_execute('(1.23+7)/(325-22)');
-- ................................................
select * from script_pg_vars_table_tmp_create();
select * from script_pg_var_as_float_set('A',2);
select * from script_pg_var_as_float_set('Б',1);
select * from script_pg_var_as_float_set('d',3.5);
select * from scr_pg_001_tt999 order by var_name;
select * from script_pg_var_as_float_get('A');
select * from script_pg_var_as_float_get('Б');
select * from public.script_pg_line_as_formula_execute('(a + б) / (a - б) * d');
select * from script_pg_vars_table_tmp_drop();
-- ................................................
*/
res = 0;
scr= str_is_null(scr);
IF (scr <> '') THEN
-- Парсинг scr с заменой переменных на их значения
scr = script_pg_line_as_formula_parse(scr);
res = fn_calc_as_float(scr);
END IF;
res = float_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_line_as_formula_execute(scr text) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_line_as_formula_execute(scr text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_line_as_formula_execute(scr text) IS 'Вычислить строку-формулу (pg-скрипт)';
--
-- Name: script_pg_line_as_formula_parse(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_line_as_formula_parse(scr text) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
opers character varying;
sw character varying;
yes_inword boolean;
ch_op char;
ch char;
cch integer;
k integer;
ich integer;
cw integer;
iw integer;
v t_float;
BEGIN
-- Парсинг строки-формулы (pg-скрипт). Замена переменных на их значения (t_float)
/*
select * from public.script_pg_line_as_formula_parse('(1.23+7)/(325-22)');
select * from public.script_pg_line_as_formula_parse(' ( 1.23 + 7 ) / ( 325 - 22 ) ');
select * from public.script_pg_line_as_formula_parse('1.23+7/(325-22) - 99');
select * from public.script_pg_line_as_formula_parse('-5 + 7 - 99');
select * from public.script_pg_line_as_formula_parse('- 5 + 7 - 99');
-- ................................................
select * from script_pg_table_tmp_001_create();
select * from script_pg_var_as_float_set('A',3.348);
select * from script_pg_var_as_float_set('Б',77);
select * from scr_pg_001_tt999 order by var_name;
select * from script_pg_var_as_float_get('A');
select * from public.script_pg_line_as_formula_parse('(a + 2) - (б/2)');
select * from script_pg_table_tmp_001_drop();
-- ................................................
*/
res = '';
scr= str_is_null(scr);
IF (scr <> '') THEN
-- ......................................
-- возможно это лишнее
scr = str_is_null(scr);
scr =replace(scr, chr(10),' ');
scr =replace(scr, chr(13),' ');
scr =replace(scr, chr(9),' ');
scr = str_is_null(scr);
-- ......................................
END IF;
IF (scr <> '') THEN
-- res = scr;
opers = '/\*+-()';
--scr = replace( scr,' ','|');
cch = char_length(scr);
yes_inword = false;
ch_op = ' ';
sw = '';
ich = 0;
WHILE (ich < cch) LOOP
ich = ich + 1;
ch = substring(scr, ich, 1);
k = position(ch in opers);
IF (k>0) THEN
-- Операция
ch_op = ch;
sw = str_is_null(sw);
IF (sw <> '') THEN
IF (its_float(sw) = false) THEN
v = script_pg_var_as_float_get(sw);
sw = float_as_str(v);
END IF;
sw = float_str_normal(sw);
res = res || sw;
END IF;
res = res || ch_op;
yes_inword = false;
sw = '';
ch_op = ' ';
ELSE
-- Переменная или значение
yes_inword = true;
sw = sw || ch;
END IF;
END LOOP;
IF (sw <> '') THEN
IF (its_float(sw) = false) THEN
v = script_pg_var_as_float_get(sw);
sw = float_as_str(v);
END IF;
sw = float_str_normal(sw);
res = res || sw;
END IF;
END IF;
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_line_as_formula_parse(scr text) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_line_as_formula_parse(scr text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_line_as_formula_parse(scr text) IS 'Парсинг строки-формулы (pg-скрипт). Замена переменных на их значения (t_float) ';
--
-- Name: script_pg_parse(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_parse(scr text) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
res integer;
b boolean;
yes_777 boolean;
yes_next boolean;
yes_done boolean;
scommand text;
sline_ text;
cline integer;
iline integer;
its_comm_end boolean;
sline_type_ integer;
s_if text;
s_while text;
k integer;
k1 integer;
k2 integer;
n0 integer;
n1 integer;
n2 integer;
c_tt999 CURSOR FOR
select
n, -- номер строки (команды) скрипта
sline_type, -- тип строки скрипта:
-- 0-"обычная", 1-формула, 2-IF, 3-ELSE, 4-END_IF, 5-WHILE, 6-END_WHILE,
--
block_n1, -- начало блока (номер строки)
block_n2, -- конец блока (номер строки)
sline -- текст строки (команды) скрипта
from
scr_pg_000_tt999
order by n;
BEGIN
-- Парсер скрипта (переписывает скрипт во временную таблицу scr_pg_000_tt999)
/*
-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse
('
s:=0;
');
select * from scr_pg_000_tt999 order by n;
-- select * from script_pg_table_tmp_000_drop();
-- ................................................
-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse
('
s:=0;
Знач_1 := ОбъектСвойствоЗначениеПолучить();
Сумма_1 := ОбъектыСвойствоЗначениеСуммаПолучить();
Средн_1 := ОбъектыСвойствоЗначениеСреднееПолучить();
Колво_1 := ОбъектыСвойствоКоличествоПолучить();
z:=0;
j:=0;
WHILE z<10 do
z := z + 1;
j:=0;
WHILE j<10 do
j := j + 1;
s := s+1;
a:=333.4;
b := 444;
d:=55;
x:=(a + b) / (a - b) * d + 17.5;
IF X>99 THEN
b := x-5;
IF b>3 THEN
d:=34;
ELSE
d:= 72;
END_IF;
END_IF;
END_WHILE;
END_WHILE;
');
select * from scr_pg_000_tt999 order by n;
select * from script_pg_table_tmp_000_drop();
-- ................................................
-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse
(
'
a:=333.4;
b := 444;
d:=55;
x:=(a + b) / (a - b) * d + 17.5;
'
);
select * from scr_pg_000_tt999 order by n;
select * from script_pg_table_tmp_000_drop();
-- ................................................
*/
/*
301 ТаблицаПолеЗначениеКакЧислоПолучить
302 ТаблицаПолеЗначениеКакСтрокаПолучить
303 ТаблицаПолеЗначениеКакЛогическоеПолучить
331 ТаблицаПолеЗначениеКакЧислоЗаписать
332 ТаблицаПолеЗначениеКакСтрокаЗаписать
333 ТаблицаПолеЗначениеКакЛогическоеЗаписать
*/
res = 0;
scr= str_is_null(scr);
IF (scr <> '') THEN
cline = str_words_count(scr, chr(10));
IF (cline > 0) THEN
scommand = '';
its_comm_end = false;
iline = 0;
WHILE (iline < cline) LOOP
iline = iline + 1;
sline_ = str_word_by_num(scr, iline, chr(10));
sline_ = str_is_null(sline_);
sline_ =replace(sline_, chr(10),' ');
sline_ =replace(sline_, chr(13),' ');
sline_ =replace(sline_, chr(9),' ');
sline_ = str_is_null(sline_);
yes_next = false;
IF (sline_ <> '') THEN
yes_next = true;
IF (substring(sline_,1,1) = '*') THEN yes_next = false; END IF; -- строка-примечание
IF (substring(sline_,1,2) = '--') THEN yes_next = false; END IF; -- строка-примечание
/*
IF (substring(sline_,1,1) <> '*') THEN -- строка-примечание
yes_next = true;
END IF;
*/
END IF;
IF (yes_next = true) THEN
its_comm_end = false;
IF (substring(sline_,char_length(sline_),1) = ';') THEN -- конец команды
sline_ = substring(sline_,1, char_length(sline_)-1);
its_comm_end = true;
ELSE
IF ('ELSE' = upper(sline_)) THEN -- конец команды
its_comm_end = true;
END IF;
k = position('THEN' in upper(sline_));
IF (k = (char_length(sline_)-char_length('THEN') +1)) THEN its_comm_end = true; END IF; -- конец команды
k = position('DO' in upper(sline_));
IF (k = (char_length(sline_)-char_length('DO') +1)) THEN its_comm_end = true; END IF; -- конец команды
END IF;
IF (its_comm_end = true) THEN
sline_ = str_is_null(sline_);
scommand = scommand || ' ' || sline_;
res = res + 1;
sline_type_ = 0;
scommand = str_is_null(scommand);
k = position(':=' in scommand); -- формула или какая-то спец команда
IF (k>1) THEN
yes_777 = false;
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакЧислоПолучить') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsFloatGet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 301;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакСтрокаПолучить') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsStrGet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 302;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакЛогическоеПолучить') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsBoolGet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 303;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакЧислоЗаписать') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsFloatSet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 331;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакСтрокаЗаписать') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsStrSet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 332;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакЛогическоеЗаписать') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsBoolSet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 333;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN -- если "ничего", то формула
sline_type_ = 1;
END IF;
-- .................................
END IF;
k = position('IF' in upper(scommand));
IF (k=1) THEN -- IF
sline_type_ = 2;
scommand = substring(scommand, char_length('IF')+1, char_length(scommand));
scommand = str_is_null(scommand);
k1 = position('THEN' in upper(scommand));
IF (k1>0) THEN
scommand = substring(scommand, 1, char_length(scommand)-4);
scommand = str_is_null(scommand);
END IF;
END IF;
k = position('ELSE' in upper(scommand));
IF (k=1) THEN sline_type_ = 3; END IF; -- ELSE
k = position('END_IF' in upper(scommand));
IF (k=1) THEN sline_type_ = 4; END IF; -- END_IF
k = position('WHILE' in upper(scommand));
IF (k=1) THEN -- WHILE
sline_type_ = 5;
scommand = substring(scommand, char_length('WHILE')+1, char_length(scommand));
scommand = str_is_null(scommand);
k1 = position('DO' in upper(scommand));
IF (k1>0) THEN
scommand = substring(scommand, 1, char_length(scommand)-2);
scommand = str_is_null(scommand);
END IF;
END IF;
k = position('END_WHILE' in upper(scommand));
IF (k=1) THEN -- END_WHILE
sline_type_ = 6;
END IF;
b = script_pg_table_tmp_000_add(res, sline_type_, 0, 0, scommand);
scommand = '';
ELSE
scommand = scommand || ' ' || sline_;
END IF;
END IF;
END LOOP;
-- ======================================================
-- IF
b = script_pg_table_tmp_000_stack_if_create();
OPEN c_tt999;
LOOP
FETCH c_tt999 INTO n0, sline_type_, n1, n2, sline_;
IF NOT FOUND THEN EXIT; END IF;
sline_ = str_is_null(sline_);
IF (sline_ <> '') THEN
--res = true;
n0 = int_is_null(n0);
n1 = int_is_null(n1);
n2 = int_is_null(n2);
sline_type_ = int_is_null(sline_type_);
IF (sline_type_ = 2) THEN -- IF
b = script_pg_table_tmp_000_n1_set(n0, n0);
b = script_pg_table_tmp_000_stack_if_add(n0);
END IF;
IF (sline_type_ = 3) THEN -- ELSE
k = script_pg_table_tmp_000_stack_if_last_get();
IF (k>0) THEN
b = script_pg_table_tmp_000_n2_set(k, n0);
b = script_pg_table_tmp_000_n1_set(n0, k);
b = script_pg_table_tmp_000_n2_set(n0, n0);
END IF;
b = script_pg_table_tmp_000_stack_if_last_del();
b = script_pg_table_tmp_000_n1_set(n0, n0);
b = script_pg_table_tmp_000_stack_if_add(n0);
END IF;
IF (sline_type_ = 4) THEN -- END_IF
k = script_pg_table_tmp_000_stack_if_last_get();
IF (k>0) THEN
b = script_pg_table_tmp_000_n2_set(k, n0);
b = script_pg_table_tmp_000_n1_set(n0, k);
b = script_pg_table_tmp_000_n2_set(n0, n0);
END IF;
b = script_pg_table_tmp_000_stack_if_last_del();
END IF;
END IF;
END LOOP;
CLOSE c_tt999;
b = script_pg_table_tmp_000_stack_if_drop();
-- ======================================================
-- ======================================================
-- WHILE
b = script_pg_table_tmp_000_stack_if_create();
OPEN c_tt999;
LOOP
FETCH c_tt999 INTO n0, sline_type_, n1, n2, sline_;
IF NOT FOUND THEN EXIT; END IF;
sline_ = str_is_null(sline_);
IF (sline_ <> '') THEN
--res = true;
n0 = int_is_null(n0);
n1 = int_is_null(n1);
n2 = int_is_null(n2);
sline_type_ = int_is_null(sline_type_);
IF (sline_type_ = 5) THEN -- WHILE
b = script_pg_table_tmp_000_n1_set(n0, n0);
b = script_pg_table_tmp_000_stack_if_add(n0);
END IF;
IF (sline_type_ = 6) THEN -- END_WHILE
k = script_pg_table_tmp_000_stack_if_last_get();
IF (k>0) THEN
b = script_pg_table_tmp_000_n2_set(k, n0);
b = script_pg_table_tmp_000_n1_set(n0, k);
b = script_pg_table_tmp_000_n2_set(n0, n0);
END IF;
b = script_pg_table_tmp_000_stack_if_last_del();
END IF;
END IF;
END LOOP;
CLOSE c_tt999;
b = script_pg_table_tmp_000_stack_if_drop();
-- ======================================================
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_parse(scr text) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_parse(scr text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_parse(scr text) IS 'Парсер скрипта (переписывает скрипт во временную таблицу scr_pg_000_tt999)';
--
-- Name: script_pg_parse_zzz(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_parse_zzz(scr text) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
res integer;
b boolean;
yes_777 boolean;
yes_next boolean;
yes_done boolean;
scommand text;
sline_ text;
cline integer;
iline integer;
its_comm_end boolean;
sline_type_ integer;
s_if text;
s_while text;
k integer;
k1 integer;
k2 integer;
n0 integer;
n1 integer;
n2 integer;
c_tt999 CURSOR FOR
select
n, -- номер строки (команды) скрипта
sline_type, -- тип строки скрипта:
-- 0-"обычная", 1-формула, 2-IF, 3-ELSE, 4-END_IF, 5-WHILE, 6-END_WHILE,
--
block_n1, -- начало блока (номер строки)
block_n2, -- конец блока (номер строки)
sline -- текст строки (команды) скрипта
from
scr_pg_000_tt999
order by n;
BEGIN
-- Парсер скрипта (переписывает скрипт во временную таблицу scr_pg_000_tt999)
/*
-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse_ZZZ
('
s:=0;
');
select * from scr_pg_000_tt999 order by n;
-- select * from script_pg_table_tmp_000_drop();
-- ................................................
-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse_ZZZ
('
s:=0;
Знач_1 := ОбъектСвойствоЗначениеПолучить();
Сумма_1 := ОбъектыСвойствоЗначениеСуммаПолучить();
Средн_1 := ОбъектыСвойствоЗначениеСреднееПолучить();
Колво_1 := ОбъектыСвойствоКоличествоПолучить();
z:=0;
j:=0;
WHILE z<10 do
z := z + 1;
j:=0;
WHILE j<10 do
j := j + 1;
s := s+1;
a:=333.4;
b := 444;
d:=55;
x:=(a + b) / (a - b) * d + 17.5;
IF X>99 THEN
b := x-5;
IF b>3 THEN
d:=34;
ELSE
d:= 72;
END_IF;
END_IF;
END_WHILE;
END_WHILE;
');
select * from scr_pg_000_tt999 order by n;
select * from script_pg_table_tmp_000_drop();
-- ................................................
-- ................................................
select * from script_pg_table_tmp_000_create();
select * from script_pg_parse_ZZZ
(
'
a:=333.4;
b := 444;
d:=55;
x:=(a + b) / (a - b) * d + 17.5;
'
);
select * from scr_pg_000_tt999 order by n;
select * from script_pg_table_tmp_000_drop();
-- ................................................
*/
/*
301 ТаблицаПолеЗначениеКакЧислоПолучить
302 ТаблицаПолеЗначениеКакСтрокаПолучить
303 ТаблицаПолеЗначениеКакЛогическоеПолучить
*/
res = 0;
scr= str_is_null(scr);
IF (scr <> '') THEN
cline = str_words_count(scr, chr(10));
IF (cline > 0) THEN
scommand = '';
its_comm_end = false;
iline = 0;
WHILE (iline < cline) LOOP
iline = iline + 1;
sline_ = str_word_by_num(scr, iline, chr(10));
sline_ = str_is_null(sline_);
sline_ =replace(sline_, chr(10),' ');
sline_ =replace(sline_, chr(13),' ');
sline_ =replace(sline_, chr(9),' ');
sline_ = str_is_null(sline_);
yes_next = false;
IF (sline_ <> '') THEN
yes_next = true;
IF (substring(sline_,1,1) = '*') THEN yes_next = false; END IF; -- строка-примечание
IF (substring(sline_,1,2) = '--') THEN yes_next = false; END IF; -- строка-примечание
/*
IF (substring(sline_,1,1) <> '*') THEN -- строка-примечание
yes_next = true;
END IF;
*/
END IF;
IF (yes_next = true) THEN
its_comm_end = false;
IF (substring(sline_,char_length(sline_),1) = ';') THEN -- конец команды
sline_ = substring(sline_,1, char_length(sline_)-1);
its_comm_end = true;
ELSE
IF ('ELSE' = upper(sline_)) THEN -- конец команды
its_comm_end = true;
END IF;
k = position('THEN' in upper(sline_));
IF (k = (char_length(sline_)-char_length('THEN') +1)) THEN its_comm_end = true; END IF; -- конец команды
k = position('DO' in upper(sline_));
IF (k = (char_length(sline_)-char_length('DO') +1)) THEN its_comm_end = true; END IF; -- конец команды
END IF;
IF (its_comm_end = true) THEN
sline_ = str_is_null(sline_);
scommand = scommand || ' ' || sline_;
res = res + 1;
sline_type_ = 0;
scommand = str_is_null(scommand);
k = position(':=' in scommand); -- формула или какая-то спец команда
IF (k>1) THEN
yes_777 = false;
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакЧислоПолучить') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsFloatGet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 301;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакСтрокаПолучить') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsStrGet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 302;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN
k1 = position(upper('ТаблицаПолеЗначениеКакЛогическоеПолучить') in upper(scommand)); -- спец команда:
IF (k1<=0) THEN
k1 = position(upper('TableFieldValueAsBoolGet') in upper(scommand)); -- спец команда:
END IF;
IF (k1>(k+1)) THEN
yes_777 = true;
sline_type_ = 303;
END IF;
END IF;
-- .................................
-- .................................
IF (yes_777 = false) THEN -- если "ничего", то формула
sline_type_ = 1;
END IF;
-- .................................
END IF;
k = position('IF' in upper(scommand));
IF (k=1) THEN -- IF
sline_type_ = 2;
scommand = substring(scommand, char_length('IF')+1, char_length(scommand));
scommand = str_is_null(scommand);
k1 = position('THEN' in upper(scommand));
IF (k1>0) THEN
scommand = substring(scommand, 1, char_length(scommand)-4);
scommand = str_is_null(scommand);
END IF;
END IF;
k = position('ELSE' in upper(scommand));
IF (k=1) THEN sline_type_ = 3; END IF; -- ELSE
k = position('END_IF' in upper(scommand));
IF (k=1) THEN sline_type_ = 4; END IF; -- END_IF
k = position('WHILE' in upper(scommand));
IF (k=1) THEN -- WHILE
sline_type_ = 5;
scommand = substring(scommand, char_length('WHILE')+1, char_length(scommand));
scommand = str_is_null(scommand);
k1 = position('DO' in upper(scommand));
IF (k1>0) THEN
scommand = substring(scommand, 1, char_length(scommand)-2);
scommand = str_is_null(scommand);
END IF;
END IF;
k = position('END_WHILE' in upper(scommand));
IF (k=1) THEN -- END_WHILE
sline_type_ = 6;
END IF;
b = script_pg_table_tmp_000_add(res, sline_type_, 0, 0, scommand);
scommand = '';
ELSE
scommand = scommand || ' ' || sline_;
END IF;
END IF;
END LOOP;
-- ======================================================
-- IF
b = script_pg_table_tmp_000_stack_if_create();
OPEN c_tt999;
LOOP
FETCH c_tt999 INTO n0, sline_type_, n1, n2, sline_;
IF NOT FOUND THEN EXIT; END IF;
sline_ = str_is_null(sline_);
IF (sline_ <> '') THEN
--res = true;
n0 = int_is_null(n0);
n1 = int_is_null(n1);
n2 = int_is_null(n2);
sline_type_ = int_is_null(sline_type_);
IF (sline_type_ = 2) THEN -- IF
b = script_pg_table_tmp_000_n1_set(n0, n0);
b = script_pg_table_tmp_000_stack_if_add(n0);
END IF;
IF (sline_type_ = 3) THEN -- ELSE
k = script_pg_table_tmp_000_stack_if_last_get();
IF (k>0) THEN
b = script_pg_table_tmp_000_n2_set(k, n0);
b = script_pg_table_tmp_000_n1_set(n0, k);
b = script_pg_table_tmp_000_n2_set(n0, n0);
END IF;
b = script_pg_table_tmp_000_stack_if_last_del();
b = script_pg_table_tmp_000_n1_set(n0, n0);
b = script_pg_table_tmp_000_stack_if_add(n0);
END IF;
IF (sline_type_ = 4) THEN -- END_IF
k = script_pg_table_tmp_000_stack_if_last_get();
IF (k>0) THEN
b = script_pg_table_tmp_000_n2_set(k, n0);
b = script_pg_table_tmp_000_n1_set(n0, k);
b = script_pg_table_tmp_000_n2_set(n0, n0);
END IF;
b = script_pg_table_tmp_000_stack_if_last_del();
END IF;
END IF;
END LOOP;
CLOSE c_tt999;
b = script_pg_table_tmp_000_stack_if_drop();
-- ======================================================
-- ======================================================
-- WHILE
b = script_pg_table_tmp_000_stack_if_create();
OPEN c_tt999;
LOOP
FETCH c_tt999 INTO n0, sline_type_, n1, n2, sline_;
IF NOT FOUND THEN EXIT; END IF;
sline_ = str_is_null(sline_);
IF (sline_ <> '') THEN
--res = true;
n0 = int_is_null(n0);
n1 = int_is_null(n1);
n2 = int_is_null(n2);
sline_type_ = int_is_null(sline_type_);
IF (sline_type_ = 5) THEN -- WHILE
b = script_pg_table_tmp_000_n1_set(n0, n0);
b = script_pg_table_tmp_000_stack_if_add(n0);
END IF;
IF (sline_type_ = 6) THEN -- END_WHILE
k = script_pg_table_tmp_000_stack_if_last_get();
IF (k>0) THEN
b = script_pg_table_tmp_000_n2_set(k, n0);
b = script_pg_table_tmp_000_n1_set(n0, k);
b = script_pg_table_tmp_000_n2_set(n0, n0);
END IF;
b = script_pg_table_tmp_000_stack_if_last_del();
END IF;
END IF;
END LOOP;
CLOSE c_tt999;
b = script_pg_table_tmp_000_stack_if_drop();
-- ======================================================
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_parse_zzz(scr text) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_parse_zzz(scr text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_parse_zzz(scr text) IS 'Парсер скрипта (переписывает скрипт во временную таблицу scr_pg_000_tt999)';
--
-- Name: script_pg_spec_func_execute(integer, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_spec_func_execute(code integer, scr text) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
v_tmp t_float;
b_tmp boolean;
k1 integer;
sx character varying;
ch char;
s character varying;
yesnext boolean;
tn character varying;
fn character varying;
/*
itsdir boolean;
idguid_prop character varying;
obj_idguid character varying;
obj_prop_idguid character varying;
-- sval character varying;
*/
sfilter text;
sval text;
BEGIN
-- Вычислить спец. функцию (pg-скрипт)
/*
301 ТаблицаПолеЗначениеКакЧислоПолучить
302 ТаблицаПолеЗначениеКакСтрокаПолучить
303 ТаблицаПолеЗначениеКакЛогическоеПолучить
331 ТаблицаПолеЗначениеКакЧислоЗаписать
332 ТаблицаПолеЗначениеКакСтрокаЗаписать
333 ТаблицаПолеЗначениеКакЛогическоеЗаписать
*/
res = '';
code = int_is_null(code);
IF (code>0) THEN
scr= str_is_null(scr);
IF (scr <> '') THEN
-- здесь - реализация
yesnext = true;
sx = '';
-- .......................................................
-- Выделить аргумены функции
-- sx = str_is_null(str_word_by_num(scr, 2, '()'));
sx = scr;
ch = substr(sx, char_length(sx), 1);
IF (ch = ';') THEN sx = btrim(substr(sx, 1, char_length(sx)-1)); END IF;
IF (sx <> '') THEN
k1 = position('(' in sx);
IF (k1>0) THEN
sx = btrim(substr(sx, k1+1, char_length(sx)));
IF (sx<>'') THEN
ch = substr(sx, char_length(sx), 1);
IF (ch = ')') THEN
sx = btrim(substr(sx, 1, char_length(sx)-1));
END IF;
END IF;
END IF;
END IF;
-- .......................................................
IF (sx = '') THEN yesnext = false; END IF;
sfilter = '';
sval = '';
IF (code between 300 and 399) THEN -- "табличные" спец.функции
-- ..........................................
IF (yesnext = true) THEN -- имя таблицы
yesnext = false;
tn = str_is_null(str_word_by_num(sx, 1, ','));
IF (tn <> '') THEN
tn = str_is_null(script_pg_value_as_str_get(tn));
IF (tn <> '') THEN
yesnext = true;
END IF;
END IF;
END IF;
-- ..........................................
-- ..........................................
IF (yesnext = true) THEN -- имя поля
yesnext = false;
fn = str_is_null(str_word_by_num(sx, 2, ','));
IF (fn <> '') THEN
fn = str_is_null(script_pg_value_as_str_get(fn));
IF (fn <> '') THEN
yesnext = true;
END IF;
END IF;
END IF;
-- ..........................................
-- ..........................................
IF (yesnext = true) THEN -- sfilter
sfilter = str_is_null(str_word_by_num(sx, 3, ','));
sfilter = str_is_null(script_pg_value_as_str_get(sfilter));
IF (sfilter <> '') THEN
yesnext = true;
END IF;
END IF;
-- ..........................................
END IF;
IF (yesnext = true) THEN
IF (code between 330 and 359) THEN -- "табличные" спец.функции (запись значения поля)
/*
331 ТаблицаПолеЗначениеКакЧислоЗаписать
332 ТаблицаПолеЗначениеКакСтрокаЗаписать
333 ТаблицаПолеЗначениеКакЛогическоеЗаписать
*/
-- ..........................................
yesnext = false;
sval = str_is_null(str_word_by_num(sx, 4, ','));
sval = str_is_null(script_pg_value_as_str_get(sval));
IF (sval <> '') THEN -- какое-то значение должно быть!
-- позже озаботиться тем, что добавить отдельную функцию очистки значения поля
yesnext = true;
END IF;
-- ..........................................
END IF;
END IF;
/* ******************************************************************* */
/* ******************************************************************* */
/* ******************************************************************* */
/* ******************************************************************* */
/* Выполняем функции */
IF (yesnext = true) THEN
IF (code between 300 and 399) THEN
-- .......................................................................
IF (code = 301) THEN -- ТаблицаПолеЗначениеКакЧислоПолучить
v_tmp = table_field_value_as_float_get(tn, fn, sfilter);
-- res = float_is_null(res);
res = float_as_str(v_tmp);
END IF;
-- .......................................................................
-- .......................................................................
IF (code = 302) THEN -- ТаблицаПолеЗначениеКакСтрокаПолучить
res = table_field_value_as_str_get(tn, fn, sfilter);
--res = float_as_str(v_tmp);
END IF;
-- .......................................................................
-- .......................................................................
IF (code = 303) THEN -- ТаблицаПолеЗначениеКакЛогическоеПолучить
b_tmp = table_field_value_as_bool_get(tn, fn, sfilter);
-- res = float_is_null(res);
res = bool_as_str(b_tmp);
--res = float_as_str(v_tmp);
END IF;
-- .......................................................................
-- .......................................................................
IF (code = 331) THEN -- ТаблицаПолеЗначениеКакЧислоЗаписать
res = table_field_value_as_float_set(tn, fn, sfilter, str_as_float(sval));
END IF;
-- .......................................................................
-- .......................................................................
IF (code = 332) THEN -- ТаблицаПолеЗначениеКакСтрокаЗаписать
res = table_field_value_as_text_set(tn, fn, sfilter, q39_lr(q39_dub(sval)));
END IF;
-- .......................................................................
-- .......................................................................
IF (code = 333) THEN -- ТаблицаПолеЗначениеКакЛогическоеЗаписать
res = table_field_value_as_bool_set(tn, fn, sfilter, str_as_bool(sval));
END IF;
-- .......................................................................
END IF;
END IF;
/* ******************************************************************* */
/* ******************************************************************* */
END IF;
END IF;
--res = float_is_null(res);
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_spec_func_execute(code integer, scr text) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_spec_func_execute(code integer, scr text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_spec_func_execute(code integer, scr text) IS 'Вычислить спец. функцию (pg-скрипт)';
--
-- Name: script_pg_table_tmp_000_add(integer, integer, integer, integer, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_add(n_ integer, sline_type_ integer, block_n1_ integer, block_n2_ integer, sline_ text) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Добавить строку (команду) во временную таблицу scr_pg_000_tt999
/*
*/
res = false;
sline_ = str_is_null(sline_);
IF (sline_ <> '') THEN
n_ = int_is_null(n_ );
sline_type_ = int_is_null(sline_type_ );
block_n2_ = int_is_null(block_n2_ );
insert into scr_pg_000_tt999
(
n,
sline_type,
block_n1,
block_n2,
sline
)
values
(
n_ ,
sline_type_ ,
block_n1_ ,
block_n2_ ,
sline_
);
res = true;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_add(n_ integer, sline_type_ integer, block_n1_ integer, block_n2_ integer, sline_ text) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_add(n_ integer, sline_type_ integer, block_n1_ integer, block_n2_ integer, sline_ text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_add(n_ integer, sline_type_ integer, block_n1_ integer, block_n2_ integer, sline_ text) IS 'Добавить строку (команду) во временную таблицу scr_pg_000_tt999';
--
-- Name: script_pg_table_tmp_000_create(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_create() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
/*
Создать ВРЕМЕННУЮ таблицу scr_pg_000_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)
select * from public.script_pg_table_tmp_000_create();
select * from scr_pg_000_tt999;
*/
res = false;
PERFORM public.script_pg_table_tmp_000_drop();
CREATE temporary TABLE IF NOT EXISTS scr_pg_000_tt999 -- (текст скрипта)
(
n integer, -- номер строки (команды) скрипта
sline_type integer, -- тип строки скрипта. 0-"обычная", 1-формула, 2-IF, 3-ELSE, 4-END_IF, 5-WHILE, 6-END_WHILE
block_n1 integer, -- начало блока (номер строки)
block_n2 integer, -- конец блока (номер строки)
sline text -- текст строки (команды) скрипта
)
WITHOUT OIDS;
CREATE INDEX scr_pg_000_tt999_n ON scr_pg_000_tt999(n);
res = true;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_create() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_create(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_create() IS 'Создать ВРЕМЕННУЮ таблицу scr_pg_000_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_table_tmp_000_drop(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_drop() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Удалить ВРЕМЕННУЮ таблицу scr_pg_000_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)
-- select * from public.script_pg_table_tmp_000_drop();
res = false;
drop table if exists scr_pg_000_tt999;
res = true;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_drop() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_drop(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_drop() IS 'Удалить ВРЕМЕННУЮ таблицу scr_pg_000_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_table_tmp_000_n1_set(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_n1_set(n_ integer, block_n1_ integer) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Обновить "начало блока" во временной таблице scr_pg_000_tt999
res = false;
n_ = int_is_null(n_);
IF (n_ > 0) THEN
block_n1_ = int_is_null(block_n1_ );
update scr_pg_000_tt999
SET
block_n1 = block_n1_
WHERE
n = n_;
res = true;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_n1_set(n_ integer, block_n1_ integer) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_n1_set(n_ integer, block_n1_ integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_n1_set(n_ integer, block_n1_ integer) IS 'Обновить "начало блока" во временной таблице scr_pg_000_tt999';
--
-- Name: script_pg_table_tmp_000_n2_set(integer, integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_n2_set(n_ integer, block_n2_ integer) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Обновить "конец блока" во временной таблице scr_pg_000_tt999
res = false;
n_ = int_is_null(n_);
IF (n_ > 0) THEN
block_n2_ = int_is_null(block_n2_ );
update scr_pg_000_tt999
SET
block_n2 = block_n2_
WHERE
n = n_;
res = true;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_n2_set(n_ integer, block_n2_ integer) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_n2_set(n_ integer, block_n2_ integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_n2_set(n_ integer, block_n2_ integer) IS 'Обновить "конец блока" во временной таблице scr_pg_000_tt999';
--
-- Name: script_pg_table_tmp_000_stack_if_add(integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_stack_if_add(n_ integer) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
res = false;
/*
Добавить строку в таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)
select * from public.script_pg_table_tmp_000_stack_if_add(20);
*/
insert into scr_pg_000_stack_if_tt999(n) values(int_is_null(n_));
res = true;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_add(n_ integer) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_add(n_ integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_add(n_ integer) IS 'Получить значение поля n из последней строки таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_table_tmp_000_stack_if_clear(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_stack_if_clear() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Очистить ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)
-- select * from public.script_pg_table_tmp_000_stack_if_clear();
res = false;
delete from scr_pg_000_stack_if_tt999;
res = true;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_clear() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_clear(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_clear() IS 'Очистить ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_table_tmp_000_stack_if_create(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_stack_if_create() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
b boolean;
BEGIN
/*
Создать ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)
select * from public.script_pg_table_tmp_000_stack_if_create();
*/
res = false;
b = public.script_pg_table_tmp_000_stack_if_drop();
CREATE temporary TABLE IF NOT EXISTS scr_pg_000_stack_if_tt999 -- (текст скрипта)
(
-- id serial, -- id
n integer -- номер строки IF
)
WITHOUT OIDS;
CREATE INDEX scr_pg_000_stack_if_tt999_n ON scr_pg_000_stack_if_tt999(n);
res = true;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_create() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_create(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_create() IS 'Создать ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_table_tmp_000_stack_if_drop(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_stack_if_drop() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Удалить ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)
-- select * from public.script_pg_table_tmp_000_stack_if_drop();
res = false;
drop table if exists scr_pg_000_stack_if_tt999;
res = true;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_drop() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_drop(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_drop() IS 'Удалить ВРЕМЕННУЮ таблицу scr_pg_000_stack_if_tt999 (стек IF), используемую в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_table_tmp_000_stack_if_last_del(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_stack_if_last_del() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
nlast integer;
BEGIN
res = false;
/*
Удалить последнюю строку из таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)
select * from public.script_pg_table_tmp_000_stack_if_last_del();
*/
select max(n) into nlast from scr_pg_000_stack_if_tt999;
nlast =int_is_null(nlast);
IF (nlast > 0) THEN
delete from scr_pg_000_stack_if_tt999 where n = nlast;
res = true;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_last_del() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_last_del(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_last_del() IS 'Удалить последнюю строку из таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_table_tmp_000_stack_if_last_get(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_table_tmp_000_stack_if_last_get() RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
res integer;
BEGIN
res = 0;
/*
Получить значение поля n из последней строки таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)
select * from public.script_pg_table_tmp_000_stack_if_last_get();
*/
select max(n) into res from scr_pg_000_stack_if_tt999;
res =int_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_table_tmp_000_stack_if_last_get() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_table_tmp_000_stack_if_last_get(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_table_tmp_000_stack_if_last_get() IS 'Получить значение поля n из последней строки таблицы scr_pg_000_stack_if_tt999 (стек IF), используемой в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_value_as_str_get(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_value_as_str_get(vname_or_vval character varying) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
ch char;
itsval boolean;
BEGIN
/*
Получить строковое значение параметра vname_or_vval.
Вх. параметры:
vname_or_vval - может быть или именем переменной или строковым значением.
Если обрамлено двойными кавычками, то интерпретируется, как значение. В противном случае - как имя переменной.
Примеры: "a123" - значение; a123 - имя переменной.
Возвр значение:
Если vname_or_vval - переменная, то возвращается значение переменной из таблицы scr_pg_vars_tt999 (или пустая строка в случае отсутствия такой переменной).
Если vname_or_vval - значение, то возвращается это же значение без обрамляющих двойных кавычек.
Важно! Возвр значение НЕ содержит обрамляющих пробелов.
select * from script_pg_vars_table_tmp_create();
select * from public.script_pg_var_as_str_set('a123', '"Привет, как дела?"');
select * from public.script_pg_var_as_str_set('a124', 'Привет, как дела?');
select * from public.script_pg_value_as_str_get('a123');
select * from public.script_pg_value_as_str_get('"a123"');
select * from public.script_pg_value_as_str_get('a124');
select * from public.script_pg_value_as_str_get('"a124"');
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
*/
res = str_is_null(vname_or_vval);
IF (res <> '') THEN
itsval = false;
ch = substring(res , 1, 1);
IF (ch = '"') THEN
itsval = true;
res = btrim(substr(res, 2, char_length(res)));
END IF;
IF (res <> '') THEN
ch = substr(res , char_length(res), 1);
IF (ch = '"') THEN
itsval = true;
res = btrim(substr(res, 1, char_length(res)-1));
END IF;
END IF;
IF (itsval = false) THEN
res = public.script_pg_vars_table_tmp_val_get(res);
END IF;
END IF;
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_value_as_str_get(vname_or_vval character varying) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_value_as_str_get(vname_or_vval character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_value_as_str_get(vname_or_vval character varying) IS 'Получить строковое значение параметра vname_or_vval.';
--
-- Name: script_pg_var_as_bool_get(character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_var_as_bool_get(v_name character varying, v_def boolean DEFAULT false) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
v character varying;
BEGIN
-- Получить значение переменной v_name (как boolean) из таблицы scr_pg_vars_tt999
/*
select * from script_pg_vars_table_tmp_create();
select * from public.script_pg_var_as_bool_set('А', true);
select * from public.script_pg_var_as_bool_set('Б', false);
select * from public.script_pg_var_as_bool_set('d', 'true');
select * from public.script_pg_var_as_bool_get('А');
select * from public.script_pg_var_as_bool_get('Б');
select * from public.script_pg_var_as_bool_get('d');
select * from scr_pg_001_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
*/
v_def = bool_is_null(v_def);
res = v_def;
v = script_pg_vars_table_tmp_val_get(v_name, bool_as_str(v_def));
res = str_as_bool(v);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_var_as_bool_get(v_name character varying, v_def boolean) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_var_as_bool_get(v_name character varying, v_def boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_var_as_bool_get(v_name character varying, v_def boolean) IS 'Прочитать значение переменной v_name (как boolean) из таблицы scr_pg_001_tt999';
--
-- Name: script_pg_var_as_bool_set(character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_var_as_bool_set(v_name character varying, v_val boolean) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sx character varying;
BEGIN
-- Добавить (обновить) переменную v_name типа boolean в таблицу scr_pg_001_tt999
/*
select * from script_pg_vars_table_tmp_create();
select * from public.script_pg_var_as_bool_set('А', true);
select * from public.script_pg_var_as_bool_set('Б', false);
select * from public.script_pg_var_as_bool_set('d', 'true');
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
*/
res = false;
v_name = str_is_null(v_name);
IF (v_name <> '') THEN
sx = bool_as_str(v_val);
res = script_pg_vars_table_tmp_var_add(v_name, sx, 1);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_var_as_bool_set(v_name character varying, v_val boolean) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_var_as_bool_set(v_name character varying, v_val boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_var_as_bool_set(v_name character varying, v_val boolean) IS 'Добавить (обновить) переменную v_name типа boolean в таблицу scr_pg_vars_tt999';
--
-- Name: script_pg_var_as_float_get(character varying, t_float); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_var_as_float_get(v_name character varying, v_def t_float DEFAULT 0) RETURNS t_float
LANGUAGE plpgsql
AS $$
DECLARE
res t_float;
v character varying;
BEGIN
-- Получить значение переменной v_name (как t_float) из таблицы scr_pg_vars_tt999
/*
Примеры:
select * from script_pg_vars_table_tmp_create();
select * from public.script_pg_var_as_float_get('А');
select * from public.script_pg_var_as_float_get('Б');
select * from public.script_pg_var_as_float_get('Ы', 123.78);
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
*/
v_def = float_is_null(v_def);
res = v_def;
v = script_pg_vars_table_tmp_val_get(v_name, float_as_str(v_def));
IF (its_float(v)) THEN
res = cast(v as t_float);
END IF;
res = float_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_var_as_float_get(v_name character varying, v_def t_float) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_var_as_float_get(v_name character varying, v_def t_float); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_var_as_float_get(v_name character varying, v_def t_float) IS 'Прочитать значение переменной v_name (как t_float) из таблицы scr_pg_vars_tt999';
--
-- Name: script_pg_var_as_float_set(character varying, t_float); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_var_as_float_set(v_name character varying, v_val t_float) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sx character varying;
BEGIN
-- Добавить (обновить) переменную v_name типа t_float в таблицу scr_pg_vars_tt999
/*
select * from public.script_pg_var_as_float_set('А', 123);
select * from public.script_pg_var_as_float_set('Б', 12.777);
select * from scr_pg_vars_tt999 order by var_name;
*/
res = false;
v_name = str_is_null(v_name);
IF (v_name <> '') THEN
sx = float_as_str(v_val);
res = script_pg_vars_table_tmp_var_add(v_name, sx, 2);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_var_as_float_set(v_name character varying, v_val t_float) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_var_as_float_set(v_name character varying, v_val t_float); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_var_as_float_set(v_name character varying, v_val t_float) IS 'Добавить (обновить) переменную v_name типа t_float в таблицу scr_pg_vars_tt999';
--
-- Name: script_pg_var_as_str_get(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_var_as_str_get(v_name character varying, v_def character varying DEFAULT ''::character varying) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
BEGIN
-- Получить значение переменной v_name (как character varying) из таблицы scr_pg_vars_tt999
/*
Примеры:
select * from script_pg_vars_table_tmp_create();
select * from public.script_pg_var_as_float_get('А');
select * from public.script_pg_var_as_str_get('Б');
select * from public.script_pg_var_as_str_set('ЮЮЮ', '"Привет, как дела?"');
select * from public.script_pg_var_as_str_get('ЮЮЮ');
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
*/
v_def = str_is_null(v_def);
res = script_pg_vars_table_tmp_val_get(v_name, v_def);
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_var_as_str_get(v_name character varying, v_def character varying) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_var_as_str_get(v_name character varying, v_def character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_var_as_str_get(v_name character varying, v_def character varying) IS 'Получить значение переменной v_name (как character varying) из таблицы scr_pg_vars_tt999';
--
-- Name: script_pg_var_as_str_set(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_var_as_str_set(v_name character varying, v_val character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Добавить (обновить) переменную v_name типа t_propval в таблицу scr_pg_vars_tt999
/*
select * from script_pg_vars_table_tmp_create();
select * from script_pg_var_as_float_set('А', 123);
select * from script_pg_var_as_float_set('Б', 12.777);
select * from script_pg_var_as_str_set('T', 'Эх, ухнем...');
--select * from script_pg_vars_table_tmp_var_add('T', 'Эх, ухнем...', 0);
select * from scr_pg_vars_tt999 order by var_name;
select * from script_pg_vars_table_tmp_drop();
*/
res = false;
v_name = str_is_null(v_name);
IF (v_name <> '') THEN
v_val = str_is_null(v_val);
res = script_pg_vars_table_tmp_var_add(v_name, v_val, 0);
res = bool_is_null(res);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_var_as_str_set(v_name character varying, v_val character varying) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_var_as_str_set(v_name character varying, v_val character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_var_as_str_set(v_name character varying, v_val character varying) IS 'Добавить (обновить) переменную v_name типа t_propval в таблицу scr_pg_vars_tt999';
--
-- Name: script_pg_vars_table_tmp_clear(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_vars_table_tmp_clear() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
/*
Очистить ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)
Пример:
select * from public.script_pg_vars_table_tmp_clear();
*/
res = false;
if table_exist('scr_pg_vars_tt999') then
delete from scr_pg_vars_tt999;
res = true;
end if;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_vars_table_tmp_clear() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_vars_table_tmp_clear(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_vars_table_tmp_clear() IS 'Очистить ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_vars_table_tmp_create(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_vars_table_tmp_create() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
res = false;
/*
Создать ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)
Пример:
select * from public.script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999;
*/
PERFORM public.script_pg_vars_table_tmp_drop();
CREATE temporary TABLE IF NOT EXISTS scr_pg_vars_tt999
(
id serial,
var_name character varying,
var_type integer,
var_val character varying
)
WITHOUT OIDS;
CREATE INDEX scr_pg_vars_tt999_var_name ON scr_pg_vars_tt999(var_name);
res = true;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_vars_table_tmp_create() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_vars_table_tmp_create(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_vars_table_tmp_create() IS 'Создать ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_vars_table_tmp_drop(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_vars_table_tmp_drop() RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
/*
Удалить ВРЕМЕННУЮ таблицу scr_pg_vars_tt999, используемую в интерпретаторе скриптов (для скриптов типа pg)
Пример:
select * from public.script_pg_vars_table_tmp_drop();
*/
drop table if exists scr_pg_vars_tt999;
res = true;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_vars_table_tmp_drop() OWNER TO postgres;
--
-- Name: FUNCTION script_pg_vars_table_tmp_drop(); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_vars_table_tmp_drop() IS 'Удалить ВРЕМЕННУЮ таблицу scr_pg_vars_tt999 (текст скрипта), используемую в интерпретаторе скриптов (для скриптов типа pg)';
--
-- Name: script_pg_vars_table_tmp_val_get(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_vars_table_tmp_val_get(v_name character varying, v_def character varying DEFAULT ''::character varying) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
BEGIN
-- Получить значение переменной v_name в таблице scr_pg_vars_tt999
/*
Примеры:
select * from public.script_pg_vars_table_tmp_create();
select * from scr_pg_vars_tt999;
select * from public.script_pg_vars_table_tmp_val_get('А');
select * from public.script_pg_vars_table_tmp_val_get('Б');
select * from public.script_pg_vars_table_tmp_val_get('Ы', '12345');
select * from scr_pg_vars_tt999 order by var_name;
*/
v_def = str_is_null(v_def);
res = v_def;
v_name = str_is_null(v_name);
IF (v_name <> '') THEN
v_name = upper(v_name);
select var_val into res from scr_pg_vars_tt999 where upper(var_name) = v_name;
IF (res is null) THEN res = v_def; END IF;
END IF;
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_vars_table_tmp_val_get(v_name character varying, v_def character varying) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_vars_table_tmp_val_get(v_name character varying, v_def character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_vars_table_tmp_val_get(v_name character varying, v_def character varying) IS 'Прочитать значение переменной v_name из таблицы scr_pg_vars_tt999';
--
-- Name: script_pg_vars_table_tmp_var_add(character varying, character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_vars_table_tmp_var_add(v_name character varying, v_val character varying DEFAULT ''::character varying, v_type integer DEFAULT 2) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
vvv character varying;
BEGIN
/*
Добавить (обновить) переменную v_name типа v_type (со значением v_val) в таблицу scr_pg_vars_tt999
v_name - имя (идентификатор) переменной
v_val - значение переменной
v_type - тип переменной (0-строка, 2-число)
Примеры:
select * from script_pg_vars_table_tmp_create();
select * from public.script_pg_vars_table_tmp_var_add('А', '123');
select * from public.script_pg_vars_table_tmp_var_add('Б', '12.777');
select * from script_pg_vars_table_tmp_var_add('T', 'Эх, ухнем...', 0);
select * from script_pg_vars_table_tmp_var_add('ЧЧЧЧЧЧ', '"Эх, ухнем..."', 0);
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
*/
res = false;
v_name = str_is_null(v_name);
IF (v_name <> '') THEN
v_name = upper(v_name);
v_type = int_is_null(v_type);
v_val = str_is_null(v_val);
-- -----------------------------
IF (v_type = 2) THEN -- число
IF (v_val = '') THEN v_val = '0.0'; END IF;
IF (its_float(v_val) = true) THEN -- это лишнее, вероятно (позже вернуться)
v_val = public.float_str_normal(v_val);
END IF;
END IF;
-- -----------------------------
select var_name into vvv from scr_pg_vars_tt999 where upper(var_name) = v_name;
vvv = str_is_null(vvv);
IF (vvv = '') THEN
insert into scr_pg_vars_tt999
(
var_name,
var_type,
var_val
)
values
(
v_name,
v_type,
v_val
);
res = true;
ELSE
update
scr_pg_vars_tt999
set
var_type = v_type,
var_val = v_val
where
upper(var_name) = v_name;
res = true;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_vars_table_tmp_var_add(v_name character varying, v_val character varying, v_type integer) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_vars_table_tmp_var_add(v_name character varying, v_val character varying, v_type integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_vars_table_tmp_var_add(v_name character varying, v_val character varying, v_type integer) IS 'Добавить (обновить) переменную v_name типа v_type (со значением v_val) в таблицу scr_pg_vars_tt999';
--
-- Name: script_pg_vars_table_tmp_var_exist(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_vars_table_tmp_var_exist(v_name character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
s character varying;
BEGIN
-- Проверка существования переменной v_name в таблице scr_pg_vars_tt999
/*
select * from script_pg_vars_table_tmp_create();
select * from public.script_pg_var_as_bool_set('Б', 'true');
select * from public.script_pg_vars_table_tmp_var_exist('А');
select * from public.script_pg_vars_table_tmp_var_exist('Б');
select * from public.script_pg_vars_table_tmp_var_exist('б');
select * from scr_pg_vars_tt999 order by var_name;
-- select * from script_pg_vars_table_tmp_drop();
*/
res = false;
v_name = str_is_null(v_name);
IF (v_name <> '') THEN
res = true;
v_name = upper(v_name);
select v_name into s from scr_pg_vars_tt999 where upper(var_name) = v_name;
IF (s is null) THEN res = false; END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_vars_table_tmp_var_exist(v_name character varying) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_vars_table_tmp_var_exist(v_name character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_vars_table_tmp_var_exist(v_name character varying) IS 'Проверка существования переменной v_name в таблице scr_pg_vars_tt999';
--
-- Name: script_pg_vars_table_tmp_var_set(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION script_pg_vars_table_tmp_var_set(v_name character varying, v_val character varying DEFAULT ''::character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
vvv character varying;
yes boolean;
vt integer;
BEGIN
-- Обновить значение переменной v_name в таблице scr_pg_vars_tt999
/*
select * from public.script_pg_vars_table_tmp_var_set('А', 'ыыыыыыыыыыыы');
select * from public.script_pg_vars_table_tmp_var_set('Б', '12.777');
select * from scr_pg_vars_tt999 order by var_name;
*/
res = false;
v_name = str_is_null(v_name);
IF (v_name <> '') THEN
v_name = upper(v_name);
v_val = str_is_null(v_val);
select var_name, var_type into vvv, vt from scr_pg_vars_tt999 where upper(var_name) = v_name;
IF (vvv is not null) THEN
vt = int_is_null(vt);
yes = true;
IF vt=2 THEN -- Число
IF (v_val = '') THEN v_val = '0.0'; END IF;
v_val = float_str_normal(v_val);
IF (its_float(v_val) = false) THEN yes = false; END IF;
END IF;
IF (yes = true) THEN
update
scr_pg_vars_tt999
set
var_val = v_val
where
upper(var_name) = v_name;
res = true;
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.script_pg_vars_table_tmp_var_set(v_name character varying, v_val character varying) OWNER TO postgres;
--
-- Name: FUNCTION script_pg_vars_table_tmp_var_set(v_name character varying, v_val character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION script_pg_vars_table_tmp_var_set(v_name character varying, v_val character varying) IS 'Обновить значение переменной v_name в таблице scr_pg_vars_tt999';
--
-- Name: str_array1_add(text, character varying, character); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_array1_add(sx text, sval character varying, ch character DEFAULT ';'::bpchar) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
ch1 char;
BEGIN
-- Текст, как одномерный массив. Добавить элемент к массиву (в конец массива)
/*
Вх. парам:
sx - Текст (интерпретируемый, как массив)
sval - новое значение
ch - символ-разделитель
Возвр.значение =TRUE - успешно
ВАЖНО:
a) левые и правые пробелы автоматически убираются из sval
b) пустое значение sval игнорируется (не добавляется)
c) значение ch не должен быть пробел (рекомендуется ';' или chr(10))
Примеры:
select * from str_array1_add('','1');
select * from str_array1_add('111','2');
select * from str_array1_add('1;2;3','2');
select * from str_array1_add('1;2;3;','2');
select * from str_array1_add('1;2;3;','');
*/
res = false;
sval = str_is_null(sval);
IF (sval <> '') THEN
sx = str_is_null(sx);
IF (ch is null) THEN ch = ';'; END IF;
IF (ch = ' ') THEN ch = ';'; END IF;
IF (char_length(sx))>0 THEN
ch1 = substring(sx,char_length(sx),1);
IF (ch1<>ch) THEN sx = sx || ch; END IF;
END IF;
sx = sx || sval;
res = true;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_array1_add(sx text, sval character varying, ch character) OWNER TO postgres;
--
-- Name: FUNCTION str_array1_add(sx text, sval character varying, ch character); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_array1_add(sx text, sval character varying, ch character) IS 'Текст, как одномерный массив. Добавить элемент к массиву (в конец массива)';
--
-- Name: str_array1_count(text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_array1_count(sx text, sunchar character varying DEFAULT (chr(10) || ';'::text)) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
res integer;
BEGIN
-- Текст, как одномерный массив. Вычислить кол-во элементов
/*
Вх. парам:
sx - Текст (интерпретируемый, как массив)
sunchar - символы-разделители
Важно! Желательно НЕ использовать пробелы в sunchar
Примеры:
select * from str_array1_count('1;2;3'); -- 3 элемента
select * from str_array1_count('1;2;;;3;;'); -- 3 элемента
select * from str_array1_count('1;2;3',','); -- 1 элемент
*/
res = str_words_count(sx, sunchar);
RETURN res;
END;
$$;
ALTER FUNCTION public.str_array1_count(sx text, sunchar character varying) OWNER TO postgres;
--
-- Name: FUNCTION str_array1_count(sx text, sunchar character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_array1_count(sx text, sunchar character varying) IS 'Текст, как одномерный массив. Вычислить кол-во элементов';
--
-- Name: str_array1_get(text, integer, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_array1_get(sx text, num integer, svaldef character varying DEFAULT ''::character varying, sunchar character varying DEFAULT (chr(10) || ';'::text)) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
BEGIN
-- Текст, как одномерный массив. Получить элемент по номеру
/*
Вх. парам:
sx - Текст (интерпретируемый, как массив)
num - номер элемента (начиная с единицы)
svaldef - значение по умолчанию, если элемент не существует
sunchar - символы-разделители
Важно! Желательно НЕ использовать пробелы в sunchar
Примеры:
select * from str_array1_get('a;b;c', 2);
select * from str_array1_get('a;b;c', 3);
select * from str_array1_get('a;b;c;', 3);
select * from str_array1_get('a;b;c', 4, 'нет данных');
select * from str_array1_get('a;b;c', -1, 'нет данных');
*/
res = str_is_null(svaldef);
num = int_is_null(num);
IF (num>0) THEN
res = str_is_null(str_word_by_num(sx, num, sunchar));
IF (res = '') THEN res = str_is_null(svaldef); END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_array1_get(sx text, num integer, svaldef character varying, sunchar character varying) OWNER TO postgres;
--
-- Name: FUNCTION str_array1_get(sx text, num integer, svaldef character varying, sunchar character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_array1_get(sx text, num integer, svaldef character varying, sunchar character varying) IS 'Текст, как одномерный массив. Получить элемент по номеру';
--
-- Name: str_as_bigint(character varying, bigint); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_as_bigint(v character varying, v_def bigint DEFAULT 0) RETURNS bigint
LANGUAGE plpgsql
AS $$
DECLARE res bigint;
BEGIN
-- Конвертировать строку в bigint
-- select * from public.str_as_bigint('125', -99);
-- select * from public.str_as_bigint('a125', -99);
-- select * from public.str_as_bigint('125.', -99);
-- select * from public.str_as_bigint('.125', -99);
-- select * from public.str_as_bigint('1.25', -99);
-- select * from public.str_as_bigint('1,25', -99);
v_def = bigint_is_null(v_def);
res = v_def;
v = str_is_null(v);
IF (its_bigint(v) = true) THEN
res = cast(v as bigint);
END IF;
res = bigint_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.str_as_bigint(v character varying, v_def bigint) OWNER TO postgres;
--
-- Name: FUNCTION str_as_bigint(v character varying, v_def bigint); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_as_bigint(v character varying, v_def bigint) IS 'Конвертировать строку в bigint';
--
-- Name: str_as_bool(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_as_bool(v character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE res boolean;
BEGIN
-- Конвертировать строку в boolean
/*
select * from str_as_bool('да');
select * from str_as_bool('Д');
select * from str_as_bool('+');
select * from str_as_bool('Y');
select * from str_as_bool(null);
select * from str_as_bool('Привет');
*/
res = false;
v = upper(str_is_null(v));
if (v = '.T.') THEN res = true; END IF;
if (v = 'T') THEN res = true; END IF;
if (v = 'TRUE') THEN res = true; END IF;
if (v = 'Y') THEN res = true; END IF;
if (v = 'YES') THEN res = true; END IF;
if (v = 'YE') THEN res = true; END IF;
if (v = '1') THEN res = true; END IF;
if (v = '+') THEN res = true; END IF;
if (v = 'OK') THEN res = true; END IF;
if (v = 'Д') THEN res = true; END IF;
if (v = 'ДА') THEN res = true; END IF;
if (v = 'ИСТИНА') THEN res = true; END IF;
if (v = 'И') THEN res = true; END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_as_bool(v character varying) OWNER TO postgres;
--
-- Name: FUNCTION str_as_bool(v character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_as_bool(v character varying) IS 'Конвертировать строку в boolean';
--
-- Name: str_as_float(character varying, double precision); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_as_float(v character varying, v_def double precision DEFAULT 0.0) RETURNS double precision
LANGUAGE plpgsql
AS $$
DECLARE res double precision;
BEGIN
-- Конвертировать строку в double precision
-- select * from public.str_as_float('1.125', -99);
-- select * from public.str_as_float('a1.125', -99);
v_def = float_is_null(v_def);
res = v_def;
v = str_is_null(v);
IF (its_float(v)) THEN
res = cast(v as double precision);
END IF;
res = float_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.str_as_float(v character varying, v_def double precision) OWNER TO postgres;
--
-- Name: FUNCTION str_as_float(v character varying, v_def double precision); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_as_float(v character varying, v_def double precision) IS 'Конвертировать строку в double precision';
--
-- Name: str_as_int(character varying, integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_as_int(v character varying, v_def integer DEFAULT 0) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE res integer;
BEGIN
-- Конвертировать строку в integer
-- select * from public.str_as_int('125', -99);
-- select * from public.str_as_int('a125', -99);
v_def = int_is_null(v_def);
res = v_def;
v = str_is_null(v);
IF (its_integer(v)) THEN
res = cast(v as integer);
END IF;
res = int_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.str_as_int(v character varying, v_def integer) OWNER TO postgres;
--
-- Name: FUNCTION str_as_int(v character varying, v_def integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_as_int(v character varying, v_def integer) IS 'Конвертировать строку в integer';
--
-- Name: str_build_left(text, integer, character); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_build_left(sx text, newsize integer, ch character DEFAULT '0'::bpchar) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
yes99 boolean;
BEGIN
/*
Нарастить входную строку заданными символами до заданного размера слева
sx - входня строка
newsize - новый размер строки
ch - символы, которыми "наращивается строка"
Пример вызова:
select str_build_left ('3',5,'0'); -- Результат: 00003
select str_build_left ('3',10,'-'); -- Результат: ---------3
select str_build_left ('Привет',10,'='); -- Результат: ====Привет
select str_build_left ('',10,' ');
*/
sx = str_is_null(sx);
res = sx;
newsize = int_is_null(newsize);
IF (newsize > 0) THEN
yes99 = false;
IF (ch IS NULL) THEN ch =' '; END IF;
IF (ch = ' ') THEN
ch = '|';
yes99 = true;
END IF;
WHILE (CHAR_LENGTH(res) < newsize) LOOP
res = ch || res;
END LOOP;
IF (yes99 = true) THEN
res = replace(res,'|',' ');
END IF;
END IF;
res = str_is_null(res,'',false);
RETURN res;
END;
$$;
ALTER FUNCTION public.str_build_left(sx text, newsize integer, ch character) OWNER TO postgres;
--
-- Name: FUNCTION str_build_left(sx text, newsize integer, ch character); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_build_left(sx text, newsize integer, ch character) IS 'Нарастить входную строку заданными символами до заданного размера слева';
--
-- Name: str_build_right(text, integer, character); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_build_right(sx text, newsize integer, ch character DEFAULT '0'::bpchar) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
yes99 boolean;
BEGIN
/*
Нарастить входную строку заданными символами до заданного размера справа sx - входная строка
newsize - новый размер строки
ch - символы, которыми "наращивается строка"
Пример вызова:
select str_build_right ('3',5,'0');
Результат: 30000
*/
sx = str_is_null(sx);
res = sx;
newsize = int_is_null(newsize);
IF (newsize > 0) THEN
IF (ch IS NULL) then ch =' '; END IF;
IF (ch = ' ') THEN
ch = '|';
yes99 = true;
END IF;
WHILE (CHAR_LENGTH(res) < newsize) LOOP
res = res || ch;
END LOOP;
IF (yes99 = true) THEN
res = replace(res,'|',' ');
END IF;
END IF;
res = str_is_null(res);
RETURN res;
END;
$$;
ALTER FUNCTION public.str_build_right(sx text, newsize integer, ch character) OWNER TO postgres;
--
-- Name: FUNCTION str_build_right(sx text, newsize integer, ch character); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_build_right(sx text, newsize integer, ch character) IS 'Нарастить входную строку заданными символами до заданного размера справа';
--
-- Name: str_char1_trim(character varying, character, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_char1_trim(s character varying, ch character DEFAULT '"'::bpchar, yes_trim_after boolean DEFAULT true) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
chx char;
BEGIN
/*
Удалить из строки по одному крайнему символу, если они соответствуют заданному
Примеры:
select * from public.str_char1_trim('"12345"', '"');
select * from public.str_char1_trim('""12345""', '"');
select * from public.str_char1_trim('""12345"', '"');
select * from public.str_char1_trim('"12345""', '"');
select * from public.str_char1_trim('12345""', '"');
select * from public.str_char1_trim('""12345', '"');
*/
res = str_is_null(s);
IF (res <> '') THEN
IF (ch is null) THEN ch = '"'; END IF;
chx = substr(res , 1, 1);
IF (chx = ch) THEN
res = btrim(substr(res, 2, char_length(res)));
END IF;
IF (res <> '') THEN
chx = substr(res , char_length(res), 1);
IF (chx = ch) THEN
res = btrim(substr(res, 1, char_length(res)-1));
END IF;
END IF;
END IF;
yes_trim_after = bool_is_null(yes_trim_after);
IF (yes_trim_after = true) THEN
res = str_is_null(res);
ELSE
IF (res is null) THEN res = ''; END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_char1_trim(s character varying, ch character, yes_trim_after boolean) OWNER TO postgres;
--
-- Name: FUNCTION str_char1_trim(s character varying, ch character, yes_trim_after boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_char1_trim(s character varying, ch character, yes_trim_after boolean) IS 'Удалить из строки по одному крайнему символу, если они соответствуют заданному';
--
-- Name: str_is_null(text, text, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_is_null(sx text, sdef text DEFAULT ''::text, yestrim boolean DEFAULT true) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
BEGIN
-- Контроль значения типа TEXT (проверка на NULL и замена NULL на значение по умолчанию)
/*
Примеры:
select * from str_is_null(' 123 ');
select * from str_is_null(' 123 ', '', false);
select * from str_is_null(null);
select * from str_is_null(null, ' 567 ');
select * from str_is_null(null, ' 567 ', false);
*/
res = sx;
IF (res is NULL) THEN
IF (sdef is NULL) THEN sdef=''; END IF;
res = sdef;
END IF;
IF (res <> '') THEN
yestrim = bool_is_null(yestrim);
IF (yestrim = TRUE) THEN res = btrim(res); END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_is_null(sx text, sdef text, yestrim boolean) OWNER TO postgres;
--
-- Name: FUNCTION str_is_null(sx text, sdef text, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_is_null(sx text, sdef text, yestrim boolean) IS 'Контроль значения типа TEXT (проверка на NULL и замена NULL на значение по умолчанию)';
--
-- Name: str_is_null(character varying, character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_is_null(sx character varying, sdef character varying DEFAULT ''::character varying, yestrim boolean DEFAULT true) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
BEGIN
-- Контроль значения типа varchar (проверка на NULL и замена NULL на значение по умолчанию)
/*
Примеры:
select * from str_is_null(' 123 ');
select * from str_is_null(' 123 ', '', false);
select * from str_is_null(null);
select * from str_is_null(null, ' 567 ');
select * from str_is_null(null, ' 567 ', false);
*/
res = sx;
IF (res is NULL) THEN
IF (sdef is NULL) THEN sdef=''; END IF;
res = sdef;
END IF;
IF (res <> '') THEN
yestrim = bool_is_null(yestrim);
IF (yestrim = TRUE) THEN res = btrim(res); END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_is_null(sx character varying, sdef character varying, yestrim boolean) OWNER TO postgres;
--
-- Name: FUNCTION str_is_null(sx character varying, sdef character varying, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_is_null(sx character varying, sdef character varying, yestrim boolean) IS 'Контроль значения типа varchar (проверка на NULL и замена NULL на значение по умолчанию)';
--
-- Name: str_replace(character varying, character varying, character, character); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_replace(sx character varying, unchars character varying DEFAULT ' '::character varying, char_repl character DEFAULT '_'::bpchar, char_xz character DEFAULT '|'::bpchar) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
i integer;
yes99 boolean;
m integer;
k integer;
ch char(1);
res character varying;
BEGIN
/*
Замена в строке sx символов, перечисленных в unchars (типа: множество символов), на символ char_repl
Вх. параметры:
sx - входная строка;
unchars - перечень НеСимволов (аналог множества символов);
char_repl - замещающий символ;
char_xz - символ, "компенсирующий" пробел в unchars.
ВАЖНО!!! Среди символов unchars не должно быть символа char_xz и, кроме этого, нельзя, чтобы char_xz = ' '.
Пример:
select * from str_replace('Привет, как дела ?', ' ,?', '_'); -- Привет__как_дела__
select * from str_replace('Привет, как дела ? | А у тебя?', '| ,?', '_'); -- Привет__как_дела___|_А_у_тебя_
select * from str_replace('Привет, как дела ? | А у тебя?', '| ,?', '_', '\'); -- Привет__как_дела_____А_у_тебя_
select * from str_replace(btrim(' Привет, как дела ? | А у тебя?' ), '| ,?', '_', '\'); -- Привет__как_дела_____А_у_тебя_
*/
res = '';
IF (sx is NULL) THEN sx = ''; END IF;
IF (sx <> '') THEN
res = sx;
IF (unchars is NULL) THEN unchars = ''; END IF;
m = char_length(unchars);
IF (m>0) THEN
IF (char_xz is NULL) THEN char_xz = '|'; END IF;
unchars = replace(unchars,' ',char_xz);
IF (char_repl is NULL) THEN char_repl = '_'; END IF;
i = 0;
WHILE i<m LOOP
i = i + 1;
ch = substring(unchars,i,1);
IF (ch = char_xz) THEN
res = replace(res, ' ', char_repl);
ELSE
res = replace(res, ch, char_repl);
END IF;
END LOOP;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_replace(sx character varying, unchars character varying, char_repl character, char_xz character) OWNER TO postgres;
--
-- Name: FUNCTION str_replace(sx character varying, unchars character varying, char_repl character, char_xz character); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_replace(sx character varying, unchars character varying, char_repl character, char_xz character) IS 'Замена в строке sx символов, перечисленных в unchars (типа: множество символов), на символ char_repl';
--
-- Name: str_reverse(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_reverse(sx character varying) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
BEGIN
/*
Инвертирвать строку sx
Пример:
select * from str_reverse(null);
select * from str_reverse('Привет, как дела ?');
select * from str_reverse(str_reverse('Привет, как дела ?'));
select * from str_reverse(' Привет, как дела ?');
select * from str_reverse(' Привет, как дела ? ');
select * from str_reverse(str_reverse(' Привет, как дела ? '));
*/
sx = str_is_null(sx,'',false);
res = reverse(sx);
RETURN res;
END;
$$;
ALTER FUNCTION public.str_reverse(sx character varying) OWNER TO postgres;
--
-- Name: FUNCTION str_reverse(sx character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_reverse(sx character varying) IS 'Инвертирвать строку sx';
--
-- Name: str_sets_intersect(text, text, character, character, boolean, character); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_sets_intersect(set1 text, set2 text, sep_left character DEFAULT '['::bpchar, sep_right character DEFAULT ']'::bpchar, yes_upper boolean DEFAULT true, sxrenovina character DEFAULT '`'::bpchar) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
i integer;
c integer;
sxrenovina char;
s character varying;
res boolean;
BEGIN
/*
Проверка пересечения 2-х множеств, заданных в виде строк символов
Параметры:
set1 - множество 1;
set2 - множество 2;
sep_left - разделитель элементов множества слева;
sep_right - разделитель элементов множества справа;
yes_upper - игнорировать регистр символов.
Важно!
1. Очевидно, что элементы множества НЕ должны содержать разделителей;
2. Полное равенство строк (set1 и set2) считается пересечением (включая и пустые строки).
3. Символ sxrenovina НЕ должен присутствовать среди символов в: set1, set2, sep_left, sep_right
Возвращаемое значение: TRUE, если множества пересекаются. FALSE в противном случае
Примеры:
select * from str_sets_intersect('[1][3679][3680]', '[3680]'); -- true
select * from str_sets_intersect('[1][3679][3680]', '[3680][100]'); -- true
select * from str_sets_intersect('[1][3679][3680]', '[3681][100]'); -- false
select * from str_sets_intersect('[1]', '[3680]'); -- false
select * from str_sets_intersect('[1]', '[1][3680]'); -- true
select * from str_sets_intersect('[ 1]', '[1][3680]'); -- false
select * from str_sets_intersect('[1]' || chr(10) || '[3679]' || chr(10) || '[3680]', '[15][3680]'); -- true
select * from str_sets_intersect('[1]' || chr(10) || '[3679]' || chr(10) || chr(13) || chr(9) || '[3680]', '[15]' || chr(10) || '[3685]' || chr(10) || '[3679]'); -- true
*/
res = false;
set1 = str_is_null(set1);
set2 = str_is_null(set2);
yes_upper = bool_is_null(yes_upper);
IF (yes_upper = TRUE) THEN
set1 = upper(set1);
set2 = upper(set2);
END IF;
IF (set1 = set2) THEN
res = true;
ELSE
IF (sep_left is null) THEN sep_left = '['; END IF;
IF (sep_right is null) THEN sep_right = ']'; END IF;
IF (sxrenovina is null) THEN sxrenovina = '`'; END IF;
c = str_words_count(set1, sep_left || sep_right, false, sxrenovina);
IF (c>0) THEN
i = 0;
WHILE i<c LOOP
i = i + 1;
s = str_word_by_num(set1, i, sep_left || sep_right, false, sxrenovina);
IF (s <> '') THEN
s = sep_left || s || sep_right;
IF (position(s in set2)>0) THEN
res = true;
i = c+1;
END IF;
END IF;
END LOOP;
END IF;
END IF;
RETURN Res;
END;
$$;
ALTER FUNCTION public.str_sets_intersect(set1 text, set2 text, sep_left character, sep_right character, yes_upper boolean, sxrenovina character) OWNER TO postgres;
--
-- Name: FUNCTION str_sets_intersect(set1 text, set2 text, sep_left character, sep_right character, yes_upper boolean, sxrenovina character); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_sets_intersect(set1 text, set2 text, sep_left character, sep_right character, yes_upper boolean, sxrenovina character) IS 'Проверка пересечения 2-х множеств, заданных в виде строк символов';
--
-- Name: str_ultrasimple_code(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_ultrasimple_code(sx text) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
sn character varying;
i integer;
m integer;
n integer;
ch char(1);
BEGIN
/*
Ультра простой (и ультра "неэкономичный") алгоритм шифрования текста
Пример вызова:
select str_ultrasimple_code ('Как дела?'); -- "813 7231 8331 2331 1331 99- 7331 7231 5031"
select str_ultrasimple_code ('Привет, как дела? Нормально...'); -- 103 103 103 1431 0431 5531 8331 7231 9331 3431 1431 8031 99- 813 7231 8331 2331 1331 99- 7331 7231 7331 99- 992 5431 2331 9231 5331 3431 0131
*/
res = '';
IF (sx is not null) THEN
IF (sx <> '') THEN
sx = reverse(sx);
m = char_length(sx);
i = 0;
WHILE i<m LOOP
i = i + 1;
ch = substring(sx,i,1);
IF (ch <> ' ') THEN
n = ascii(ch);
n = n + 255;
ELSE
n = -99;
END IF;
sn = int_as_str(n);
sn = reverse(sn);
res = res || sn || ' ';
END LOOP;
res = str_is_null(res);
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_ultrasimple_code(sx text) OWNER TO postgres;
--
-- Name: FUNCTION str_ultrasimple_code(sx text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_ultrasimple_code(sx text) IS 'УльтраУльтра простой (и ультра "неэкономичный") алгоритм шифрования текста';
--
-- Name: str_ultrasimple_decode(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_ultrasimple_decode(sx text) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
sn character varying;
n1 integer;
n2 integer;
ch char(1);
BEGIN
/*
Алгоритм расшифровки текста, зашифрованного функцией str_ultrasimple_code()
Пример вызова:
select str_ultrasimple_decode ('813 7231 8331 2331 1331 99- 7331 7231 5031'); -- "Как дела?"
select str_ultrasimple_decode ('103 103 103 1431 0431 5531 8331 7231 9331 3431 1431 8031 99- 813 7231 8331 2331 1331 99- 7331 7231 7331 99- 992 5431 2331 9231 5331 3431 0131'); -- "Привет, как дела? Нормально..."
select str_ultrasimple_decode(str_ultrasimple_code('Привет, как дела? Нормально...')); -- "Привет, как дела? Нормально..." ;
select
str_ultrasimple_decode
(
str_ultrasimple_code
(
'Прошло немало лет с тех пор как компьютеры появились в школе и дома.
В школе вы изучаете с их помощью информатику (что полезно), а дома он служит вам партнёром для игр (что приятно).
А цель этой книги - показать, как можно сочетать приятное с полезным, то есть использовать компьютер при изучении школьной программы.
В этой книге вы найдёте несколько десятков уроков по разным школьным предметам. И уроки эти не простые, а занимательные!
Поэтому на каждом уроке мы будем пи-сать интересные компьютерные программы.
'
)
);
*/
res = '';
sx = str_is_null(sx);
IF (sx <> '') THEN
IF (sx <> '') THEN
sx = sx || chr(32);
sn = '';
n1 = 1;
WHILE (n1>0) LOOP
n1 = strpos(sx, chr(32));
IF (n1>0) THEN
sn = str_is_null(substr(sx, 1, n1));
sn = reverse(sn);
n2 = str_as_int(sn);
IF (n2>0) THEN
n2 = n2 - 255;
ch = chr(n2);
res = res || ch;
ELSE
res = res || chr(32);
END IF;
sx = str_is_null(substr(sx, n1, char_length(sx)));
END IF;
END LOOP;
sx = str_is_null(sx);
IF (sx <> '') THEN
sn = sx;
sn = reverse(sn);
n2 = str_as_int(sn);
IF (n2>0) THEN
n2 = n2 - 255;
ch = chr(n2);
res = res || ch;
ELSE
res = res || chr(32);
END IF;
END IF;
res = str_is_null(res);
res = reverse(res);
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_ultrasimple_decode(sx text) OWNER TO postgres;
--
-- Name: FUNCTION str_ultrasimple_decode(sx text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_ultrasimple_decode(sx text) IS 'Алгоритм расшифровки текста, зашифрованного функцией str_ultrasimple_code()';
--
-- Name: str_word_by_num(text, integer, character varying, boolean, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_word_by_num(sx text, num integer, sunchar character varying DEFAULT ' '::character varying, yestrimbefore boolean DEFAULT true, sxrenovina character varying DEFAULT '|'::character varying) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
i integer;
k integer;
m integer;
nword integer;
inword boolean;
yesexit boolean;
ch char(1);
res text;
BEGIN
/*
Получить слово из строки по его номеру.
Алгоритм, мягко говоря, не быстрый
Разделителями слов могут быть любые символы из sUnChar
Параметры:
sx - входная строка;
num - номер слова в строке;
sunchar - НеСимволы. Строка (типа - множество НеСимволов);
yestrimbefore - если TRUE, то перед обработкой удаляются НеСимволы слева и справа в Sx
sxrenovina - символ, на который заменяются пробелы (следствие НеЯсности для меня работы функций substring, position). Такого символа в принципе не должно быть в строке
Возвращаемое значение: слово по его номеру
Примеры:
select str_word_by_num(' ,,,1, ;;; 2, 3', 3, ' ,'); -- 2
select * from str_word_by_num('1,2a ;3', 2, ';, '); -- 2a
select * from str_word_by_num('1,2 ;3', 2, ','); -- 2 ;3
select * from str_word_by_num('1,2 ;3', 2, ';3' ); -- пустая строка
select * from str_word_by_num('1,2 ;3', 2, ' ' ); -- ;3
select * from str_word_by_num('1, 2 ;3', 2, ' ' ); -- 2
*/
res = '';
IF (sx is NULL) THEN sx = ''; END IF;
IF (sunchar is NULL) THEN sunchar = ' '; END IF;
yestrimbefore = bool_is_null(yestrimbefore);
IF (yestrimbefore) THEN
sx = btrim(sx,sunchar);
END IF;
m = char_length(sx);
IF (m>0) THEN
IF (char_length(sunchar)>0) THEN
-- **************************************
-- Это - на предмет НеЧеткости описАния и работы какой-то из функций: substring, position
IF (sxrenovina is NULL) THEN sxrenovina = ''; END IF;
IF char_length(sxrenovina)>0 THEN
k = position(' ' in sunchar);
IF k<=0 THEN
sx = replace(sx,' ',sxrenovina);
END IF;
END IF;
-- **************************************
yesexit = false;
nword = 0;
inword = false;
i = 0;
WHILE i<m LOOP
i = i + 1;
IF (not yesexit) THEN
ch = substring(sx,i,1);
k = position(ch in sunchar);
IF k<=0 THEN
IF (NOT inword) THEN nword = nword+1; END IF;
inword = true;
ELSE
inword = false;
IF (nword>=num) THEN
yesexit = true; -- Выход из цикла
END IF;
END IF;
IF (inword) THEN
IF (nword=num) THEN
res = res || ch;
END IF;
END IF;
END IF;
END LOOP;
res = replace(res, sxrenovina, ' ');
ELSE
res = sx;
END IF;
END IF;
IF (res is NULL) THEN res = ''; END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_word_by_num(sx text, num integer, sunchar character varying, yestrimbefore boolean, sxrenovina character varying) OWNER TO postgres;
--
-- Name: FUNCTION str_word_by_num(sx text, num integer, sunchar character varying, yestrimbefore boolean, sxrenovina character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_word_by_num(sx text, num integer, sunchar character varying, yestrimbefore boolean, sxrenovina character varying) IS 'Получить слово из строки по его номеру';
--
-- Name: str_words_count(text, character varying, boolean, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION str_words_count(sx text, sunchar character varying DEFAULT ' '::character varying, yestrimbefore boolean DEFAULT true, sxrenovina character varying DEFAULT '|'::character varying) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
i integer;
k integer;
m integer;
inword boolean;
ch char(1);
res integer;
BEGIN
/*
Вычислить кол-во слов в строке Sx.
Разделителями слов могут быть любые символы из sUnChar
Параметры:
sx - входная строка;
sunchar - НеСимволы. Строка (типа - множество НеСимволов);
yestrimbefore - если TRUE, то перед обработкой удаляются НеСимволы слева и справа в Sx
sxrenovina - подстрока, на которую заменяются пробелы (следствие НеЯсности для меня работы функций substring, position). Такого символа в принципе не должно быть в строке
Возвращаемое значение: кол-во слов (integer)
Примеры:
select str_words_count(' ,,,1, ;;; 2, 3', ' ,'); -- 4 слова
select * from str_words_count('1,2 ;3', ';, '); -- 3 слова
select * from str_words_count('1,2 ;3', ','); -- 2 слова
select * from str_words_count('1,2 ;3', ';3' ); -- 1 слово
select * from str_words_count('1,2 ;3', ' ' ); -- 2 слова
select * from str_words_count('1, 2 ;3', ' ' ); -- 3 слова
select * from str_words_count('1, ;;; 2,,,, ; 3', ',;' ); -- 5 слов
select * from str_words_count('1, ;;; 2,,,, ; 3', ', ;' ); -- 3 слова
*/
res = 0;
IF (sx is NULL) THEN sx = ''; END IF;
IF (sunchar is NULL) THEN sunchar = ' '; END IF;
yestrimbefore = bool_is_null(yestrimbefore);
IF (yestrimbefore) THEN
sx = btrim(sx,sunchar);
END IF;
m = char_length(sx);
IF (m>0) THEN
IF (char_length(sunchar)>0) THEN
-- **************************************
-- Это - на предмет НеЧеткости описАния и работы какой-то из функций: substring, position
IF (sxrenovina is NULL) THEN sxrenovina = ''; END IF;
IF char_length(sxrenovina)>0 THEN
k = position(' ' in sunchar);
IF k<=0 THEN
sx = replace(sx,' ',sxrenovina);
END IF;
END IF;
-- **************************************
res = 0;
inword = false;
i = 0;
WHILE i<m LOOP
i = i + 1;
ch = substring(sx,i,1);
k = position(ch in sunchar);
IF k<=0 THEN
IF (NOT inword) THEN res = res+1; END IF;
inword = true;
ELSE
inword = false;
END IF;
END LOOP;
ELSE
res = 1;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.str_words_count(sx text, sunchar character varying, yestrimbefore boolean, sxrenovina character varying) OWNER TO postgres;
--
-- Name: FUNCTION str_words_count(sx text, sunchar character varying, yestrimbefore boolean, sxrenovina character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION str_words_count(sx text, sunchar character varying, yestrimbefore boolean, sxrenovina character varying) IS 'Вычислить кол-во слов в строке';
--
-- Name: table_exist(integer, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_exist(ifixparam integer, tn_full character varying, tabletype character varying DEFAULT ''::character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
tableschema character varying;
sqltext text;
sx character varying;
BEGIN
-- Проверить существование таблицы БД tn_full (полное имя таблицы)
/*
Для временных таблиц:
tabletype = 'LOCAL TEMPORARY'
Для таблиц:
tabletype = 'BASE TABLE'
Если значение tabletype не задано, то оно вычисляется автоматически - в зависимости от tableschema
Примеры:
-- .....................................................
select * from table_exist(-1, 'dir.statements_list');
-- .....................................................
-- .....................................................
select * from table_tmp_create('a333', 'CREATE temporary TABLE IF NOT EXISTS a333 (id serial, nav_namemax t_namemax); CREATE INDEX a333_id ON a333(id);');
select * from a333;
select * from table_exist(-1, 'a333')
select * from table_exist(-1, 'a333aaa')
select * from public.table_tmp_drop('a333');
-- .....................................................
*/
res = false;
tn_full = str_is_null(tn_full);
IF (tn_full <> '') THEN
tableschema = '';
IF (position('.' in tn_full))>0 THEN
tableschema = str_is_null(str_word_by_num(tn_full, 1, '.'));
tn_full = str_is_null(str_word_by_num(tn_full, 2, '.'));
END IF;
res = table_exist(tn_full, tableschema, tabletype);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_exist(ifixparam integer, tn_full character varying, tabletype character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_exist(ifixparam integer, tn_full character varying, tabletype character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_exist(ifixparam integer, tn_full character varying, tabletype character varying) IS 'Проверить существование таблицы БД tn_full (полное имя таблицы)';
--
-- Name: table_exist(character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_exist(tablename character varying, tableschema character varying DEFAULT ''::character varying, tabletype character varying DEFAULT ''::character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sqltext text;
sx character varying;
BEGIN
-- Проверить существование таблицы БД
/*
Для временных таблиц:
tableschema - пустая строка
tabletype = 'LOCAL TEMPORARY'
Для таблиц:
tabletype = 'BASE TABLE'
Если значение tabletype не задано, то оно вычисляется автоматически - в зависимости от tableschema
Примеры:
-- .....................................................
select * from table_exist('statements_list', 'dir', 'BASE TABLE');
select * from table_exist('statements_list', 'dir');
-- .....................................................
-- .....................................................
select * from table_tmp_create('a333', 'CREATE temporary TABLE IF NOT EXISTS a333 (id serial, nav_namemax t_namemax); CREATE INDEX a333_id ON a333(id);');
select * from a333;
select * from table_exist('a333')
select * from public.table_tmp_drop('a333');
-- .....................................................
*/
res = false;
tablename = str_is_null(tablename);
IF (tablename <> '') THEN
tableschema = str_is_null(tableschema);
tabletype = upper(str_is_null(tabletype));
IF (tabletype = '') THEN
IF (tableschema <> '') THEN
tabletype='BASE TABLE';
ELSE
tabletype='LOCAL TEMPORARY';
END IF;
END IF;
sqltext = 'select table_name from information_schema.tables where ';
sqltext = sqltext || '(upper(table_name)= upper(' || q39_lr(upper(tablename)) || '))';
sqltext = sqltext || ' and ';
sqltext = sqltext || '(upper(table_type)= upper(' || q39_lr(upper(tabletype)) || '))';
IF (tableschema <> '') THEN
sqltext = sqltext || ' and ';
sqltext = sqltext || '(upper(table_schema)= upper(' || q39_lr(upper(tableschema)) || '))';
END IF;
sx = str_is_null(exec_to_str(sqltext));
IF (upper(sx) = upper(tablename)) THEN res = true; END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_exist(tablename character varying, tableschema character varying, tabletype character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_exist(tablename character varying, tableschema character varying, tabletype character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_exist(tablename character varying, tableschema character varying, tabletype character varying) IS 'Проверить существование таблицы БД';
--
-- Name: table_field_value_as_bigint_get(character varying, character varying, text, bigint, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_bigint_get(tn character varying, fn character varying, sfilter text, vdef bigint DEFAULT 0, sorderby character varying DEFAULT ''::character varying) RETURNS bigint
LANGUAGE plpgsql
AS $$
DECLARE
res bigint;
sres text;
BEGIN
-- Получить значение поля fn (как bigint) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
-- select * from table_field_value_as_bigint_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
vdef = bigint_is_null(vdef);
sres = table_field_value_as_text_get(tn, fn, sfilter, bigint_as_str(vdef), sorderby, true);
res = str_as_bigint(sres,vdef);
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_bigint_get(tn character varying, fn character varying, sfilter text, vdef bigint, sorderby character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_bigint_get(tn character varying, fn character varying, sfilter text, vdef bigint, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_bigint_get(tn character varying, fn character varying, sfilter text, vdef bigint, sorderby character varying) IS 'Получить значение поля fn (как bigint) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';
--
-- Name: table_field_value_as_bigint_set(character varying, character varying, text, bigint); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_bigint_set(tn character varying, fn character varying, sfilter text, val_new bigint) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sql_text text;
BEGIN
-- Записать значение val_new (integer) в поле fn таблицы tn для фильтра sfilter
-- select * from table_field_value_as_bigint_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
-- select * from table_field_value_as_bigint_set('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'), 31);
-- select * from table_field_value_as_bigint_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
-- select * from table_field_value_as_bigint_set('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'), 30);
-- select * from table_field_value_as_bigint_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
res = false;
tn = str_is_null(tn);
IF (tn <> '') THEN
fn = str_is_null(fn);
IF (fn <> '') THEN
sfilter = str_is_null(sfilter);
IF (sfilter <> '') THEN
val_new = bigint_is_null(val_new);
sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
res = public.exec_sql_text(sql_text);
res = public.bool_is_null(res);
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_bigint_set(tn character varying, fn character varying, sfilter text, val_new bigint) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_bigint_set(tn character varying, fn character varying, sfilter text, val_new bigint); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_bigint_set(tn character varying, fn character varying, sfilter text, val_new bigint) IS 'Записать значение val_new (integer) в поле fn таблицы tn для фильтра sfilter';
--
-- Name: table_field_value_as_bool_get(character varying, character varying, text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_bool_get(tn character varying, fn character varying, sfilter text, sorderby character varying DEFAULT ''::character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sres text;
BEGIN
-- Получить значение поля fn (как boolean) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
-- select * from table_field_value_as_bool_get('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
sres = table_field_value_as_text_get(tn, fn, sfilter, bool_as_str(false), sorderby, true);
res = str_as_bool(sres);
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_bool_get(tn character varying, fn character varying, sfilter text, sorderby character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_bool_get(tn character varying, fn character varying, sfilter text, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_bool_get(tn character varying, fn character varying, sfilter text, sorderby character varying) IS 'Получить значение поля fn (как boolean) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';
--
-- Name: table_field_value_as_bool_invert(character varying, character varying, text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_bool_invert(tn character varying, fn character varying, sfilter text, sorderby character varying DEFAULT ''::character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
v boolean;
BEGIN
-- Инвертировать поле fn (boolean) в таблице tn для фильтра sfilter
/*
select * from table_field_value_as_bool_get('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
select * from table_field_value_as_bool_invert('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
select * from table_field_value_as_bool_get('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
select * from table_field_value_as_bool_invert('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
select * from table_field_value_as_bool_get('dir.props_list', 'yes_edit', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
*/
res = false;
v = table_field_value_as_bool_get(tn, fn, sfilter, sorderby);
IF (v = true) THEN
v = false;
ELSE
v = true;
END IF;
res = table_field_value_as_bool_set(tn, fn, sfilter, v);
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_bool_invert(tn character varying, fn character varying, sfilter text, sorderby character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_bool_invert(tn character varying, fn character varying, sfilter text, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_bool_invert(tn character varying, fn character varying, sfilter text, sorderby character varying) IS 'Инвертировать поле fn (boolean) в таблице tn для фильтра sfilter';
--
-- Name: table_field_value_as_bool_set(character varying, character varying, text, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_bool_set(tn character varying, fn character varying, sfilter text, val_new boolean) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sql_text text;
BEGIN
-- Записать значение val_new (boolean) в поле fn таблицы tn для фильтра sfilter
res = false;
tn = str_is_null(tn);
IF (tn <> '') THEN
fn = str_is_null(fn);
IF (fn <> '') THEN
sfilter = str_is_null(sfilter);
IF (sfilter <> '') THEN
val_new = bool_is_null(val_new);
sql_text = 'update ' || tn || ' set ' || fn || ' = ' || if_then(val_new) || ' where ' || sfilter || ' ;';
res = public.exec_sql_text(sql_text);
res = public.bool_is_null(res);
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_bool_set(tn character varying, fn character varying, sfilter text, val_new boolean) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_bool_set(tn character varying, fn character varying, sfilter text, val_new boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_bool_set(tn character varying, fn character varying, sfilter text, val_new boolean) IS 'Записать значение val_new (boolean) в поле fn таблицы tn для фильтра sfilter';
--
-- Name: table_field_value_as_float_get(character varying, character varying, text, t_float, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_float_get(tn character varying, fn character varying, sfilter text, vdef t_float DEFAULT 0.0, sorderby character varying DEFAULT ''::character varying) RETURNS t_float
LANGUAGE plpgsql
AS $$
DECLARE
res t_float;
sres text;
BEGIN
-- Получить значение поля fn (как bigint) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
-- select * from table_field_value_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
-- select * from table_field_value_as_float_get('dir.dir_props', 'sum(cast(prop_val as t_float))', 'id_owner_guid=' || q39_lr('25EA85505308413BBAF770C42EECB574'));
vdef = float_is_null(vdef);
sres = table_field_value_as_text_get(tn, fn, sfilter, float_as_str(vdef), sorderby, true);
res = str_as_float(sres, vdef);
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_float_get(tn character varying, fn character varying, sfilter text, vdef t_float, sorderby character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_float_get(tn character varying, fn character varying, sfilter text, vdef t_float, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_float_get(tn character varying, fn character varying, sfilter text, vdef t_float, sorderby character varying) IS 'Получить значение поля fn (как bigint) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';
--
-- Name: table_field_value_as_float_set(character varying, character varying, text, t_float); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_float_set(tn character varying, fn character varying, sfilter text, val_new t_float) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sql_text text;
BEGIN
-- Записать значение val_new (t_float) в поле fn таблицы tn для фильтра sfilter
res = false;
tn = str_is_null(tn);
IF (tn <> '') THEN
fn = str_is_null(fn);
IF (fn <> '') THEN
sfilter = str_is_null(sfilter);
IF (sfilter <> '') THEN
val_new = float_is_null(val_new);
sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
res = public.exec_sql_text(sql_text);
res = public.bool_is_null(res);
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_float_set(tn character varying, fn character varying, sfilter text, val_new t_float) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_float_set(tn character varying, fn character varying, sfilter text, val_new t_float); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_float_set(tn character varying, fn character varying, sfilter text, val_new t_float) IS 'Записать значение val_new (t_float) в поле fn таблицы tn для фильтра sfilter';
--
-- Name: table_field_value_as_int_get(character varying, character varying, text, integer, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_int_get(tn character varying, fn character varying, sfilter text, vdef integer DEFAULT 0, sorderby character varying DEFAULT ''::character varying) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
res integer;
sres text;
BEGIN
-- Получить значение поля fn (как integer) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
-- select * from table_field_value_as_int_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
vdef = int_is_null(vdef);
sres = table_field_value_as_text_get(tn, fn, sfilter, int_as_str(vdef), sorderby, true);
res = str_as_int(sres,vdef);
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_int_get(tn character varying, fn character varying, sfilter text, vdef integer, sorderby character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_int_get(tn character varying, fn character varying, sfilter text, vdef integer, sorderby character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_int_get(tn character varying, fn character varying, sfilter text, vdef integer, sorderby character varying) IS 'Получить значение поля fn (как integer) из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';
--
-- Name: table_field_value_as_int_set(character varying, character varying, text, integer); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_int_set(tn character varying, fn character varying, sfilter text, val_new integer) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sql_text text;
BEGIN
-- Записать значение val_new (integer) в поле fn таблицы tn для фильтра sfilter
-- select * from table_field_value_as_int_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
-- select * from table_field_value_as_int_set('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'), 31);
-- select * from table_field_value_as_int_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
-- select * from table_field_value_as_int_set('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'), 30);
-- select * from table_field_value_as_int_get('dir.ot_grp', 'npp', 'id_guid=' || q39_lr('5C209ACBE50D4932876AF1B70ACB48C6'));
res = false;
tn = str_is_null(tn);
IF (tn <> '') THEN
fn = str_is_null(fn);
IF (fn <> '') THEN
sfilter = str_is_null(sfilter);
IF (sfilter <> '') THEN
val_new = int_is_null(val_new);
sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
res = public.exec_sql_text(sql_text);
res = public.bool_is_null(res);
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_int_set(tn character varying, fn character varying, sfilter text, val_new integer) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_int_set(tn character varying, fn character varying, sfilter text, val_new integer); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_int_set(tn character varying, fn character varying, sfilter text, val_new integer) IS 'Записать значение val_new (integer) в поле fn таблицы tn для фильтра sfilter';
--
-- Name: table_field_value_as_str_get(character varying, character varying, text, character varying, character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_str_get(tn character varying, fn character varying, sfilter text, vdef character varying DEFAULT ''::character varying, sorderby character varying DEFAULT ''::character varying, yestrim boolean DEFAULT true) RETURNS character varying
LANGUAGE plpgsql
AS $$
DECLARE
res character varying;
sql_text text;
BEGIN
-- Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
-- select * from table_field_value_as_str_get('dir.props_list', 'name_max', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
-- select * from table_field_value_as_str_get('dir.props_list', 'name_max', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'), '???');
-- select * from table_field_value_as_str_get('dir.props_list', 'name_max', 'prop_type=8', '???', 'npp');
-- select * from table_field_value_as_str_get('dir.dir_props', 'sum(cast(prop_val as t_float))', 'id_owner_guid=' || q39_lr('25EA85505308413BBAF770C42EECB574'));
vdef = str_is_null(vdef);
res = vdef;
tn = str_is_null(tn);
IF (tn <> '') THEN
fn = str_is_null(fn);
IF (fn <> '') THEN
sfilter = str_is_null(sfilter);
-- IF (sfilter <> '') THEN
sorderby = str_is_null(sorderby);
sql_text = '';
sql_text = sql_text || 'select ' || fn || ' from ' || tn;
IF (sfilter <> '') THEN
sql_text = sql_text || ' where ' || sfilter;
END IF;
IF (sorderby <> '') THEN
sql_text = sql_text || ' order by ' || sorderby;
END IF;
sql_text = sql_text || ' limit 1 ;';
res = public.exec_to_text(sql_text, vdef);
IF (res is null) THEN
res = vdef;
ELSE
yestrim = bool_is_null(yestrim);
IF (yestrim=true) THEN
res = str_is_null(res);
END IF;
END IF;
-- END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_str_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_str_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_str_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) IS 'Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';
--
-- Name: table_field_value_as_str_set(character varying, character varying, text, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_str_set(tn character varying, fn character varying, sfilter text, val_new character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sql_text text;
BEGIN
-- Записать значение val_new в поле fn таблицы tn для фильтра sfilter
res = false;
tn = str_is_null(tn);
IF (tn <> '') THEN
fn = str_is_null(fn);
IF (fn <> '') THEN
sfilter = str_is_null(sfilter);
IF (sfilter <> '') THEN
val_new = str_is_null(val_new);
sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
res = exec_sql_text(sql_text);
res = bool_is_null(res);
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_str_set(tn character varying, fn character varying, sfilter text, val_new character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_str_set(tn character varying, fn character varying, sfilter text, val_new character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_str_set(tn character varying, fn character varying, sfilter text, val_new character varying) IS 'Записать значение val_new в поле fn таблицы tn для фильтра sfilter';
--
-- Name: table_field_value_as_text_get(character varying, character varying, text, character varying, character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_text_get(tn character varying, fn character varying, sfilter text, vdef character varying DEFAULT ''::character varying, sorderby character varying DEFAULT ''::character varying, yestrim boolean DEFAULT true) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
sql_text text;
BEGIN
-- Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
-- select * from table_field_value_as_text_get('dir.props_list', 'name_max', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
-- select * from table_field_value_as_text_get('dir.dir_props', 'sum(cast(prop_val as t_float))', 'id_owner_guid=' || q39_lr('25EA85505308413BBAF770C42EECB574'));
vdef = str_is_null(vdef);
res = vdef;
tn = str_is_null(tn);
IF (tn <> '') THEN
fn = str_is_null(fn);
IF (fn <> '') THEN
sfilter = str_is_null(sfilter);
-- IF (sfilter <> '') THEN
sorderby = str_is_null(sorderby);
sql_text = '';
sql_text = sql_text || 'select ' || fn || ' from ' || tn;
IF (sfilter <> '') THEN
sql_text = sql_text || ' where ' || sfilter;
END IF;
IF (sorderby <> '') THEN
sql_text = sql_text || ' order by ' || sorderby;
END IF;
sql_text = sql_text || ' limit 1 ;';
res = public.exec_to_text(sql_text, vdef);
IF (res is null) THEN
res = vdef;
ELSE
yestrim = bool_is_null(yestrim);
IF (yestrim=true) THEN
res = str_is_null(res);
END IF;
END IF;
-- END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_text_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_text_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_text_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) IS 'Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';
--
-- Name: table_field_value_as_text_set(character varying, character varying, text, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_as_text_set(tn character varying, fn character varying, sfilter text, val_new text) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sql_text text;
BEGIN
-- Записать значение val_new в поле fn таблицы tn для фильтра sfilter
res = false;
tn = str_is_null(tn);
IF (tn <> '') THEN
fn = str_is_null(fn);
IF (fn <> '') THEN
sfilter = str_is_null(sfilter);
IF (sfilter <> '') THEN
val_new = str_is_null(val_new);
sql_text = 'update ' || tn || ' set ' || fn || ' = ' || val_new || ' where ' || sfilter || ' ;';
res = public.exec_sql_text(sql_text);
res = public.bool_is_null(res);
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_as_text_set(tn character varying, fn character varying, sfilter text, val_new text) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_as_text_set(tn character varying, fn character varying, sfilter text, val_new text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_as_text_set(tn character varying, fn character varying, sfilter text, val_new text) IS 'Записать значение val_new в поле fn таблицы tn для фильтра sfilter';
--
-- Name: table_field_value_avg_as_float_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_avg_as_float_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS t_float
LANGUAGE plpgsql
AS $$
DECLARE
res t_float;
sres text;
BEGIN
-- Получить среднее значение поля fn в таблице tn с учетом фильтра sfilter
-- select * from table_field_value_avg_as_float_get('dir.props_list', 'npp');
-- select * from table_field_value_avg_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
res = 0;
fn = str_is_null(fn);
IF (fn <> '') THEN
sres = table_field_value_as_text_get(tn, 'avg(' || fn || ')', sfilter, '0.0', '', true);
res = str_as_float(sres, 0);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_avg_as_float_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_avg_as_float_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_avg_as_float_get(tn character varying, fn character varying, sfilter text) IS 'Получить среднее значение поля fn в таблице tn с учетом фильтра sfilter';
--
-- Name: table_field_value_get(character varying, character varying, text, character varying, character varying, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_get(tn character varying, fn character varying, sfilter text, vdef character varying DEFAULT ''::character varying, sorderby character varying DEFAULT ''::character varying, yestrim boolean DEFAULT true) RETURNS text
LANGUAGE plpgsql
AS $$
DECLARE
res text;
BEGIN
-- Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby
-- select * from table_field_value_get('dir.props_list', 'name_max', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
res = table_field_value_as_text_get(tn, fn, sfilter, vdef, sorderby, yestrim);
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_get(tn character varying, fn character varying, sfilter text, vdef character varying, sorderby character varying, yestrim boolean) IS 'Получить значение поля fn из таблицы tn в соответствии с фильтром sfilter с учетом сортировки sorderby';
--
-- Name: table_field_value_max_as_bigint_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_max_as_bigint_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS bigint
LANGUAGE plpgsql
AS $$
DECLARE
res bigint;
sres text;
BEGIN
-- Получить максимальное значение поля fn в таблице tn с учетом фильтра sfilter
-- select * from table_field_value_max_as_bigint_get('dir.props_list', 'npp');
-- select * from table_field_value_max_as_bigint_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
res = 0;
fn = str_is_null(fn);
IF (fn <> '') THEN
sres = table_field_value_as_text_get(tn, 'max(' || fn || ')', sfilter, '0', '', true);
res = str_as_bigint(sres, 0);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_max_as_bigint_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_max_as_bigint_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_max_as_bigint_get(tn character varying, fn character varying, sfilter text) IS 'Получить максимальное значение поля fn в таблице tn с учетом фильтра sfilter';
--
-- Name: table_field_value_max_as_float_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_max_as_float_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS t_float
LANGUAGE plpgsql
AS $$
DECLARE
res t_float;
sres text;
BEGIN
-- Получить максимальное значение поля fn в таблице tn с учетом фильтра sfilter
-- select * from table_field_value_max_as_float_get('dir.props_list', 'npp');
-- select * from table_field_value_max_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
res = 0;
fn = str_is_null(fn);
IF (fn <> '') THEN
sres = table_field_value_as_text_get(tn, 'max(' || fn || ')', sfilter, '0.0', '', true);
res = str_as_float(sres, 0);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_max_as_float_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_max_as_float_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_max_as_float_get(tn character varying, fn character varying, sfilter text) IS 'Получить максимальное значение поля fn в таблице tn с учетом фильтра sfilter';
--
-- Name: table_field_value_min_as_bigint_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_min_as_bigint_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS bigint
LANGUAGE plpgsql
AS $$
DECLARE
res bigint;
sres text;
BEGIN
-- Получить минимальное значение поля fn в таблице tn с учетом фильтра sfilter
-- select * from table_field_value_min_as_bigint_get('dir.props_list', 'npp');
-- select * from table_field_value_min_as_bigint_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
res = 0;
fn = str_is_null(fn);
IF (fn <> '') THEN
sres = table_field_value_as_text_get(tn, 'min(' || fn || ')', sfilter, '0', '', true);
res = str_as_bigint(sres, 0);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_min_as_bigint_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_min_as_bigint_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_min_as_bigint_get(tn character varying, fn character varying, sfilter text) IS 'Получить минимальное значение поля fn в таблице tn с учетом фильтра sfilter';
--
-- Name: table_field_value_min_as_float_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_min_as_float_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS t_float
LANGUAGE plpgsql
AS $$
DECLARE
res t_float;
sres text;
BEGIN
-- Получить минимальное значение поля fn в таблице tn с учетом фильтра sfilter
-- select * from table_field_value_min_as_float_get('dir.props_list', 'npp');
-- select * from table_field_value_min_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
res = 0;
fn = str_is_null(fn);
IF (fn <> '') THEN
sres = table_field_value_as_text_get(tn, 'min(' || fn || ')', sfilter, '0.0', '', true);
res = str_as_float(sres, 0);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_min_as_float_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_min_as_float_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_min_as_float_get(tn character varying, fn character varying, sfilter text) IS 'Получить минимальное значение поля fn в таблице tn с учетом фильтра sfilter';
--
-- Name: table_field_value_sum_as_bigint_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_sum_as_bigint_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS bigint
LANGUAGE plpgsql
AS $$
DECLARE
res bigint;
sres text;
BEGIN
-- Получить сумму значений поля fn в таблице tn с учетом фильтра sfilter
-- select * from table_field_value_sum_as_bigint_get('dir.props_list', 'npp');
-- select * from table_field_value_sum_as_bigint_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
res = 0;
fn = str_is_null(fn);
IF (fn <> '') THEN
sres = table_field_value_as_text_get(tn, 'sum(' || fn || ')', sfilter, '0', '', true);
res = str_as_bigint(sres, 0);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_sum_as_bigint_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_sum_as_bigint_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_sum_as_bigint_get(tn character varying, fn character varying, sfilter text) IS 'Получить сумму значений поля fn в таблице tn с учетом фильтра sfilter';
--
-- Name: table_field_value_sum_as_float_get(character varying, character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_field_value_sum_as_float_get(tn character varying, fn character varying, sfilter text DEFAULT ''::character varying) RETURNS t_float
LANGUAGE plpgsql
AS $$
DECLARE
res t_float;
sres text;
BEGIN
-- Получить сумму значений поля fn в таблице tn с учетом фильтра sfilter
-- select * from table_field_value_sum_as_float_get('dir.props_list', 'npp');
-- select * from table_field_value_sum_as_float_get('dir.props_list', 'npp', 'id_guid=' || q39_lr('01F1C5C9767C43208A1957CEE22E034F'));
res = 0;
fn = str_is_null(fn);
IF (fn <> '') THEN
sres = table_field_value_as_text_get(tn, 'sum(' || fn || ')', sfilter, '0.0', '', true);
res = str_as_float(sres, 0);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_field_value_sum_as_float_get(tn character varying, fn character varying, sfilter text) OWNER TO postgres;
--
-- Name: FUNCTION table_field_value_sum_as_float_get(tn character varying, fn character varying, sfilter text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_field_value_sum_as_float_get(tn character varying, fn character varying, sfilter text) IS 'Получить сумму значений поля fn в таблице tn с учетом фильтра sfilter';
--
-- Name: table_tmp_clear(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_tmp_clear(tn character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Очистить таблицу tn (если она временная)
-- select * from table_tmp_clear('a333');
res = false;
tn = str_is_null(tn);
if (table_tmp_tn_is_ok(tn) = true) THEN
tn = lower(tn);
res = public.exec_sql_text('delete from ' || tn || ';');
res = bool_is_null(res);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_tmp_clear(tn character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_tmp_clear(tn character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_tmp_clear(tn character varying) IS 'Очистить таблицу tn (если она временная)';
--
-- Name: table_tmp_create(character varying, text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_tmp_create(tn character varying, sqltext text) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
yesnext boolean;
k integer;
BEGIN
-- Создать временную таблицу (предварительно - предыдущая, с таким же именем, автоматически удаляется)
-- select * from table_tmp_create('a333', 'CREATE temporary TABLE IF NOT EXISTS a333 (id serial, nav_namemax character varying(100)); CREATE INDEX a333_id ON a333(id);');
-- select * from table_tmp_create('a333', 'CREATE temporary TABLE a333 (id serial, nav_namemax character varying(100)); CREATE INDEX a333_id ON a333(id);');
-- select * from a333;
-- select * from public.table_tmp_drop('a333');
res = false;
tn = str_is_null(tn);
IF (table_tmp_tn_is_ok(tn) = true) THEN -- контроль имени таблицы (что это временная)
tn = lower(tn);
sqltext = str_is_null(sqltext);
IF (sqltext <> '') THEN
yesnext = true;
-- -------------------------------------------
-- простейший контроль имени таблицы и намерений программиста в sql-запросе
k = position('CREATE' in upper(sqltext));
IF (k<=0) THEN yesnext = false; END IF;
k = position('TEMPORARY' in upper(sqltext));
IF (k<=0) THEN yesnext = false; END IF;
k = position('TABLE' in upper(sqltext));
IF (k<=0) THEN yesnext = false; END IF;
k = position(upper(tn) in upper(sqltext));
IF (k<=0) THEN yesnext = false; END IF;
-- -------------------------------------------
-- -------------------------------------------
IF (yesnext = true) THEN
yesnext = public.table_tmp_drop(tn); -- удаляем предыдущую, если существует
res = public.exec_sql_text(sqltext);
res = bool_is_null(res);
END IF;
-- -------------------------------------------
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_tmp_create(tn character varying, sqltext text) OWNER TO postgres;
--
-- Name: FUNCTION table_tmp_create(tn character varying, sqltext text); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_tmp_create(tn character varying, sqltext text) IS 'Создать временную таблицу (предварительно - предыдущая, с таким же именем, автоматически удаляется)';
--
-- Name: table_tmp_create_as(character varying, character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_tmp_create_as(tn_tmp character varying, tn_from character varying, sfilter character varying DEFAULT ''::character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
sqltext text;
BEGIN
/*
Создать временную таблицу БД на основе существующей таблицы БД
Вх. параметры:
tn_tmp - имя создаваемой (временной) таблицы БД;
tn_from - имя таблицы БД, на основе которой создается tn_tmp;
sfilter - фильтр, для копирования строк из таблицы tn_from в таблицу tn_tmp (необязательный параметр);
Вых. параметры:
=TRUE - успешно; =FALSE - ошибка
Пример-1:
select * from table_tmp_create_as('a333', 'dir.ot_list');
select * from a333;
select * from public.table_tmp_drop('a333');
Пример-2:
select * from table_tmp_create('a333', 'CREATE temporary TABLE a333 (id integer, namemax character varying(100));');
--select * from a333;
select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);
select exec_sql_text('insert into a333 (id, namemax) values (1,' || q39_lr('Object-1') || ')');
select exec_sql_text('insert into a333 (id, namemax) values (2,' || q39_lr('Объект-2') || ')');
select exec_sql_text('insert into a333 (id, namemax) values (3,' || q39_lr('Объект-3') || ')');
--select * from a333;
select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);
select * from table_tmp_create_as('a555', 'a333', 'id>1');
--select * from a555;
select * from exec_select('id, namemax from a555') as ds(id integer, namemax character varying);
select * from table_tmp_drop('a333');
*/
res = false;
tn_tmp = lower(str_is_null(tn_tmp));
if (table_tmp_tn_is_ok(tn_tmp) = true) THEN -- контроль имени таблицы (что это временная)
tn_from = str_is_null(tn_from);
IF (table_exist( -1, tn_from)= true) THEN
sqltext = 'create temporary table ' || tn_tmp || ' as select * from ' || tn_from;
sfilter = str_is_null(sfilter);
IF (sfilter <> '') THEN
sqltext = sqltext || ' where ' || sfilter;
END IF;
PERFORM public.table_tmp_drop(tn_tmp); -- удаляем предыдущую, если существует
res = public.exec_sql_text(sqltext);
res = bool_is_null(res);
END IF; END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_tmp_create_as(tn_tmp character varying, tn_from character varying, sfilter character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_tmp_create_as(tn_tmp character varying, tn_from character varying, sfilter character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_tmp_create_as(tn_tmp character varying, tn_from character varying, sfilter character varying) IS 'Создать временную таблицу БД на основе существующей таблицы БД';
--
-- Name: table_tmp_delete(character varying, character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_tmp_delete(tn character varying, sfilter character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Удалить из таблицы tn (если она временная) строки, согласно фильтра sfilter
/*
Пример.
select * from table_tmp_create('a333', 'CREATE temporary TABLE a333 (id integer, namemax character varying(100));');
--select * from a333;
select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);
select exec_sql_text('insert into a333 (id, namemax) values (1,' || q39_lr('Object-1') || ')');
select exec_sql_text('insert into a333 (id, namemax) values (2,' || q39_lr('Объект-2') || ')');
select exec_sql_text('insert into a333 (id, namemax) values (3,' || q39_lr('Объект-3') || ')');
--select * from a333;
select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);
select * from table_tmp_delete('a333', 'id=2');
--select * from a333;
select * from exec_select('id, namemax from a333') as ds(id integer, namemax character varying);
select * from table_tmp_drop('a333');
*/
res = false;
sfilter = str_is_null(sfilter);
IF (sfilter <> '') THEN
tn = str_is_null(tn);
IF (table_tmp_tn_is_ok(tn) = true) THEN
tn = lower(tn);
res = public.exec_sql_text('delete from ' || tn || ' where ' || sfilter || ';');
res = bool_is_null(res);
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_tmp_delete(tn character varying, sfilter character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_tmp_delete(tn character varying, sfilter character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_tmp_delete(tn character varying, sfilter character varying) IS 'Удалить из таблицы tn (если она временная) строки, согласно фильтра sfilter';
--
-- Name: table_tmp_drop(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_tmp_drop(tn character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
BEGIN
-- Удалить таблицу tn (если она временная)
-- select * from table_tmp_drop('a333');
res = false;
tn = str_is_null(tn);
IF (table_tmp_tn_is_ok(tn) = true) THEN
tn = lower(tn);
res = public.exec_sql_text('drop table if exists ' || tn || ';');
res = bool_is_null(res);
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_tmp_drop(tn character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_tmp_drop(tn character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_tmp_drop(tn character varying) IS 'Удалить таблицу tn (если она временная)';
--
-- Name: table_tmp_tn_is_ok(character varying); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION table_tmp_tn_is_ok(tn character varying) RETURNS boolean
LANGUAGE plpgsql
AS $$
DECLARE
res boolean;
k integer;
BEGIN
-- Проверить, что tn может соответствовать имени ВРЕМЕННОЙ таблицы
-- select * from table_tmp_tn_is_ok('a333');
-- select * from table_tmp_tn_is_ok('tmp999.fff_pars');
-- select * from table_tmp_tn_is_ok('dir.variants_list');
res = false;
tn = str_is_null(tn);
IF (tn <> '') THEN
tn = lower(tn);
k = position('.' in tn);
IF (k<=0) THEN
k = 0;
/*
-- Здесь исключения (т.е., если в схеме public есть таблицы Б.Д., то их нужно указать здесь)
-- IF (tn = 'props_types') THEN k = 1; END IF;
*/
IF (k<=0) THEN
res = true;
END IF;
END IF;
END IF;
RETURN res;
END;
$$;
ALTER FUNCTION public.table_tmp_tn_is_ok(tn character varying) OWNER TO postgres;
--
-- Name: FUNCTION table_tmp_tn_is_ok(tn character varying); Type: COMMENT; Schema: public; Owner: postgres
--
COMMENT ON FUNCTION table_tmp_tn_is_ok(tn character varying) IS 'Проверить, что tn может соответствовать имени ВРЕМЕННОЙ таблицы';
SET search_path = tmp, pg_catalog;
SET default_tablespace = '';
SET default_with_oids = false;
--
-- Name: docs_list; Type: TABLE; Schema: tmp; Owner: postgres
--
CREATE TABLE docs_list (
id integer NOT NULL,
npp integer,
doc_name character varying(200),
note character varying(100),
its_actual boolean
);
ALTER TABLE docs_list OWNER TO postgres;
--
-- Name: docs_list_id_seq; Type: SEQUENCE; Schema: tmp; Owner: postgres
--
CREATE SEQUENCE docs_list_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE docs_list_id_seq OWNER TO postgres;
--
-- Name: docs_list_id_seq; Type: SEQUENCE OWNED BY; Schema: tmp; Owner: postgres
--
ALTER SEQUENCE docs_list_id_seq OWNED BY docs_list.id;
--
-- Name: fio_list; Type: TABLE; Schema: tmp; Owner: postgres
--
CREATE TABLE fio_list (
id integer NOT NULL,
code integer,
fio character varying(200),
oklad double precision,
yes_active boolean,
d1 date,
d2 date,
note character varying(200)
);
ALTER TABLE fio_list OWNER TO postgres;
--
-- Name: id; Type: DEFAULT; Schema: tmp; Owner: postgres
--
ALTER TABLE ONLY docs_list ALTER COLUMN id SET DEFAULT nextval('docs_list_id_seq'::regclass);
--
-- Data for Name: docs_list; Type: TABLE DATA; Schema: tmp; Owner: postgres
--
INSERT INTO docs_list VALUES (2, 2, 'Документ-2', 'Примечание - B', true);
INSERT INTO docs_list VALUES (3, 3, 'Документ-3', 'Примечание - C', false);
INSERT INTO docs_list VALUES (1, 1, 'Документ-1', 'Примечание - A', NULL);
--
-- Name: docs_list_id_seq; Type: SEQUENCE SET; Schema: tmp; Owner: postgres
--
SELECT pg_catalog.setval('docs_list_id_seq', 1, false);
--
-- Data for Name: fio_list; Type: TABLE DATA; Schema: tmp; Owner: postgres
--
INSERT INTO fio_list VALUES (6, 106, '???', 0, NULL, NULL, NULL, '???');
INSERT INTO fio_list VALUES (3, 103, 'Петров Петр Петрович', 22135.709999999999, NULL, '2019-11-01', NULL, 'Примечание-3');
INSERT INTO fio_list VALUES (4, 104, 'Максимов Максим Максимович', 14879.42, false, '2010-05-05', '2020-01-31', 'Примечание-4');
INSERT INTO fio_list VALUES (5, 105, 'Николаев Николай Николаевич', 20954, true, '2011-03-07', NULL, 'Примечание-5');
INSERT INTO fio_list VALUES (2, 102, 'Сидоров Сидор Сидорович', 17012.25, true, '2020-02-21', NULL, 'Примечание-2');
INSERT INTO fio_list VALUES (1, 101, 'Иванов Иван Иванович', 15000, false, '2020-01-12', '2022-01-15', 'Примечание-1');
--
-- Name: docs_list_pkey; Type: CONSTRAINT; Schema: tmp; Owner: postgres
--
ALTER TABLE ONLY docs_list
ADD CONSTRAINT docs_list_pkey PRIMARY KEY (id);
--
-- Name: fio_list_pkey; Type: CONSTRAINT; Schema: tmp; Owner: postgres
--
ALTER TABLE ONLY fio_list
ADD CONSTRAINT fio_list_pkey PRIMARY KEY (id);
--
-- Name: public; Type: ACL; Schema: -; Owner: postgres
--
REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;
--
-- PostgreSQL database dump complete
--