预编译SQL需要依照不同数据库的方言来编写SQL:
Postgres用$数字
作为占位符:update 商品 set 价格 = $2 where id = $1
。
MySQL用?
作为占位符:update 商品 set 价格 = ? where id = ?
。
SQL Server用@变量
作为占位符:update 商品 set 价格 = @价格 where id = @id
。
Oracle用:变量
作为占位符:update 商品 set 价格 = :价格 where id = :id
。
Postgres和MySQL用limit
:select * from 商品 order by id limit 50 offset 25
。
SQL Server和Oracle用fetch next
:select * from 商品 order by id offset 25 rows fetch next 50 rows only
。
从上面的占位方言可以知道:
Postgres和MySQL需要数组类型的占位值与对应下标的占位符相匹配,Postgres的参数数组的下标+1对应占位符的数字,MySQL的参数数组的下标对应占位符所在语句中的顺序,如:$sql.SQL名({ v: [1747294460000000, 99] })
:把指定id的商品价格改为99元;
SQL Server和Oracle需要对象类型的占位值与对应键的占位符相匹配,如:$sql.SQL名({ v: { id: 1747294460000000, 价格: 99 } })
。