Używam skryptu plpgsql w Postgresie 8.3 - chciałbym przekazać argumenty do tego skryptu poprzez psql. Obecnie wykonuję skrypt w następujący sposób:
psql -d database -u user -f update_file.sql
Natknąłem się na ten link, który wyjaśnia zmienną środowiskową PGOPTIONS, ale to nie działa dla „niestandardowych” argumentów. tzn. pojawia się błąd, ponieważ ustawienia nie ma na liście w pliku postgres.conf.
-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL: unrecognized configuration parameter "pretend"
Jakieś inne pomysły? Idealnie chciałbym uniknąć zmiennych środowiskowych ...
postgresql
psql
Jmoney38
źródło
źródło
-v
argumentu psql.Odpowiedzi:
Ściśle mówiąc, nie ma czegoś takiego jak „skrypt plpgsql” - PL / pgSQL jest domyślnym językiem proceduralnym PostgreSQL. Jest to albo skrypt SQL, albo funkcja / procedura plpgsql. Twój przykład wskazuje na skrypt SQL.
Zamiast tego możesz utworzyć funkcję plpgsql (lub sql) (po stronie serwera ) , która przyjmuje dowolną liczbę argumentów. To bardzo proste, o ile argumenty są
values
. To staje się nieco bardziej skomplikowane, jeśli argumenty zawierają identyfikatory. Następnie będziesz musiał używać PL / pgSQL z dynamicznym SQL iEXECUTE
.PL / pgSQL jest domyślnie wstępnie zainstalowany w PostgreSQL 9.0 lub nowszym. Musisz zainstalować go raz na bazę danych w Postgres 8.3, jednak:
Mówiąc o wersji: powinieneś rozważyć aktualizację do aktualnej wersji PostgreSQL. Wersja 8.3 jest już bardzo stara, wycofana z życia na początku 2013 roku.
Ponieważ wydaje się, że masz gotowy skrypt SQL, przedstawię funkcję SQL. Prosta funkcja fikcyjna z dwoma argumentami liczb całkowitych:
Możesz znaleźć wiele bardziej wyrafinowanych przykładów dla pliku plpgsql tutaj na dba.SE lub na SO .
Możesz wywołać tę funkcję i przekazać parametry w skrypcie powłoki: Podstawowy przykład wywołania w skrypcie powłoki, który używa parametrów wejściowych dla parametrów liczb całkowitych (nie są potrzebne pojedyncze cudzysłowy wokół wartości):
Lub z dowolnym typem danych:
-c
wykonuje jeden ciąg polecenia, a następnie kończy działanie. Więcej informacji o argumentach psql w wierszu poleceń w podręczniku .źródło
Aby dodać kolejną funkcjonalność dla
-v
... Jeśli próbujesz dodać cytat, dodaj go w wierszu polecenia:i to uruchomi kod dla:
Taki sam jak
źródło
Spróbuj
-v
:Jeśli chcesz użyć
current_setting
iSET
lubsetval
, musisz dodać wiersz,postgresql.conf
aby dodać opcję.źródło
Z mojego doświadczenia, wyrejestrowanie zmiennej psql w deklaracji plpgsql, takiej jak w CREATE FUNCTION BEGIN lub DO BEGIN, powoduje błąd składniowy:
Moim rozwiązaniem jest utworzenie tabeli tymczasowej z jedną kolumną i zapisanie w niej wartości. Ta tabela tymczasowa jest dostępna przez plpgsql, a zatem mogę przekazać zmienne psql używane w blokach DO.
Aby użyć dodatkowych zmiennych psql w deklaracjach CREATE FUNCTION lub DO, możesz utworzyć kolumnę dla potrzebnej zmiennej.
źródło
Nie jest to zbyt eleganckie, ale działa (pseudokod):
źródło
Takie podejście zapewni pełną rozdzielczość w czasie wykonywania zmiennych env ... tak więc, jak tylko skrypt ustawi wcześniej wszystkie zmienne powłoki poniżej, zadziała ( został uruchomiony tysiące razy na różnych dbs i hostach ):
źródło