最近尝试用oracle数据库来开发,期望执行SQL如下:
select * from TABLE(testFunc(CURSOR(select * from EMP), ‘abc’))
要实现的testFunc函数有如下要求:
1. 在testFunc函数中要调用第三方C代码
2. 数据源不确定,可以为任意表,所以不能预先定义好一个表类型
3. testFunc函数的输出结果列数和数据类型都不确定,也就是说希望输出结果是一个动态表。
4. 要处理大数据,要求效率要高当然如果有另外的办法能提高效率也行,比如采用table UDF, 采用变参等,欢迎大家探讨。目前我采用将数据拼接成字符串,第三方代码解析后返回新的字符串,然后再解析出需要的列和数据类型,此法效率非常低下,盼望有人能给予帮助,非常感谢!PL/SQL, C语言, extprocPL/SQLC语言TABLE函数大数据

解决方案 »

  1.   

    顶一下,你要是改成ORACLE数据库的话,直接使用存储过程来返回结果集不行吗?
      

  2.   

    也想用存储过程,问题是必须得调用第三方的C代码来处理数据集并返回新的列,而对于oracle的external C procedure来说,好像不能传递动态参数,也不能返回动态结果集,所以在存储过程中可能还得调用C代码,然后一条一条记录处理,我一直企图找到一个批量传递数据的方法,不知道oracle有没有类似Netezza的那种table udf语法,以可变参数的形式传参并返回一个动态表。 例如:CREATE OR REPLACE FUNCTION TEST(VARARGS)
    RETURNS TABLE(ANY)
    LANGUAGE CPP
    ... ...如果要实现netezza这样的功能,oracle应该怎么做?
      

  3.   

    是的,问题就出在这个函数定义上了,因为这是一个通用方法, 还要调用第三方的C代码,而且针对不同数据源输出结果的列数不确定,没法提前定义一个返回表类型,目前采用字符串可以做,问题是效率很低,比如:
    create or replace library TESTLIB as 'C:\oraclexe\app\oracle\product\11.2.0\server\bin\testlib.dll';
    /create or replace function testFunc(id in varchar2, str in varchar2)
    return varchar2
    as
    language C
    name "test"
    library testlib
    with CONTEXT
    parameters(CONTEXT, id, str, return);
    /extern "C" 
    ORACLE_TEST char* test(OCIExtProcContext *ctxt, char* id, char* str) {
        ......
        return str;
    }select testFunc('abc', empno || ',' || ENAME || ',' || SAL) from EMP;最后解析函数返回的字符串。貌似oracle的extproc是这个问题的瓶颈。
    请问有没有什么办法能够提高效率?比如采用table或者数组什么的?