Postgres96 Kompatibilität Vacuum art Ereignis Eventlog » Historie » Version 3
[S] Dominik G, 03.09.2018 09:59
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 | |||
17 | CREATE OR REPLACE FUNCTION public.getsetting(character varying) RETURNS VARCHAR AS |
||
18 | $$ |
||
19 | DECLARE r VARCHAR; |
||
20 | BEGIN |
||
21 | SELECT s_inha INTO r FROM public.settings WHERE s_vari=$1; |
||
22 | RETURN COALESCE(r, ''); |
||
23 | END$$LANGUAGE plpgsql; |
||
24 | |||
25 | |||
26 | DROP INDEX IF EXISTS artikel_index; |
||
27 | DROP INDEX IF EXISTS artikel_index_like; |
||
28 | 2 | [S] Dominik G | DROP INDEX IF EXISTS artikel_index_no_searchstring; |
29 | DROP INDEX IF EXISTS artikel_index_no_searchstring_like; |
||
30 | 1 | [X] Daniel S | DROP FUNCTION IF EXISTS artikel_index(VARCHAR); |
31 | |||
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 | </code></pre> |