Осторожнее, ребята. Написание действительно переносимого кода гораздо сложнее, чем вы думаете, и вы также должны быть готовы отказаться от многих аспектов производительности, простоты кодирования / обслуживания и читабельности. Просто объявите и используйте одну переменную, скажем, в SQL Server, и ваш код больше не будет действительно переносимым. Напишите триггер аудита, и я могу гарантировать, что ваш триггер не будет переносимым между Oracle, SQL Server и несколькими другими популярными механизмами. И это должно действительно иметь значение, потому что это на самом деле не ракетостроение ни в одной СУБД (ну, разве что для написания объединенного ОБНОВЛЕНИЯ в Oracle без использования MERGE {который является стандартным, но пока не переносимым}).
Кроме того, не забывайте, что есть два основных типа SQL. То, что поддерживает однорядную природу большинства интерфейсного кода и пакетного кода. Если вы действительно хотите, чтобы ваш пакетный код работал хорошо, вы будете использовать многие «проприетарные расширения» для механизма базы данных, который вы используете, чтобы эффективно обрабатывать иногда миллиарды строк в одночасье ... в ту же ночь. ; -)
Будьте внимательны при написании кода для «истинной» переносимости. У вас может получиться запутанный беспорядок, который намного медленнее, чем вы могли себе представить.