powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / помогите пожалуйста plpgsql
5 сообщений из 5, страница 1 из 1
помогите пожалуйста plpgsql
    #38860547
Mblp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть 1 таблица у нее много дочерних таблиц в каждой из которой есть FK под разным именем который ссылается на родительскую таблицу PK
есть sql запрос который выводит какая таблица какой столбец ссылается и на какой PK в родительской таблице, надо также вывести каждый FK из таблиц дочерних и их PK как это сделать? я так понимаю мне нужен динамический запрос, в каком направлении копать?
просто слабо знаком с plpgsql и динамическими запросами
вот скрин как он выводит, т.е некоторых значений нет
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select pgn.nspname::text as col_schema, pgcl.relname::text as col_table,pga.attname::text as FK_table, pgcon.conkey::bigint[] as col_pk_nums,price.price_id::text as price_id,
    ARRAY(
      select pga2.attname
      from pg_attribute as pga2
      where (pga2.attrelid = pgcl.oid)
      and (pga2.attname like '%price%')
      order by pga2.attnum
    )::text[] as col_all_columns
    --select *
    from pg_class as pgcl, pg_namespace as pgn, pg_attribute as pga, pg_constraint as pgcon,common.price
    where (pgcl.relkind = 'r')
    and (pgcl.relnamespace = pgn.oid)
    and (pgn.nspname = 'common')
    and (pga.attrelid = pgcl.oid)
    and (pga.attndims = 0)
    and (pga.attname like '%price%')
    and (pgcon.contype = 'p')
    and (pgcon.conrelid = pgcl.oid)
    and (pgcl.relname != 'price')
    order by pgcl.relname
...
Рейтинг: 0 / 0
помогите пожалуйста plpgsql
    #38861011
Mblp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
написал функцию но она просто отрабатывает и ничего не выводит, кроме 0

что не так? я не понимаю(
Код: 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.
CREATE OR REPLACE FUNCTION localization.test(in_mode text)
  RETURNS integer AS
$BODY$
declare
  i_res bigint;
  i bigint;
  
  rec1 record;
  rec2 record;
  curs1 refcursor;
  
  sql_array text[];
  pk_array text[];
  pk_str text;
  the_sql text;
  a_cprop text;

  i_res2 bigint;
  needed_i_res2 bigint;
begin
  if(in_mode = 'they') then
    needed_i_res2 := 1;
  else
    needed_i_res2 := 0;
  end if;

  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.attname like '%price%')
      order by pga2.attnum
    )::text[] as col_all_columns
    --select *
    from pg_class as pgcl, pg_namespace as pgn, pg_attribute as pga, pg_constraint as pgcon
    where (pgcl.relkind = 'r')
    and (pgcl.relnamespace = pgn.oid)
    and (pgn.nspname = 'common')
    and (pga.attrelid = pgcl.oid)
    and (pga.attndims = 0)
    and (pga.attname like '%price%')
    and (pgcon.contype = 'p')
    and (pgcon.conrelid = pgcl.oid)
    and (pgcl.relname != 'price')
    order by pgcl.relname
  loop
    --raise notice '111 %', rec1.col_table;
    
    -- client_props2
    if(rec1.col_table = 'building_level') or (rec1.col_table = 'buy_pos') 
    or (rec1.col_table = 'condition')or (rec1.col_table = 'defence_type_prices')
    or (rec1.col_table = 'factory_pos')or (rec1.col_table = 'location')
    or (rec1.col_table = 'location_sector')or (rec1.col_table = 'price_item')
    or (rec1.col_table = 'price_unit')or (rec1.col_table = 'client_props2')
    or (rec1.col_table = 'reward')or (rec1.col_table = 'tech_level') then
      continue;
    end if;

    sql_array := ARRAY[]::text[];
	pk_array := ARRAY[]::text[];
    pk_str := '';
    
    for i in 1..coalesce(array_upper(rec1.col_pk_nums, 1), 0) loop
      pk_array := array_append(pk_array, rec1.col_all_columns[rec1.col_pk_nums[i]]);
    end loop;
    pk_str := array_to_string(pk_array, ', ');
    --raise notice '222 %', pk_str;
    
    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, ';');
    the_sql := array_to_string(sql_array, ' ');
    --raise notice '333 %', the_sql;
    
    open curs1 for execute the_sql;
    while true loop
      fetch curs1 into rec2;
      if (rec2 is null) then
        --raise notice '555 exiting';
        exit;
      end if;
      --raise notice '444 % %', rec2.col_pk_vals, rec2.col_cprops_vals;
      
      for i in 1..coalesce(array_upper(rec2.col_cprops_vals, 1), 0) loop
        a_cprop := rec2.col_cprops_vals[i];

        i_res2 := localization.get_is_for_them(rec1.col_table, rec1.col_cprops, i);
        if(i_res2 = needed_i_res2) then
          if(a_cprop ~* '[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]') then
            raise notice '_("%"); //%.%.%[%] . PK: %', a_cprop, rec1.col_schema, rec1.col_table, rec1.col_cprops, i::text, rec2.col_pk_vals::text;
          end if;
        end if;
      end loop;
    end loop;
    
    close curs1;
  end loop;
  

  
  return 0;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION localization.test(text)
  OWNER TO el5;
...
Рейтинг: 0 / 0
помогите пожалуйста plpgsql
    #38861021
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mblp,

в конце функции написано return 0. Она больше ничего и не может сделать, кроме как 0 вернуть.
...
Рейтинг: 0 / 0
помогите пожалуйста plpgsql
    #38861472
Mblp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а также там есть
Код: plsql
1.
raise notice '_("%"); //%.%.%[%] . PK: %', a_cprop, rec1.col_schema, rec1.col_table, rec1.col_cprops, i::text, rec2.col_pk_vals::text;



и это как бы выводит на экран то что задано
...
Рейтинг: 0 / 0
помогите пожалуйста plpgsql
    #38861532
этта
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mblpа также там есть
Код: plsql
1.
raise notice '_("%"); //%.%.%[%] . PK: %', a_cprop, rec1.col_schema, rec1.col_table, rec1.col_cprops, i::text, rec2.col_pk_vals::text;



и это как бы выводит на экран то что задано

уввожаемый (от слова вожжи) вот в этом куске кода

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
      for i in 1..coalesce(array_upper(rec2.col_cprops_vals, 1), 0) loop
        a_cprop := rec2.col_cprops_vals[i];

        i_res2 := localization.get_is_for_them(rec1.col_table, rec1.col_cprops, i);
        if(i_res2 = needed_i_res2) then
          if(a_cprop ~* '[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]') then
            raise notice '_("%"); //%.%.%[%] . PK: %', a_cprop, rec1.col_schema, rec1.col_table, rec1.col_cprops, i::text, rec2.col_pk_vals::text;
          end if;
        end if;
      end loop;


я с лёта вижу 2 места, где можно расставить нотификацию для отладки вашего овнокода

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


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