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

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

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

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

Q&A

0回答

2302閲覧

pg_read_binary_file()関数を使用して、Windows上の画像ファイルをテーブルにインポートしたい

Yuetsuro

総合スコア5

PostgreSQL

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

0グッド

0クリップ

投稿2020/10/19 04:46

編集2020/10/19 07:02

【要約】pg_read_binary_file()関数を使用して、Windows上の画像ファイルをテーブルにインポートしたい。

やりたいこと:
事前に、テーブルから存在しないレコードをタイムスタンプをキーにSELECTを実行して、normal_recのカラム型を決定しておく。
record型の内部変数=normal_recのカラム名(=image)に、パス=image_data_path上の画像ファイルを取得する。
以下のコマンド入力で画像ファイルを取得できることは確認済みです。
# pg_read_binary_file('\raw_compressed.jpg')

→INSERTをEXECUTEで実行すると、"normal_rec.image"が存在しないというエラーになる。

質問:画像ファイルを取得する領域の"normal_rec.image"が存在しないエラーになっていますが、レコードが存在しない場合、permanent_tableのカラムを
normal_recで使用できないのでしょうか。

(1) 実行前の条件:下記テーブルを作成しておく。

-- 作成しておくテーブル create table v_image_table ( t_timestamp numeric (20,0), o_id character varying(255), v_number numeric (5,0), dates date, times time, v_name varchar (30), image_path character varying (255), image bytea, PRIMARY KEY(t_timestamp, o_id) );

(2) 下記を実行すると、
DECLARE
temporary_rec RECORD;
normal_rec record;
permanent_table_name VARCHAR(50);
...

BEGIN ... permanent_table_name := 'v_image_table'; execute_sql := concat('SELECT * FROM ', permanent_table_name, ' WHERE t_timestamp = ', temporary_rec.w_t_timestamp); RAISE NOTICE 'get_image() DEBUG 8123 : execute_sql = %', execute_sql; EXECUTE execute_sql INTO normal_rec; ... execute_sql := concat('SELECT * FROM permanent_table WHERE w_timestamp = temporary_rec.w_timestamp); EXECUTE execute_sql INTO normal_rec; CASE diagnostics_count WHEN 0 THEN -- 'path'のpngファイルをnormal_rec.image(bytea型)に入れる execute_sql := 'INSERT INTO normal_rec.image' || ' VALUES(pg_read_binary_file(' || '''' || image_data_path || '''' || '))'; EXECUTE execute_sql; ...

(3) 以下のように"normal_rec.image"が存在しないというエラーになってしまいます。
ERROR: relation "normal_rec.image" does not exist
LINE 1: INSERT INTO normal_rec.image VALUES(pg_read_binary_fi...
^
QUERY: INSERT INTO normal_rec.image VALUES(pg_read_binary_file('\raw_compressed.jpg'))
CONTEXT: PL/pgSQL function get_image() line 210 at EXECUTE

※すみません、初めて登録して質問しました。
postgresqlタグを作成後、Web画面上部に「トップ > PostgreSQLに対する質問 My PostgreSQL」と表示されていたのでタグを指定して質問していると
思っていました。

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

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

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

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

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

coco_bauer

2020/10/19 05:47

「カラムの型を確定するため、存在しないレコードをタイムスタンプをキーにSELECTを実行しておき」というのは、どのような操作を意味するのですか? 「record型の内部変数=normal_recのカラム名=image」というのは、どこでどのように定義されているのでしょうか?  relation "normal_rec.image" does not existというエラーが出ているので、レコードとかカラムの定義(宣言?)に問題があると思われますので、詳細な仕様を示してください。
Orlofsky

2020/10/19 06:09

PL/pgSQLでは? タグを追加した方が適切な回答が付きやすいのでは?
Yuetsuro

2020/10/20 05:51

pg_read_binary_file()関数を使用して、Windows上の画像ファイルをテーブルにインポートする方法は、解決しました。 bynaryファイルを内部変数のカラムにセットする方法は、SELECTやINSERTを考える必要がなく、単に「pg_read_binary_file(image_data_path);」を実行して値をカラム変数に代入するだけでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問