質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

171閲覧

Invalid argument となる原因

tefutefute-fu

総合スコア1

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

1クリップ

投稿2025/06/05 06:44

CSVファイルを読み込んでpostgreSQLのデータベーステーブルにデータを追加する処理を実行したいです。

batファイルを実行してpostgreSQLのデータベーステーブルをtruncate文でデータを削除した後、
CSVのデータを取り込むプログラムを作っているんですが、データ取り込みの段階でどうしてもエラーが出ます。

エラーメッセージ
psql:C:/Users/Administrator/Desktop/renkeitest/sql/import_atena.sql:2: :: Invalid argument

該当のソースコード

sqlファイルの中身
\echo :csvdir
\COPY bch154610.tcat_atena FROM :'csvdir' WITH (FORMAT csv, HEADER, ENCODING 'UTF8');

試したこと

\echo :csvdirでファイルパスを確認していますが、ファイルの存在も確認できています。
FROM句に\echoで出力されたファイルパスを直接記述すると処理が実行できました。
batファイルを実行したところ、TRUNCATEの処理までは実行できていたのでデータベース自体には
接続もできているはずです。
%ATENACSV%をダブルクォーテーションで囲んでみたりもしましたがうまくいきませんでした。
変数で処理しようとするとどうしてもうまくいかないです。
投稿するのも初めてなのですが、よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

postgreSQLのバージョン psql (PostgreSQL) 11.5

batファイルのソースコード
@echo off
setlocal
chcp 65001 > nul

rem postgre 接続情報
set HOST=****
set PORT=****
set DBNAME=****
set NLS_LANG=Japanese_Japan.JA16SJIS
set PGCLIENTENCODING=UTF8

set USER=****
set PGPASSWORD=****

rem CSVファイルの出力先フォルダ
set "CSVDIR=C:\Users\Administrator\Desktop\renkeitest\csv"

rem logファイルの出力先フォルダ
set "LOGDIR=C:\Users\Administrator\Desktop\renkeitest\log"

rem バッチファイルのあるディレクトリを取得
set "BASE_DIR=%~dp0"

rem SQLファイル名
set "IMPORT_ATENA=%BASE_DIR%sql\import_atena.sql"

rem 連携ファイル名
set "ATENACSV=%CSVDIR%\ATENA.csv"

for /f "tokens=1-3 delims=/" %%a in ("%DATE%") do (
set YYYY=%%a
set MM=%%b
set DD=%%c
)
set "TODAY=%YYYY%%MM%%DD%"

rem ログファイル名を日付入りに
set "LOGFILE=%LOGDIR%\import_log_%TODAY%.log"

echo 処理を開始

echo [%DATE% %TIME%] 開始 >> %LOGFILE%

echo テーブルの初期化を実行中…

rem 宛名テーブルのデータ削除
echo [%DATE% %TIME%] テーブルを初期化中... >> %LOGFILE%
psql -v ON_ERROR_STOP=1 -h %HOST% -p %PORT% -U %USER% -d %DBNAME% -c "TRUNCATE TABLE bch154610.tcat_atena;" >> %LOGFILE% 2>&1
if %errorlevel%==0 (
echo 宛名テーブルの初期化に成功
echo [%DATE% %TIME%] 宛名テーブルの初期化に成功 >> %LOGFILE%
) else (
echo 宛名テーブルの初期化に失敗
pause
exit /b 1
)

echo テーブルの初期化を完了
set "ATENACSV=%ATENACSV:=/%"
echo %ATENACSV%

echo CSVデータを取り込み中…

rem CSVデータの取り込み
echo [%DATE% %TIME%] CSVインポート開始 >> %LOGFILE%
psql -v ON_ERROR_STOP=1 -h %HOST% -p %PORT% -U %USER% -d %DBNAME% -v csvdir=%ATENACSV% -f %IMPORT_ATENA% >> "%LOGFILE%" 2>&1

if %errorlevel%==0 (
echo 宛名テーブルの連携に成功
) else (
echo 宛名テーブルの連携に失敗
pause
exit /b 1
)

echo CSVデータのインポートが完了しました。
pause

endlocal
exit /b

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2025/06/05 08:50

COPYコマンドですが、FROMにファイルでなくフォルダを指定しているように見えますが、意図通りですか?
tefutefute-fu

2025/06/06 04:40

COPYコマンドのFROMには、CSVファイルのパスを指定しています。COPYコマンドの前の「\echo :csvdir」でファイルパスをログに出力するようにしています。ログに出力されたファイルパスをCOPYコマンドのFROMに直接記述すると実行できました。変数でやろうとするとどうしてもうまくいかないです。 以下にログの中身を記述します。 [2025/06/06 13:35:03.74] 開始 [2025/06/06 13:35:03.74] テーブルを初期化中... TRUNCATE TABLE [2025/06/06 13:35:03.80] 宛名テーブルの初期化に成功 [2025/06/06 13:35:03.80] CSVインポート開始 C:/Users/Administrator/Desktop/renkeitest/csv/TCat_ATENA.csv psql:C:/Users/Administrator/Desktop/renkeitest/sql/bochi_import_atena.sql:2: :: Invalid argument
tefutefute-fu

2025/06/06 05:20

そもそも使えなかったんですね。 わざわざ回答いただきありがとうございました。 回避策を参考にして作り直したいと思います。
guest

回答1

0

自己解決

YT0014様
コメントいただきありがとうございます。
また一から作り直したいと思います。

投稿2025/06/06 05:26

tefutefute-fu

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問