powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не правильно работает функция
5 сообщений из 5, страница 1 из 1
Не правильно работает функция
    #38870421
Mblp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот код функции
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
CREATE OR REPLACE FUNCTION common.gent(in_mode text,exclusion int)
  RETURNS integer AS
$BODY$
declare --объЯвлЯем переменные
  i_res bigint;
  i bigint;
 
  rec1 record;
  rec2 record;
    rec3 record;
  curs1 refcursor;
  curs2 refcursor;
  sql_array text[];
  pk_array text[];
  pk_str text;
  the_sql text;
  a_cprop bigint;
   a_cpropb bigint;
hranim text[];
  i_res2 bigint;
  needed_i_res2 bigint;
begin

  for rec1 in
   select pgn.nspname::text as col_schema, pgcl.relname::text as col_table, pga.attname::text as col_cprops, pgcon.conkey::bigint[] as col_pk_nums,
    ARRAY(
      select pga2.attname
      from pg_attribute as pga2
      where (pga2.attrelid = pgcl.oid)
       and (pga2.attnum > 0)
      order by pga2.attnum
    )::text[] as col_all_columns,
	  --select *
    (
        select pgcon2.conkey::text
	from pg_constraint as pgcon2
	where  (pgcon2.contype = 'p')
	and (pgcon2.conrelid=pgcl.oid)
	)::bigint[] as pk_num 
	--выборка первичных ключей таблицы с которой работаем
    from pg_class as pgcl, pg_namespace as pgn, pg_attribute as pga, pg_constraint as pgcon ,pg_class as pgcl2
    where (pgcl.relkind = 'r')
    and (pgcl.relnamespace = pgn.oid)
    and (pgn.nspname = 'common')
    and (pga.attrelid = pgcl.oid)
    and (pgcl2.relname=in_mode)
    and (pga.attnum=pgcon.conkey[1]) 
    and (pgcon.conrelid = pgcl.oid)
    and (pgcon.confrelid = pgcl2.oid)
    order by pgcl.relname
/*название таблицы к которой все обращаютсЯ
если номер столбца равен номеру вторичного ключа
 находим название таблицы с помощью номера в pgcl и conrelid( показывает к какой таблице относитсЯ)
 внешний ключ ссылаетсЯ на какую таблицу*/
 loop

   

    sql_array := ARRAY[]::text[];
    pk_array := ARRAY[]::text[];
    pk_str := '';
    
    for i in 1..coalesce(array_upper(rec1.pk_num, 1), 0) loop
      pk_array := array_append(pk_array, rec1.col_all_columns[rec1.pk_num[i]]);   
    end loop;
	-- заносим в массив первичные ключи
    pk_str := array_to_string(pk_array, ', ');             
	-- делаем из массива строку

    sql_array := array_append(sql_array, 'select ARRAY[' || pk_str || ']::text[] as col_pk_vals, ' || rec1.col_cprops || '::text as col_cprops_vals');
    sql_array := array_append(sql_array, 'from ' || (rec1.col_schema || '.' || rec1.col_table));
    sql_array := array_append(sql_array, 'order by ' || pk_str);
    --sql_array := array_append(sql_array, 'group by ' || rec1.col_cprops || 'count(*)');
    sql_array := array_append(sql_array, ';');               
    the_sql := array_to_string(sql_array, ' ');               
	--запрос на выборку, сортируем по первичным ключам
	-- делаем из массива строку
	
  open curs1 for execute the_sql;
      open curs2 for execute the_sql;
    while true loop
      fetch curs1 into rec2;
      if (rec2 is null) then
        exit;
      end if;
     -- a_cprop := rec2.col_cprops_vals;
     -- hranim =rec2.col_pk_vals;
	while true loop
      fetch curs2 into rec3;
    if (rec3 is null) then
      exit;
     end if;
     a_cprop := rec2.col_cprops_vals;
      hranim =rec2.col_pk_vals;
       a_cpropb := rec3.col_cprops_vals;

        --if(a_cprop=a_cprop1)  then

          if (a_cprop=exclusion) then
                         -- делаем так чтоб не выводились числа для которых разрешены многочисленные ссылки
		continue;
          end if;
            raise notice '_("%"); //%.%.%[%] . PK_table: %  ', a_cprop, rec1.col_schema, rec1.col_table, rec1.col_cprops, rec2.col_pk_vals::text, rec3.col_pk_vals::text;
      -- end if;
      
     end loop;
     
    end loop;

   close curs1;
   close curs2;
  end loop;
    return 0;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION common.gent(text,int)
  OWNER TO postgres;



