محاولة تحويل الإجراء المخزن التنفيذ البسيط إلى وظيفة postgres - لا يمكن الحصول على 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')
الاستعلام المستخدم هو لأغراض الاختبار فقط. أعتقد أن هذه الوظيفة تستخدم للحصول على معرف الصف للصف المدرج أو الإنشاء من الاستعلام. أي اقتراحات؟
المحلول
عندما تقوم بإنشاء جداول مع الأعمدة التسلسلية ، يتم تسمية التسلسلات بشكل افتراضي ، باسم tablename_columnname_seq
, ، ولكن يبدو أنك تحاول الوصول tablename_seq
. لذلك مع طاولة تسمى foobar
وعمود المفتاح الأساسي foobar_id
ينتهي الأمر foobar_foobar_id_seq
.
بالمناسبة ، أ منظف طريقة للحصول على المفتاح الأساسي بعد إدراج استخدام 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 في الجلسة الحالية. هذه الوظيفة مطابقة لـ Currval ، باستثناء أنه بدلاً من أخذ اسم التسلسل كوسيطة ، فإنها تجلب قيمة التسلسل الأخير الذي يستخدمه NextVal في الجلسة الحالية. إنه خطأ في الاتصال بـ LastVal إذا لم يتم استدعاء Nextval بعد في الجلسة الحالية.
استخدام lastval()
يعني أيضًا أنه لا داعي للقلق بشأن ما يوجد _sql
, ، ما لم يكن بالطبع لا يستخدم تسلسل على الإطلاق.