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

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

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

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

Q&A

解決済

5回答

41927閲覧

postgreSQLで変数を使用したい

EKD

総合スコア161

PostgreSQL

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

5グッド

1クリップ

投稿2016/01/20 07:44

編集2016/02/10 02:23

PostgreSQLにて、変数を使用したい

以下のSQL文を参照ください
UPDATE時に代入している現在時刻と、INSERT時に代入している現在時刻を全く同じ値にしたいのですが、
実際に、実行した場合にはINSERT時の時刻の方が少し遅れてしまいます

UPDATE "TableA" SET "unixtime" = extract(epoch from now()) WHERE "id" = 100; INSERT INTO "TableA" ("unixtime") VALUES (extract(epoch from now()));

そこで以下の様に変数を使用できればと思ったのですが、
変数の使用方法が調べたのですが見つけられませんでした

変数nowtime = extract(epoch from now()) UPDATE "TableA" SET "unixtime" = 変数nowtime WHERE "id" = 100; INSERT INTO "TableA" ("unixtime") VALUES (変数nowtime);

PostgreSQL ver9.3.6です

ストアドプロシージャを使わない方法で解決方法はあるのでしょうか?

よろしくお願いします

追記
申し訳ありません。上記の説明は解りにくかったようです
別のケースとして、下記コードのようなケースでも同様です

UPDATE "TableA" SET "unixtime" = extract(epoch from now()) WHERE "id" = 100; UPDATE "TableA" SET "unixtime" = extract(epoch from now()) WHERE "id" = 199; UPDATE "TableA" SET "unixtime" = extract(epoch from now()) WHERE "id" = 300; UPDATE "TableA" SET "unixtime" = extract(epoch from now()) WHERE "id" = 301; UPDATE "TableA" SET "unixtime" = extract(epoch from now()) WHERE "id" = 310; ...を1000個くらい INSERT INTO "TableA" ("unixtime") VALUES (extract(epoch from now())); INSERT INTO "TableA" ("unixtime") VALUES (extract(epoch from now())); INSERT INTO "TableA" ("unixtime") VALUES (extract(epoch from now())); ...を100個くらい

この時、全てのUPDATE、INSERT文に対し同じ時刻を渡したいのです

ちなみに上記のコードらの内容に意味はありません
ただの説明用です

lv_sane, arly_times, kozuchi, ikuwow👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/02/10 03:32

SQLを実行するときの環境・条件によっては、いろんな策が採れます。例えばphpから実行するとか、psql上でsqlファイルを読み込んで実行するとか。
EKD

2016/02/10 08:11

ご指摘ありがとうございます。 参考になります。 JavaからJDBCを利用している状況です java.sql.StatementのexecuteQueryを呼び出しています ご指摘のphp呼出しや、sqlファイルの読込なども良いと思います
guest

回答5

0

使ったことないけど、
psql で変数を扱う で、extract(epoch from now()) を変数に設定できるか試されては?
PL/pgSQL なら変数を使えるようです。

投稿2016/01/20 09:10

Orlofsky

総合スコア16415

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

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

EKD

2016/02/10 02:24

ご回答ありがとうございます。 ただ、ストアドプロシージャを使わない方法を模索しております。
guest

0

こんにちは。

時刻テーブルを作成してからUPDATE/INSERTを行ったらいかがでしょうか。

【例】
CREATE TABLE "TableB" ( "seconds" 型 );
INSERT INTO "TableB" ( "seconds" ) VALUES ( extract(epoch from now()) );
UPDATE "TableA" SET "unixtime" = ( SELECT "seconds" FROM "TableB" ) WHERE "id" = 100;
UPDATE "TableA" SET "unixtime" = ( SELECT "seconds" FROM "TableB" ) WHERE "id" = 199;
UPDATE "TableA" SET "unixtime" = ( SELECT "seconds" FROM "TableB" ) WHERE "id" = 300;
UPDATE "TableA" SET "unixtime" = ( SELECT "seconds" FROM "TableB" ) WHERE "id" = 301;
UPDATE "TableA" SET "unixtime" = ( SELECT "seconds" FROM "TableB" ) WHERE "id" = 310;
INSERT INTO "TableA" ("unixtime") SELECT "seconds" FROM "TableB";
INSERT INTO "TableA" ("unixtime") SELECT "seconds" FROM "TableB";
INSERT INTO "TableA" ("unixtime") SELECT "seconds" FROM "TableB";
DROP TABLE "TableB";

ごめんなさい、今手元に環境が無くて、
想像で回答させて頂いておりますので、微調整が必要かもしれません。

投稿2016/02/10 02:55

編集2016/02/10 02:59
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

EKD

2016/02/10 08:13

ご回答ありがとうございます。私にはその発想がありませんでした…。参考になりました。
guest

0

BEGIN; END;で挟んだ間の now()は、同じ値を指しますのでどうでしょうか?

投稿2017/03/21 09:37

A.Ichi

総合スコア4070

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

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

0

自己解決

すみません。自己解決しました。
今回のケースでは、JDBC呼出し部で対応できそうです。
ご回答ありがとうございました。

自分の頭を柔らかくする方法を質問するべきでした。失礼しました。

投稿2016/02/10 08:20

EKD

総合スコア161

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

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

0

やりたいことの全体像が見えないのでなんとも言い難いのですが、もしID=100がキーになっているなら、

INSERT INTO ... SELECT ... WEHRE ID=100

みたいな方法で泥臭くやるしか無いのでは無いでしょうか?

投稿2016/02/05 11:36

nobuhito

総合スコア146

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

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

EKD

2016/02/10 02:26

ご回答ありがとうございます。 私の説明が解りづらかったようですので、質問内容を追記しました
EKD

2016/02/10 08:41

ストアドプロシージャぽいですが参考になります。初めて知りましたBind変数。ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問