Row wise initialized variable in OBIEE 11g and VALUELISTOF function

OBIEE 11g版本中解决了早前版本关于会话变量初始化的限制,允许使用已初始化的会话变量来进一步初始化其他的会话变量。例如,在初始化了名为“REGION”的会话变量后,可以使用它来获取所有属于这些区域的账户列表。
 

OBIEE up to 10g had a limitation around session variables which are row wise initialized ,in that you cannot use that variable to initialize another subsequent session variable.  Good news!! 11g seems to have a fix for this.

For e.g. lets say you have a session (row wise initialized)  variable called “REGION” initialized as follows

select ‘REGION_LIST’ ,region_id from region_table.

Now lets say you want to initialize another row wise initialized variable based on the ‘REGION_LIST’ variable you had initialized earlier. For e.g. all the accounts belonging to the ‘REGION_LIST’ variable.

Here is the new way of doing it in  11g

select ‘ACCOUNT_LIST’ ,account_id from accounts where

region_id in (VALUELISTOF(NQ_SESSION.REGION_LIST)).

Keep in mind this will go back to the database as an in list, coma separated and the values would be in single quotes.

<think> 我们正在解决在VS2010下嵌入Python3.5解释器时出现的链接错误:`unresolved external symbol __imp_Py_IsInitialized referenced in function`。这个错误通常是由于链接器无法找到对应的Python库中的符号定义。 根据引用[1][4]中提到的类似问题,我们可以推断: 1. 该错误属于链接错误(LNK2001或LNK2019),表示链接器在链接时找不到函数的具体实现。 2. 在嵌入Python时,我们使用了`Py_IsInitialized`函数,这个函数在Python的头文件中有声明,但在链接时没有找到对应的库文件。 具体原因和解决方案如下: **原因分析:** 1. **未正确链接Python库**:在项目设置中,我们可能没有将`python35.lib`(或`python35_d.lib`用于调试版本)添加到附加依赖项中。 2. **库版本不匹配**:我们可能在Debug配置下使用了Release版本的Python库(或反之)。在Debug配置中,我们应该链接`python35_d.lib`(如果存在的话),但请注意,Python官方提供的Windows版本通常不提供调试库。因此,通常我们使用Release版本的库,并调整项目的运行时库设置。 3. **运行时库设置不匹配**:Python的Windows版本通常使用`/MD`(多线程DLL)运行时库编译。如果我们的项目设置使用`/MT`(多线程静态库),则会导致链接错误。 **解决方案:** **步骤1:确认Python库的链接** - 在项目属性中,转到“链接器”->“输入”->“附加依赖项”,确保添加了`python35.lib`(对于Release和Debug配置,通常都使用同一个,因为Python官方没有提供`python35_d.lib`)。 - 检查库目录:在“VC++目录”->“库目录”中,确保包含了Python35安装目录下的`libs`文件夹(例如:`C:\Python35\libs`)。 **步骤2:调整运行时库设置** - 在项目属性中,转到“C/C++”->“代码生成”->“运行时库”: - 对于Release配置,选择“多线程DLL (/MD)” - 对于Debug配置,选择“多线程调试DLL (/MDd)” 注意:如果Python官方提供的库是使用`/MD`编译的(通常如此),那么我们必须使用相同的运行时库。如果我们使用`/MT`或`/MTd`,则会导致链接错误。 **步骤3:检查Python安装路径是否在系统PATH中** - 确保Python35的安装目录(包含`python35.dll`的目录,例如`C:\Python35`)已经添加到系统的PATH环境变量中。这样,在运行程序时系统可以找到`python35.dll`。 **步骤4:检查头文件和库的版本匹配** - 确保我们包含的头文件(`Python.h`)和链接的库(`python35.lib`)来自同一个Python安装(相同版本,相同构建)。 **步骤5:处理调试符号(如果必要)** - 由于Python官方发布的Windows版本不提供调试库(`python35_d.lib`),因此我们不要在Debug配置中尝试使用调试库。如果项目在Debug配置下,我们仍然使用`python35.lib`,但需要确保运行时库设置为`/MDd`(如上所述)。 **步骤6:重新生成项目** - 执行清理解决方案,然后重新生成。 **步骤7:如果问题仍然存在** - 如果按照上述步骤操作后仍然出现同样的链接错误,我们可以尝试在附加依赖项中显式指定库的完整路径(避免库目录设置不正确)。例如:`C:\Python35\libs\python35.lib`。 - 另外,检查是否有其他链接器错误,可能第一个错误引发后续错误。 **代码示例:** 以下是一个简单的嵌入Python的C++程序,用于测试: ```cpp #include <Python.h> #include <iostream> int main() { // 初始化Python解释器 Py_Initialize(); if (Py_IsInitialized()) { std::cout << "Python interpreter initialized successfully." << std::endl; // 执行一条简单的Python语句 PyRun_SimpleString("print('Hello from Python!')"); // 关闭解释器 Py_Finalize(); } else { std::cerr << "Failed to initialize Python interpreter." << std::endl; } return 0; } ``` **注意事项:** 1. 在VS2010中,由于Python3.5是使用较新的Visual Studio(如VS2015)编译的,因此我们需要安装相应的运行时库(Visual C++ Redistributable for Visual Studio 2015)才能运行程序。 2. 在调试时,如果出现与`__imp_Py_IsInitialized`类似的链接错误,请按照上述步骤检查。 如果还有问题,请检查错误信息中是否还有其他未解析的符号,并按照同样的方法解决。 ### 相关问题 1. 如何解决嵌入Python时出现的`Py_Initialize`失败问题? 2. 如何在C++中调用Python函数并传递参数? 3. 如何将C++对象暴露给Python使用? 4. 在嵌入式Python中如何处理多线程? 5. 如何捕获Python解释器的标准输出和错误输出? [^1]: [LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize问题解决](https://example.com/link1) [^4]: [error LNK2019: unresolved external symbol __imp___pctype referenced in function类问题的解决方案](https://example.com/link4) </think> ### 解决VS2010嵌入Python3.5的`__imp_Py_IsInitialized`链接错误 #### 问题原因分析 当出现`unresolved external symbol __imp_Py_IsInitialized`链接错误时,通常由以下原因导致: 1. **库链接配置错误**:项目未正确链接Python导入库`python35.lib` [^1] 2. **调试/发布版本冲突**:Debug模式使用了Release版的Python库(或反之) 3. **运行时库不匹配**:C++项目的运行时库设置与Python库编译选项不一致 #### 完整解决方案 ##### 步骤1:确认基础配置 确保已正确配置Python路径: 1. 项目属性 → VC++目录 → 包含目录:添加`C:\Python35\include` 2. 项目属性 → VC++目录 → 库目录:添加`C:\Python35\libs` ##### 步骤2:解决符号解析错误 ```diff // 项目属性 → 链接器 → 输入 → 附加依赖项 + python35.lib + legacy_stdio_definitions.lib // 关键修复[^4] ``` ##### 步骤3:运行时库匹配设置 ```mermaid graph TD A[项目配置] --> B{是否为Debug模式?} B -->|是| C[使用/MDd运行时库] B -->|否| D[使用/MD运行时库] C --> E[链接python35.lib] D --> E ``` 1. 项目属性 → C/C++ → 代码生成 → 运行时库: - **Debug配置**:选择`多线程调试DLL (/MDd)` - **Release配置**:选择`多线程DLL (/MD)` ##### 步骤4:添加兼容性定义 在预处理器定义中添加: ``` ;PYTHON35;Py_BUILD_CORE;_CRT_SECURE_NO_WARNINGS ``` ##### 步骤5:环境变量配置 确保Python35.dll在系统PATH中: 1. 创建`set_env.bat`启动脚本: ```bat @echo off set PATH=C:\Python35;%PATH% start YourApp.exe ``` ##### 最终代码验证 ```cpp #include <Python.h> #include <cstdio> int main() { // 手动加载Python DLL(可选) HMODULE hPython = LoadLibrary(L"python35.dll"); if(!hPython) { printf("Error loading Python35.dll\n"); return 1; } // 初始化解释器 if(Py_IsInitialized()) { // 此时应无链接错误 printf("Python already initialized\n"); } else { Py_Initialize(); printf("Python initialized\n"); PyRun_SimpleString("print('Hello from Python!')"); Py_Finalize(); } FreeLibrary(hPython); return 0; } ``` #### 常见错误排查表 | 错误现象 | 解决方案 | |---------|---------| | **LNK2019** | 检查`legacy_stdio_definitions.lib`是否添加 | | **Py_Initialize崩溃** | 确保PATH包含Python35.dll目录 | | **导入模块失败** | 添加`PySys_SetPath(L"./python_modules")` | | **内存泄漏** | 使用`_CrtDumpMemoryLeaks()`检测 | > **重要提示**:Python 3.5使用VS2015编译,必须安装[Visual C++ 2015 Redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=48145) #### 相关问题 1. 如何解决嵌入Python时的`LNK2001: __imp_Py_Finalize`错误? 2. 为什么Debug模式下需要特殊的Python库配置? 3. 如何检测Python解释器的内存泄漏? 4. Python 3.5与VS2010的ABI兼容性问题如何解决? 5. 如何在嵌入式Python中加载第三方包? [^1]: LNK2001错误通常由库链接问题引起 [^4]: legacy_stdio_definitions.lib提供旧版标准库兼容支持
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值