首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-00932 on Oracle function with UDT

ORA-00932 on Oracle function with UDT
EN

Stack Overflow用户
提问于 2017-03-17 05:01:10
回答 1查看 1.4K关注 0票数 0

我正在尝试创建一个函数,但是我得到了以下错误。

代码语言:javascript
复制
LINE/COL ERROR
-------- -----------------------------------------------------------------
12/3     PL/SQL: SQL Statement ignored
12/18    PL/SQL: ORA-00932: inconsistent datatypes: expected UDT got NUMBER

代码是:

代码语言:javascript
复制
CREATE TYPE join_t IS OBJECT (
   inn     NUMBER(38),
   out     NUMBER(38)
);
/

CREATE TYPE join_jt IS TABLE OF join_t;
/

CREATE OR REPLACE FUNCTION knn_join RETURN number
IS
    CURSOR cur_fv_table IS SELECT id,fv FROM londonfv WHERE id <= 3000;

    retval join_jt := join_jt ();
    var_fv londonfv.fv%type;
    var_id londonfv.id%type;
    join_table join_jt := join_jt();
BEGIN
    OPEN cur_fv_table;
    LOOP
        FETCH cur_fv_table INTO var_id,var_fv;
        SELECT join_jt(r.id, var_id) BULK COLLECT INTO join_table
        FROM   londonfv r
        WHERE  manhattan_dist(r.fv,var_fv) <= 5;
    END LOOP;           
END;
/

Londonfv表>>

代码语言:javascript
复制
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ID                                        NOT NULL NUMBER(38)
PHOTOID                                            VARCHAR2(10)
FV                                                 BLOB

我该如何解决这个问题呢?

它在Oracle 11g上运行。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-17 05:48:44

代码语言:javascript
复制
CREATE TABLE londonfv (
 ID      NUMBER(38) NOT NULL,
 PHOTOID VARCHAR2(10),
 FV      BLOB
);

CREATE OR REPLACE TYPE join_t IS OBJECT (
   inn  NUMBER(38),
   out  NUMBER(38)
);
/

CREATE TYPE join_jt IS TABLE OF join_t;
/

CREATE OR REPLACE FUNCTION manhattan_dist(
  fv1 LONDONFV.FV%TYPE,
  fv2 LONDONFV.FV%TYPE
) RETURN NUMBER
IS
BEGIN
  RETURN 0;                              -- Implement this.
END;
/

CREATE OR REPLACE FUNCTION knn_join RETURN number
IS
  join_table join_jt;                    -- You don't need to initialise this BULK COLLECT will.
BEGIN
  SELECT join_t( b.id, a.id )            -- JOIN_T not JOIN_JT
  BULK COLLECT INTO join_table
  FROM   londonfv a
         INNER JOIN
         londonfv b
         ON ( manhattan_dist(a.fv,b.fv) <= 5 )
  WHERE  a.id <= 3000;

  RETURN 0;
END;
/
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42844699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档