単純な実行ストアドプロシージャをポストグレス関数に変換しようとする-Currval( 'table_seq')を機能させることはできません
-
30-09-2019 - |
質問
MySQLストアドプロシージャは次のとおりです。
BEGIN
set @sql=_sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
set _ires=LAST_INSERT_ID();
END$$
私はそれを次のように変換しようとしました:
BEGIN
EXECUTE _sql;
SELECT INTO _ires CURRVAL('table_seq');
RETURN;
END;
エラーが発生します:
SQL error:
ERROR: relation "table_seq" does not exist
LINE 1: SELECT CURRVAL('table_seq')
^
QUERY: SELECT CURRVAL('table_seq')
CONTEXT: PL/pgSQL function "myexecins" line 4 at SQL statement
In statement:
SELECT myexecins('SELECT * FROM tblbilldate WHERE billid = 2')
使用されるクエリは、テスト目的のみです。この関数は、クエリから挿入または作成された行の行IDを取得するために使用されると思います。助言がありますか?
解決
シリアル列を使用してテーブルを作成すると、デフォルトでは、 tablename_columnname_seq
, 、しかし、あなたはアクセスしようとしているようです tablename_seq
. 。だから、テーブルが呼ばれています foobar
およびプライマリキー列 foobar_id
結局それはなります foobar_foobar_id_seq
.
ちなみに、a クリーナー 挿入後に主キーを取得する方法 RETURNING
句 INSERT
. 。例えば:
_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;
他のヒント
PostgreSQLは、「table_seq」と呼ばれるシーケンスがないと言っています。それが正しい名前だと確信していますか?使用する名前は、何があるかによって異なります _sql
それぞれとして SERIAL
また BIGSERIAL
独自のシーケンスを取得し、シーケンスを定義して手作業で配線することもできます。
とにかく、 lastval()
MySQLに近い一致です LAST_INSERT_ID()
, lastval()
現在のセッションの任意のシーケンスから最近返された値を返します。
lastval
現在のセッションでNextvalによって返された最近の値を返します。この関数は、シーケンス名を引数として取得する代わりに、現在のセッションでNextValが使用した最後のシーケンスの値を取得することを除いて、Currvalと同一です。 Nextvalが現在のセッションでまだ呼び出されていない場合、LastValを呼び出すのはエラーです。
使用 lastval()
また、何が入っているのか心配する必要がないことを意味します _sql
, 、もちろん、シーケンスをまったく使用しない限り。