带UDT的Oracle函数上的ORA-00932
我试图创建一个函数,但是我得到了以下错误带UDT的Oracle函数上的ORA-00932,oracle,plsql,Oracle,Plsql,我试图创建一个函数,但是我得到了以下错误 LINE/COL ERROR -------- ----------------------------------------------------------------- 12/3 PL/SQL: SQL Statement ignored 12/18 PL/SQL: ORA-00932: inconsistent datatypes: expected UDT got NUMBER 代码是: CREATE TYPE join_t
LINE/COL ERROR
-------- -----------------------------------------------------------------
12/3 PL/SQL: SQL Statement ignored
12/18 PL/SQL: ORA-00932: inconsistent datatypes: expected UDT got NUMBER
代码是:
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;
/
我怎样才能解决这个问题
它在Oracle 11g上运行
提前谢谢 您的函数出现了相同的错误,mate:LINE/COL error--------------------------------------------5/3 PL/SQL:SQL语句忽略了5/24 PL/SQL:ORA-00932:不一致的数据类型:预期的数量得到了blob此项成功,但。。。创建或替换函数knn_join RETURN number IS curs cur_fv_table IS SELECT id,fv FROM londonfv,其中id@Siqueira已更新-函数将不会按您的预期工作,因为循环的每次迭代都会将join_表重新初始化为空集合,然后在下一次迭代再次清除之前为该迭代重新填充。大容量收集不会追加内容,而是替换内容。我知道这一点。该函数没有意义,因为它尚未完成。我打算将答案收集到retval表中。。。然后把它还给我。
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;
/
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;
/