пытаюсь сделать так что если в БД больше 1 раза обращается FK к PK выбраной таблицы, но получается так что выводит не все значения, и по каким-то причинам rec2 знает только о значениях 1,11,129,48 что за бред, прошу помощи, не догоняю сам

также если будут другие варианты как сделать предлагайте!
...
Рейтинг: 0 / 0
Не правильно работает функция
    #38872497
Это сложно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mblpвот код функции
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
CREATE OR REPLACE FUNCTION common.gent(in_mode text,exclusion int)
  RETURNS integer AS
$BODY$
declare --объЯвлЯем переменные
  i_res bigint;
  i bigint;
 
  rec1 record;
  rec2 record;
    rec3 record;
  curs1 refcursor;
  curs2 refcursor;
  sql_array text[];
  pk_array text[];
  pk_str text;
  the_sql text;
  a_cprop bigint;
   a_cpropb bigint;
hranim text[];
  i_res2 bigint;
  needed_i_res2 bigint;
begin

  for rec1 in
   select pgn.nspname::text as col_schema, pgcl.relname::text as col_table, pga.attname::text as col_cprops, pgcon.conkey::bigint[] as col_pk_nums,
    ARRAY(
      select pga2.attname
      from pg_attribute as pga2
      where (pga2.attrelid = pgcl.oid)
       and (pga2.attnum > 0)
      order by pga2.attnum
    )::text[] as col_all_columns,
	  --select *
    (
        select pgcon2.conkey::text
	from pg_constraint as pgcon2
	where  (pgcon2.contype = 'p')
	and (pgcon2.conrelid=pgcl.oid)
	)::bigint[] as pk_num 
	--выборка первичных ключей таблицы с которой работаем
    from pg_class as pgcl, pg_namespace as pgn, pg_attribute as pga, pg_constraint as pgcon ,pg_class as pgcl2
    where (pgcl.relkind = 'r')
    and (pgcl.relnamespace = pgn.oid)
    and (pgn.nspname = 'common')
    and (pga.attrelid = pgcl.oid)
    and (pgcl2.relname=in_mode)
    and (pga.attnum=pgcon.conkey[1]) 
    and (pgcon.conrelid = pgcl.oid)
    and (pgcon.confrelid = pgcl2.oid)
    order by pgcl.relname
/*название таблицы к которой все обращаютсЯ
если номер столбца равен номеру вторичного ключа
 находим название таблицы с помощью номера в pgcl и conrelid( показывает к какой таблице относитсЯ)
 внешний ключ ссылаетсЯ на какую таблицу*/
 loop

   

    sql_array := ARRAY[]::text[];
    pk_array := ARRAY[]::text[];
    pk_str := '';
    
    for i in 1..coalesce(array_upper(rec1.pk_num, 1), 0) loop
      pk_array := array_append(pk_array, rec1.col_all_columns[rec1.pk_num[i]]);   
    end loop;
	-- заносим в массив первичные ключи
    pk_str := array_to_string(pk_array, ', ');             
	-- делаем из массива строку

    sql_array := array_append(sql_array, 'select ARRAY[' || pk_str || ']::text[] as col_pk_vals, ' || rec1.col_cprops || '::text as col_cprops_vals');
    sql_array := array_append(sql_array, 'from ' || (rec1.col_schema || '.' || rec1.col_table));
    sql_array := array_append(sql_array, 'order by ' || pk_str);
    --sql_array := array_append(sql_array, 'group by ' || rec1.col_cprops || 'count(*)');
    sql_array := array_append(sql_array, ';');               
    the_sql := array_to_string(sql_array, ' ');               
	--запрос на выборку, сортируем по первичным ключам
	-- делаем из массива строку
	
  open curs1 for execute the_sql;
      open curs2 for execute the_sql;
    while true loop
      fetch curs1 into rec2;
      if (rec2 is null) then
        exit;
      end if;
     -- a_cprop := rec2.col_cprops_vals;
     -- hranim =rec2.col_pk_vals;
	while true loop
      fetch curs2 into rec3;
    if (rec3 is null) then
      exit;
     end if;
     a_cprop := rec2.col_cprops_vals;
      hranim =rec2.col_pk_vals;
       a_cpropb := rec3.col_cprops_vals;

        --if(a_cprop=a_cprop1)  then

          if (a_cprop=exclusion) then
                         -- делаем так чтоб не выводились числа для которых разрешены многочисленные ссылки
		continue;
          end if;
            raise notice '_("%"); //%.%.%[%] . PK_table: %  ', a_cprop, rec1.col_schema, rec1.col_table, rec1.col_cprops, rec2.col_pk_vals::text, rec3.col_pk_vals::text;
      -- end if;
      
     end loop;
     
    end loop;

   close curs1;
   close curs2;
  end loop;
    return 0;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION common.gent(text,int)
  OWNER TO postgres;



