3

ファイルsqlに関数を定義するスクリプトがあります。create_database_function.sql

CREATE OR REPLACE FUNCTION increment_display_count(in_host_id int, in_host_owner_id int, in_date_ date) RETURNS void as $$
BEGIN
    UPDATE display_count set display_count = display_count + 1 
    WHERE host_id = in_host_id AND host_owner_id = in_host_owner_id AND date_ = in_date_;
    IF FOUND THEN
        RETURN;
    END IF;
    BEGIN
        INSERT INTO display_count (host_id, host_owner_id, date_, display_count) VALUES (in_host_id, in_host_owner_id, in_date_, 1);
    EXCEPTION WHEN OTHERS THEN
        UPDATE display_count set display_count = display_count + 1
                WHERE host_id = in_host_id AND host_owner_id = in_host_owner_id AND date_ = in_date_;
    END;
    RETURN;
END;
$$
LANGUAGE plpgsql;

Windowsで実行したい。そのために、通常のコマンドを実行します。

psql -h localhost -U postgres -d database -f create_database_function.sql

しかし、このスクリプトでは膨大な数の構文エラーが発生しました。1 時間のグーグル検索は実を結びませんでした。しかし、私はこのスクリプトをいじり続け、最終的に問題を発見しました。

解決策は、すべてのセミコロン;記号の先頭にバックスラッシュを追加することでした\

これで問題は解決しますが、別の問題が発生します。私は別の男と一緒にプロジェクトに取り組んでいます。しかし、彼は Linux で働いています。\彼の場合、スクリプトはセミコロンの前になければなりません。

では、なぜWindowsで先頭;にを付ける必要があるのでしょうか? \これを何とか回避したり、別の方法で行うことはできますか?

私はそれをたくさん探しましたが、同様の問題は見つかりませんでした。


アップデート

\;の代わりに使用した場合の出力;:

C:\Xubuntu_shared\pixel\pixel\src\main\scripts>psql -h localhost -U postgres -d
pixel_test -f create_database_function.sql
Password:
CREATE FUNCTION

バックスラッシュをエスケープせずにスクリプトを実行すると、エラーが出力されます。

C:\Xubuntu_shared\pixel\pixel\src\main\scripts>psql -h localhost -U postgres -d
pixel_test -f create_database_function.sql
Password:
psql:create_database_function.sql:4: ERROR:  unterminated dollar-quoted string a
t or near "$$
BEGIN
    UPDATE display_count set display_count = display_count + 1
    WHERE host_id = in_host_id AND host_owner_id = in_host_owner_id AND date_ =
in_date_;" at character 121
psql:create_database_function.sql:6: ERROR:  syntax error at or near "IF" at cha
racter 5
psql:create_database_function.sql:7: ERROR:  syntax error at or near "IF" at cha
racter 9
psql:create_database_function.sql:9: ERROR:  syntax error at or near "INSERT" at
 character 19
psql:create_database_function.sql:12: ERROR:  syntax error at or near "EXCEPTION
" at character 5
psql:create_database_function.sql:13: WARNING:  there is no transaction in progr
ess
COMMIT
psql:create_database_function.sql:14: ERROR:  syntax error at or near "RETURN" a
t character 5
psql:create_database_function.sql:15: WARNING:  there is no transaction in progr
ess
COMMIT
psql:create_database_function.sql:17: ERROR:  unterminated dollar-quoted string
at or near "$$
LANGUAGE plpgsql;" at character 1

その他の重要な情報:

create_database_function.sqlエンコーディングはUTF-8、なしBOM。行末は Windows 形式です。


更新 2

バージョン

pixel=> SELECT version();
                           version
-------------------------------------------------------------
 PostgreSQL 9.2.3, compiled by Visual C++ build 1600, 32-bit
(1 row)


pixel=>

アップデート 3

output of select name, setting, source from pg_settings where source <> 'default';コマンドからの出力:

Oleg@OLEG-PC /C/Xubuntu_shared/pixel/pixel/src/main/scripts (pixel-dev2)
$ psql -U postgres
Password:
Welcome to psql.exe 7.4.6, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

Warning: Console codepage (866) differs from windows codepage (1251)
         8-bit characters will not work correctly. See PostgreSQL
         documentation "Installation on Windows" for details.

postgres=# select name,setting,source from pg_settings where source <> 'default'
;
            name            |                       setting
   |        source
----------------------------+---------------------------------------------------
---+----------------------
 config_file                | C:/Program Files/PostgreSQL/9.2/data/postgresql.co
nf | override
 data_directory             | C:/Program Files/PostgreSQL/9.2/data
   | override
 DateStyle                  | ISO, MDY
   | configuration file
 default_text_search_config | pg_catalog.english
   | configuration file
 hba_file                   | C:/Program Files/PostgreSQL/9.2/data/pg_hba.conf
   | override
 ident_file                 | C:/Program Files/PostgreSQL/9.2/data/pg_ident.conf
   | override
 lc_collate                 | C
   | override
 lc_ctype                   | C
   | override
 lc_messages                | C
   | configuration file
 lc_monetary                | C
   | configuration file
 lc_numeric                 | C
   | configuration file
 lc_time                    | C
   | configuration file
 listen_addresses           | *
   | configuration file
 log_destination            | stderr
   | configuration file
 log_line_prefix            | %t
   | configuration file
 log_timezone               | Europe/Moscow
   | configuration file
 logging_collector          | on
   | configuration file
 max_connections            | 100
   | configuration file
 max_stack_depth            | 2048
   | environment variable
 port                       | 5432
   | configuration file
 server_encoding            | UTF8
   | override
 shared_buffers             | 4096
   | configuration file
 TimeZone                   | Europe/Moscow
   | configuration file
 transaction_deferrable     | off
   | override
 transaction_isolation      | read committed
   | override
 transaction_read_only      | off
   | override
 wal_buffers                | 128
   | override
(27 rows)
4

1 に答える 1

1

このまれな問題に遭遇する可能性がある人のために。

これは、Postgres サーバーとクライアントのバージョンの不一致に関連しています。私はバージョンのサーバーとバージョン9.2.3のクライアントを使用してい7.4.6ました。

Windows 用の Postgre インストーラーには既にpsqlクライアントが含まれていることに注意してください。したがって、別のものをインストールする必要はありません。

psql別のクライアントをインストールした理由は正確には覚えていませんが、コンソールから起動しなかったためだと思います。PosrgreSQLのインストール後にWindowsを再起動するか(このOSでは多くの問題がこの方法で解決されるため)、手動でパスpsql.exeを環境パス変数に追加することで解決できると思います。

したがって、同じ問題に直面した場合は、サーバーとクライアントのバージョンを確認してください。一致しない場合は、path 環境変数を元の PosgreSQL 出荷時の正しいクライアントに設定します。

于 2013-04-22T08:28:56.033 に答える