単純な実行ストアドプロシージャをポストグレス関数に変換しようとする-Currval( 'table_seq')を機能させることはできません

StackOverflow https://stackoverflow.com/questions/4623475

質問

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 クリーナー 挿入後に主キーを取得する方法 RETURNINGINSERT. 。例えば:

_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, 、もちろん、シーケンスをまったく使用しない限り。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top