Projekt

Allgemein

Profil

Postgres96 Kompatibilität Vacuum art Ereignis Eventlog » Historie » Version 4

[S] Dominik G, 03.09.2018 10:31

1 1 [X] Daniel S
h1. Postgres96 Kompatibilität Vacuum art Ereignis Eventlog
2
3
* Postgres 96 hat keine public search_path mehr
4
* Permanente Fehler in Windows Ereignisanzeige, wenn man ältere PRODAT-Versionen mit Postgres 9.6 betreibt
5
6
<pre>
7
<@-2018-08-25 11:44:48 CEST> ERROR:  function getsetting(unknown) does not exist at character 8
8
<@-2018-08-25 11:44:48 CEST> HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
9
<@-2018-08-25 11:44:48 CEST> QUERY:  SELECT GetSetting('akindex')
10
<@-2018-08-25 11:44:48 CEST> CONTEXT:  PL/pgSQL function public.artikel_index(character varying) line 7 at assignment
11
	automatic analyze of table "BUECHEL-HOLDING-LIVE.public.art"
12
</pre> 
13
14
Bugfix zur Kompatibilität: (es steht nur public davor)
15
<pre><code class="sql">
16 4 [S] Dominik G
DROP INDEX IF EXISTS artikel_index;
17
DROP INDEX IF EXISTS artikel_index_like;
18
DROP INDEX IF EXISTS artikel_index_no_searchstring;
19
DROP INDEX IF EXISTS artikel_index_no_searchstring_like;
20
DROP FUNCTION IF EXISTS artikel_index(VARCHAR);
21 1 [X] Daniel S
22 4 [S] Dominik G
--
23 1 [X] Daniel S
CREATE OR REPLACE FUNCTION public.getsetting(character varying) RETURNS VARCHAR AS
24
 $$
25
DECLARE r VARCHAR;
26
BEGIN
27 2 [S] Dominik G
 SELECT s_inha INTO r FROM public.settings WHERE s_vari=$1;
28
 RETURN COALESCE(r, '');
29 1 [X] Daniel S
END$$LANGUAGE plpgsql;
30 4 [S] Dominik G
--
31 1 [X] Daniel S
32
-- Gibt Artikelnummer ohne Index zurück. Wenn Suchstring true, dann mit % am Ende, für Suche aller Artikel unabhängig des Index'.
33
CREATE OR REPLACE FUNCTION artikel_index(IN ak_nr VARCHAR, IN searchstring BOOLEAN DEFAULT true) RETURNS VARCHAR AS $$
34
  DECLARE aknr VARCHAR;
35
          indexchar VARCHAR;
36
          posindexchar INTEGER;
37
  BEGIN
38
    indexchar:= public.GetSetting('akindex'::VARCHAR);
39
40
    IF COALESCE(indexchar, '') = '' THEN RETURN ak_nr; END IF;  -- Kein IndexChar definiert, dann raus.
41
    IF StrPos(ak_nr, '%') > 0       THEN RETURN ak_nr; END IF;  -- Wildcard für Suche in Artikel, dann raus.
42
    IF StrPos(ak_nr, 'Ø') > 0       THEN RETURN ak_nr; END IF;  -- Artikel mit Durchmesserzeichen (Material), dann raus.
43
44
    posindexchar:= StrPos(reverse(ak_nr), indexchar);
45
46
    IF (posindexchar = 0) OR (posindexchar > 3) THEN RETURN ak_nr; END IF; -- Kein Index in Artikelnummer, dann raus.
47
48
    IF posindexchar = 1 THEN -- Indextrenner ist letztes Zeichen, dass heißt der Index ist eingerahmt vom Trenner, z.B. 123'A'.
49
        posindexchar:= StrPos(reverse(SubStr(ak_nr, 1, Length(ak_nr)-1)), indexchar) + 1;
50
    END IF;
51
52 3 [S] Dominik G
    aknr:= SubStr(ak_nr, 1, public.IFTHEN(ak_nr LIKE '%' || indexchar || '%', Length(ak_nr) - posindexchar, 100)::INTEGER);
53 1 [X] Daniel S
54
    IF searchstring THEN -- Wenn Suchstring gewünscht, dann anhängen.
55
        aknr:= aknr || indexchar || '%';
56
    ELSE
57
        aknr:= rtrim(aknr); -- sonst nur störende Leerzeichen rechts entfernen.
58
    END IF;
59
60
    RETURN aknr;
61
  END $$ LANGUAGE plpgsql IMMUTABLE; -- nur IMMUTABLE, wenn GetSetting('akindex') sich nicht ändert.
62
--
63
64
-- Indizes neu
65
  CREATE INDEX artikel_index ON art (artikel_index(ak_nr));                             -- 2. Parameter searchstring DEFAULT true
66
  CREATE INDEX artikel_index_like ON art (artikel_index(ak_nr) varchar_pattern_ops);    -- 2. Parameter searchstring DEFAULT true
67
  CREATE INDEX artikel_index_no_searchstring ON art (artikel_index(ak_nr, false));
68
  CREATE INDEX artikel_index_no_searchstring_like ON art (artikel_index(ak_nr, false) varchar_pattern_ops);
69
--
70
71 4 [S] Dominik G
72
DROP INDEX IF EXISTS public.bdea_anf_termweek;
73
DROP INDEX IF EXISTS public.maschausf_week;
74
DROP INDEX IF EXISTS public.maschausf_week_end;
75
DROP INDEX IF EXISTS public.ab2_termweek;
76
77
--
78
CREATE OR REPLACE FUNCTION public.termweek(timestamp without time zone)
79
  RETURNS integer AS
80
$BODY$
81
BEGIN 
82
 RETURN public.week_of_year(CAST($1 AS DATE));
83
END$BODY$
84
  LANGUAGE plpgsql IMMUTABLE;
85
--
86
87
--
88
CREATE OR REPLACE FUNCTION public.termweek_kw(timestamp without time zone)
89
  RETURNS character varying AS
90
$BODY$
91
BEGIN 
92
 RETURN public.week_of_year(CAST($1 AS DATE), True);
93
END$BODY$
94
  LANGUAGE plpgsql IMMUTABLE;
95
--
96
97
-- Indizes neu
98
   CREATE INDEX bdea_anf_termweek ON bdea (termweek(ba_anf));
99
   CREATE INDEX maschausf_week ON maschausf(termweek(ma_anf));
100
   CREATE INDEX maschausf_week_end ON maschausf(termweek(ma_end));
101
   CREATE INDEX ab2_termweek ON ab2 (termweek(a2_at));
102
--
103 1 [X] Daniel S
</code></pre>