- ベストアンサー
postgresの関数内で変数からの時間の足し算
postgresの関数内で変数からの時間の足し算の仕方を教えてください。 DECLARE result timestamp with time zone; l_minuteinteger := 15; BEGIN result := current_timestamp + '15 minute'; RETURN result; END; このように 直接「 + '15 minute'」を足す方法は分かるのですが、 例えば、上記のユーザー変数l_minuteを使っての足し算がの仕方が分かりません。 よろしくお願いします。
- questorfe
- お礼率90% (19/21)
- PostgreSQL
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
以下の形で実現できると思います。 result := current_timestamp + '15 minute'; ↓ SELECT current_timestamp + CAST( l_minuteinteger || ' minute' AS interval ) INTO result;
関連するQ&A
- postgresのストアドファンクションでエラーの
postgresのストアドファンクションでエラーの拾い方を教えてください。 insertして重複したらアップデートに切り替えるというサンプルをよく見かけます。 DECLARE BEGIN insert文 RETURN TRUE; EXCEPTION WHEN unique_violation THEN update文 END; それと同じノリで、何かしらのエラーがあった時に、 『RETURN FALSE;』するか、もしくはエラーコードをそのまま拾って返すというようなサンプルが欲しいです。 DECLARE BEGIN 何かしらのSQL RETURN TRUE; EXCEPTION WHEN すべてのエラー THEN RETURN FALSE; END; DECLARE BEGIN 何かしらのSQL RETURN TRUE; EXCEPTION WHEN すべてのエラー THEN RETURN エラーコード; END;
- ベストアンサー
- PostgreSQL
- T-SQL ユーザ定義関数 指定したバイト数までの文字列を返したい
お世話になります。 SQLserver2005でユーザー定義関数に初めてトライしているのですが デバッグツールがなく、うまく動かない理由がわからず困っております。 ある文字列に対して、指定したバイト数までの文字を返すような関数を作りたいです。VBAでいうLEFT関数のバイト数指定版というのでしょうか。(すでにそんな関数があったりして。。) 以下のように作ってみたのですが、無限ループのようで、いつまでたってもデータが返ってきません。。どなたか教えていただけませんでしょうか? set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE FUNCTION [dbo].[LeftByte] (@value nvarchar,@maxbyte bigint) RETURNS nvarchar(max) AS BEGIN declare @Countvalue as bigint declare @byte as bigint declare @result as nvarchar select @byte = 0 select @Countvalue = 0 select @result = '' while @byte < @maxbyte begin select @Countvalue = (@Countvalue + 1) select @result = (left(@value,@Countvalue)) select @byte = (datalength(@result)) if @byte >= @maxbyte break else continue end RETURN @result END 宜しくお願い致します。
- ベストアンサー
- SQL Server
- PL/pgSQLの返り値の取得方法について
now()の結果を返すだけの以下の2つのPL/pgSQLを試しに作りました。SQL1は正しく結果が返ってきますが、SQL2は結果が何も返ってきません。どなたか説明できる方、いらっしゃいますでしょうか。宜しくお願い致します。 ■SQL1 CREATE OR REPLACE FUNCTION select_now1() RETURNS date AS $$ DECLARE d_current DATE := NULL; BEGIN SELECT INTO d_current now(); RETURN d_current; END; $$ LANGUAGE PLpgSQL; ■結果1 select_now1 ------------- 2011-03-19 (1 行) ■SQL2 CREATE OR REPLACE FUNCTION select_now2(OUT d_current date) AS $$ DECLARE d_current DATE := NULL; BEGIN SELECT INTO d_current now(); END; $$ LANGUAGE PLpgSQL; ■結果2 select_now2 ------------- (1 行)
- ベストアンサー
- PostgreSQL
- php×postgresでのストアド利用について
postgresで作成済みの手続き(ストアド)をphpから呼び出し結果を取得したいです。 ■スキーマ CREATE SCHEMA test AUTHORIZATION postgres; ■テーブル CREATE TABLE test.tbl1 ( item1 char(1), item2 int4 ) WITHOUT OIDS; ■ストアド CREATE OR REPLACE FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) AS $BODY$declare begin select current_date + in_para1 into ot_para1; select tablename from pg_tables into ot_para2; select * from test.tbl1 into ot_para3; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) OWNER TO postgres; サンプル的に下準備をしました。 この後、php側でこのストアドを呼び出すコードを教えて下さい。
- ベストアンサー
- PHP
- 変数の取り扱いについて
はじめまして。思いっきりSQLSERVERは初心者なんですが宜しくお願いします。 現在SQLSERVER2005です。 ややこしくなるので要点だけ以下まとめています。 変数を利用してレコードを抽出する時なんですが… ALTER PROCEDURE Test @Rank INT BEGIN DECLARE @SELECT AS VARCHAR(100) DECLARE @WHERE AS VARCHAR(100) DECLARE @SQL AS VARCHAR(200) SET @SELECT = 'SELECT * FROM tblA ' SET @WHERE = 'WHERE Rank > ' + @Rank SET @SQL = @SELECT + @WHERE EXEC(@SQL) END 実行すると varchar の値 'WHERE Rank > 'をデータ型 int に変換できませんでした。 となります。 Rank部分が数値なんですが、どのように取扱いすべきなんでしょうか。
- ベストアンサー
- SQL Server
- バインド変数について
PL/SQLのバインド変数について調べていますが理解できず困っています。 [理解内容] 1.利点 :SQL文の検索にバインド変数を利用すると、同一のSQLとして実行できる ⇒ 繰り返し処理(ループ)では有効 2.使用方法 :静的SQL・動的SQLで使用可能 [疑問点] 静的SQLではバインド変数をどう宣言すればよいですか? [SQL*Plus]・[動的SQL]は例文がありました ●SQL*Plusでの宣言方法 (例) SQL> set null '<null>' SQL> set head off SQL> variable var_at_sqlplus number ●動的SQLの記述方法 (例) declare v_sql varchar2(256); v_id varchar2(3); begin v_sql = 'select id into :v_id from test'; execute immediate v_sql into v_id; end; ●静的SQL ・・・【 エラーになる 】 declare variable v_id varchar2(3); begin select id into :v_id from test' end; どんな事でもかまいませんので回答よろしくお願いします
- ベストアンサー
- Oracle
- PL/SQLにてカーソル名を変数に
PL/SQLにて、カーソル名を変数にしたいのですが、どうすればよいのでしょうか? 具体的には以下のとおりです。 DECLARE CURSOR Cur1 IS SELECT K1,K2 FROM EMP; BEGIN FOR Cur_Rec1 IN Cur1 Cur_Rec1.K1 DBMS_OUTPUT.PUT_LINE(Cur_Rec1.K1); ★ END LOOP; END; ★の部分の「Cur_Rec1.K1」を「Cur_Rec1.K2」として、置き換えて使用したいのです。(2回書きたくない) 初心者で、申し訳ないです。どうか、ご教授ください。
- ベストアンサー
- Oracle
- 関数をまとめる
関数をつくるときにどうまとめれば良いのでしょうか? 例えば下のようなプログラムがあったとします. #include<iostream> int add(int, int); int multi(int, int); int main(void) { int a = 4; int b = 3; std::cout << add(a, b) << std::endl; std::cout << multi(a, b) << std::endl; } int add(int a, int b) { return a + b; } int multi(int a, int b) { return a * b; } add関数は足し算の結果,multi関数は掛け算の結果を返します. やっている内容はかわらずわざわざ2つに分ける必要があるか?と思ってしまいます. 要は, int arithmetic_operations(int a, int b, int pattern) { int result; switch(pattern) { case 1: result = a + b; break; case 2: result = a - b; break; case 3: result = a * b; break; case 4: if(0 == b) { exit(1); } result = a / b; break; default: break; } return result; } このような関数を用意してpattern変数で計算を制御するほうがまとまりがあると思います.ですが,いちいち中身を確認しながらプログラムを書く必要があるので可読性は低くなります. どちらがベターでしょうか?
- ベストアンサー
- C・C++・C#
- Oracleでミリ秒の加算
Oracleで秒以下の単位を含む加算の仕方を教えてください。 下記のサンプルでtargetTimeが0.5秒ずつ増えていくようにしたいのですがうまくいきません。 ちょっと書き方を変えればいいだけの事のような気がするのですが、いろいろ試したのですがうまくいきませんでした…。 よろしくお願いします。 SET SERVEROUTPUT ON FORMAT WRAPPED DECLARE targetTime TIMESTAMP(6) := TO_TIMESTAMP('2012/08/14 06:00:00', 'YYYY/MM/DD HH24:MI:SS'); vAddTime NUMBER(20, 10) := (1 / 86400) * 0.5; i integer := 0; BEGIN dbms_output.put_line('加算する値'); dbms_output.put_line(vAddTime); while (i < 10) loop dbms_output.put_line(targetTime); targetTime := targetTime + vAddTime; i := i + 1; end loop; END;
- ベストアンサー
- Oracle
- pl/pgsqlで変数の扱い
pl/pgsqlで変数が文字列として扱われてしまうのですがどうすればいいのでしょうか。 具体的には以下のような感じです。 CREATE OR REPLACE FUNCTION test_func() RETURNS VOID AS $$ DECLARE test_val TEXT ; ofs_num INTEGER := 0; lmt_num INTEGER := 0; t_name TEXT := 'schema1.table1'; BEGIN SELECT INTO ret_val * FROM t_name OFFSET ofs_num LIMIT lmt_num; END; $$ LANGUAGE plpgsql; 上記のofs_numやlmt_numは変数として認識してくれるのですが FROMに続く「t_name」が変数ではなくそのままの文字列として認識されてしまいます。 t_nameを変数として認識させる方法はありませんでしょうか。 教えていただけると助かりますm(_)m
- ベストアンサー
- PostgreSQL
お礼
有難うございます。 '15 minute' この部分は文字列ではなくて、intervalという名の時刻計算用の特殊属性なのですね。 やっと意味が分かってきました。 分割してみたらスッキリ理解できました。 l_minute_num integer := 15; l_minute_itv interval := CAST( l_minute_num || ' minute' AS interval ); result := current_timestamp + l_minute_itv; 値のセットの方法はあんまり関係なさそうです。