我有一些SQL Server的原始SQL查询,它们使用SCOPE_IDENTITY在一次执行INSERT后立即检索特定INSERT的生成ID ...
INSERT into Batch(
BatchName,
BatchType,
Source,
Area
) Values (
@strBatchName,
@strType,
@strSource,
@intArea
);
SELECT SCOPE_IDENTITY() BatchID;
Run Code Online (Sandbox Code Playgroud)
问题是:
对Oracle数据库执行此操作的最佳方法是什么?
这可以通过标准SQL在Oracle上完成,还是我必须将其切换为使用存储过程并在存储过程的主体中放置类似的东西?
如果它必须是存储过程,那么检索最后生成的序列号的事实上的标准方法是什么,注意考虑在多个线程上可能存在重叠执行,因此该机制需要检索正确生成的ID和不一定是绝对最后生成的ID.
如果两个同时执行,则每个必须从每个相应的呼叫返回正确的生成ID.注意我没有使用SQL Server的"@@ IDENTITY",因为调用的多线程特性.
如果可能的话,我宁愿将其保留为原始SQL,因为我更容易跨平台管理(包含由DBMS识别标签分隔的每个平台的SQL块的单个文件).存储过程对我来说要管理的工作要多一点,但如果这是唯一可能的话,我可以这样做.
我有一个项目,可以在多个平台上编译...... Windows,Unix,Linux,SCO,命名你的风味.
我想将输出目标的名称填入项目源代码中的变量(输出程序的名称,DLL,SO库或其他),所以我可以在消息中使用它作为引用组件名称的通用方法Windows上的EXE,DLL,Unix上的SO库等.
我正在考虑的是像FUNCTION _ 这样的预处理器密钥,但是在Visual C++中将Windows上的EXE/DLL的名称拉出来,然后是GCC中的SO输出库.当然,这些可能是两种不同的机制,但我想把这两种机制合并为一个选项,我可以在我的多平台代码中使用.
所以我可以调用一个宏观的东西,或者至少在编译期间选择Windows输出文件名(Visual C++),这样我就可以将它推入代码中的const字符串,也许是一种方法来做同样的事情. GCC因此可以将两个平台包装成单个抽象.最好不要在运行时拾取,但在编译期间捕获并保留.
如果输出是库,那么它的lib文件名.如果它是一个组件,那么输出组件文件名.
我希望Boost或Poco必须有这样的东西,可能有一些不受支持的端点,这很好.