0

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 を取得するために使用されると思います。助言がありますか?

4

2 に答える 2

2

PostgreSQL は、「table_seq」と呼ばれるシーケンスがないと言っています。それが正しい名前であると確信していますか? _sql使用する名前は、それぞれに何が含まれているSERIALBIGSERIAL、独自のシーケンスを取得するかによって異なります。また、シーケンスを定義して手動で接続することもできます。

いずれにせよ、lastval()は MySQL の とよりよく一致しLAST_INSERT_ID()lastval()現在のセッションの任意のシーケンスから最後に返された値を返します。

lastval
現在のセッションで nextval によって最後に返された値を返します。この関数は、引数としてシーケンス名を受け取る代わりに、現在のセッションで nextval によって使用された最後のシーケンスの値を取得することを除いて、currval と同じです。現在のセッションで nextval がまだ呼び出されていない場合、lastval を呼び出すとエラーになります。

を使用するということは、もちろんシーケンスをまったく使用しない場合を除き、lastval()の内容を気にする必要がないことも意味します。_sql

于 2011-01-07T07:59:03.440 に答える
2

シリアル列を含むテーブルを作成すると、シーケンスはデフォルトで という名前になりますtablename_columnname_seqが、 にアクセスしようとしているようですtablename_seqfoobarしたがって、主キー列と呼ばれるテーブルでは、foobar_id最終的にはfoobar_foobar_id_seq.

ちなみに、挿入後に主キーを取得するよりクリーンなRETURNING方法は、 in 句を使用することINSERTです。例えば:

_sql = 'INSERT INTO sometable (foobar) VALUES (123) RETURNING sometable_id';
EXECUTE _sql INTO _ires;
于 2011-01-07T08:33:26.360 に答える