Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在oracle中创建表函数,在FETCH cursor和INTO变量之间发现类型不匹配_Oracle_Function_Plsql_Types - Fatal编程技术网

无法在oracle中创建表函数,在FETCH cursor和INTO变量之间发现类型不匹配

无法在oracle中创建表函数,在FETCH cursor和INTO变量之间发现类型不匹配,oracle,function,plsql,types,Oracle,Function,Plsql,Types,我正在尝试创建一个表函数,以便在tableau的自定义SQL中使用,但我遇到了一个错误,在FETCH cursor和INTO变量之间发现了类型不匹配。下面是我正在尝试的代码,我已经创建了一个类型对象和该类型对象的表。函数my_fct应返回带有select语句输出的表 CREATE OR replace type DATA_OBJ AS OBJECT ( id varchar2(10) ); CREATE OR replace type DATA_OBJ

我正在尝试创建一个表函数,以便在tableau的自定义SQL中使用,但我遇到了一个错误,在FETCH cursor和INTO变量之间发现了类型不匹配。下面是我正在尝试的代码,我已经创建了一个类型对象和该类型对象的表。函数my_fct应返回带有select语句输出的表

CREATE
    OR replace type DATA_OBJ AS OBJECT (
     id varchar2(10)

    );  

CREATE
    OR replace type 
DATA_OBJ_TAB AS TABLE OF DATA_OBJ;


CREATE OR REPLACE FUNCTION my_fct()
    RETURN DATA_OBJ_TAB PIPELINED 
AS
    TYPE CurTyp IS REF CURSOR RETURN DATA_OBJ_TAB%ROWTYPE;
    rc CurTyp;

    CURSOR data IS SELECT ID from alumni_data;

BEGIN
    FOR rc IN data LOOP
        PIPE ROW (rc);
    END LOOP;
END;

请看以下示例:

SQL> create or replace type data_obj as object
  2    (id varchar2(10));
  3  /

Type created.

SQL> create or replace type
  2    data_obj_tab as table of data_obj;
  3  /

Type created.

SQL> create or replace function my_fct
  2    return data_obj_tab pipelined
  3  as
  4    l_vc data_obj := data_obj(null);
  5  begin
  6    for cur_r in (select id from alumni_data) loop
  7      l_vc.id := cur_r.id;
  8      pipe row (l_vc);
  9    end loop;
 10    return;
 11  end;
 12  /

Function created.

SQL> select * from table(my_fct);

ID
----------
CLARK
KING
MILLER

SQL>

请看以下示例:

SQL> create or replace type data_obj as object
  2    (id varchar2(10));
  3  /

Type created.

SQL> create or replace type
  2    data_obj_tab as table of data_obj;
  3  /

Type created.

SQL> create or replace function my_fct
  2    return data_obj_tab pipelined
  3  as
  4    l_vc data_obj := data_obj(null);
  5  begin
  6    for cur_r in (select id from alumni_data) loop
  7      l_vc.id := cur_r.id;
  8      pipe row (l_vc);
  9    end loop;
 10    return;
 11  end;
 12  /

Function created.

SQL> select * from table(my_fct);

ID
----------
CLARK
KING
MILLER

SQL>

这可以通过打包的PTF实现,而完全不使用SQL数据类型

大概是这样的:

create table alumni_data (id, memo) as
    select rownum id, 'memo '||rownum from dual connect by level<=3
/
create or replace package pack as
    type arrT is table of alumni_data%rowtype;
    function get (c varchar2) return arrT pipelined;  
end;
/
create or replace package body pack as
    function get (c varchar2) return arrT pipelined is
        arr arrT; 
    begin 
        select * bulk collect into arr
        from alumni_data
        where memo like c||'%';

        for i in 1..arr.count loop
            pipe row (arr(i));  
        end loop;
        return;
    end;
end;
/

这可以通过打包的PTF实现,而完全不使用SQL数据类型

大概是这样的:

create table alumni_data (id, memo) as
    select rownum id, 'memo '||rownum from dual connect by level<=3
/
create or replace package pack as
    type arrT is table of alumni_data%rowtype;
    function get (c varchar2) return arrT pipelined;  
end;
/
create or replace package body pack as
    function get (c varchar2) return arrT pipelined is
        arr arrT; 
    begin 
        select * bulk collect into arr
        from alumni_data
        where memo like c||'%';

        for i in 1..arr.count loop
            pipe row (arr(i));  
        end loop;
        return;
    end;
end;
/