пытаюсь сделать так что если в БД больше 1 раза обращается FK к PK выбраной таблицы, но получается так что выводит не все значения, и по каким-то причинам rec2 знает только о значениях 1,11,129,48 что за бред, прошу помощи, не догоняю сам

также если будут другие варианты как сделать предлагайте!

Вы что в ручную отлаживаете?
Возмите дбфорж может дело побыстрее пойдет?
...
Рейтинг: 0 / 0
Не правильно работает функция
    #38872581
Mblp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нужна помощь! эта функция, которая выше, поидее должна искать FK которые обращаются к PK
но сама суть мне надо найти значения FK обращающихся к PK более 1 раза
т.е есть таблицы допустим
t1
t2
t3
вот в t1 есть значение 14
в t2 есть значение 14
в t3 есть значение 11
так вот они все ссылаются на таблицу t4 в которой первичный ключ 14 и 11 так вот надо вывести значения t1 t2 а t3 нет

если больше 1 раза то выводим нет оставляем
...
Рейтинг: 0 / 0
Не правильно работает функция
    #38872617
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mblp,

Как-то так?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT s.id,
       count(*), -- сколько вообще повторений
       count(DISTINCT s.tabname) -- в скольки таблицах
  FROM (
    SELECT 't1'::text AS tabname, id FROM t1
    UNION SELECT 't2'::text, id FROM t2
    UNION SELECT 't3'::text, id FROM t3) s
  JOIN t4 USING (id)
HAVING count(DISTINCT s.tabname)>1;
...
Рейтинг: 0 / 0
Не правильно работает функция
    #38872663
Mblp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select pgn.nspname::text as col_schema, pgcl.relname::text as col_table, pga.attname::text as col_cprops, pgcon.conkey::bigint[] as col_pk_nums,
ARRAY(
select pga2.attname
from pg_attribute as pga2
where (pga2.attrelid = pgcl.oid)
and (pga2.attnum > 0)
order by pga2.attnum
)::text[] as col_all_columns,
--select *
(
select pgcon2.conkey::text
from pg_constraint as pgcon2
where (pgcon2.contype = 'p')
and (pgcon2.conrelid=pgcl.oid)
)::bigint[] as pk_num
--выборка первичных ключей таблицы с которой работаем
from pg_class as pgcl, pg_namespace as pgn, pg_attribute as pga, pg_constraint as pgcon ,pg_class as pgcl2
where (pgcl.relkind = 'r')
and (pgcl.relnamespace = pgn.oid)
and (pgn.nspname = 'common')
and (pga.attrelid = pgcl.oid)
and (pgcl2.relname='название таблицы')
and (pga.attnum=pgcon.conkey[1])
and (pgcon.conrelid = pgcl.oid)
and (pgcon.confrelid = pgcl2.oid)
order by pgcl.relname

таким запросом я нахожу, название схемы,таблицы,столбца в таблице, номер FK, и PK вот, как мне сделать так чтобы сделать как я описал выше, т.е вывести если встречается более 1 раза, то что указали вы "vyegorov" почему-то не работает, мб я криворук?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не правильно работает функция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]