محاولة تحويل الإجراء المخزن التنفيذ البسيط إلى وظيفة postgres - لا يمكن الحصول على 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')

الاستعلام المستخدم هو لأغراض الاختبار فقط. أعتقد أن هذه الوظيفة تستخدم للحصول على معرف الصف للصف المدرج أو الإنشاء من الاستعلام. أي اقتراحات؟

هل كانت مفيدة؟

المحلول

عندما تقوم بإنشاء جداول مع الأعمدة التسلسلية ، يتم تسمية التسلسلات بشكل افتراضي ، باسم 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, ، ما لم يكن بالطبع لا يستخدم تسلسل على الإطلاق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top