【发布时间】:2021-12-17 13:06:12
【问题描述】:
我正在使用 Oracle 11g 在 PL/SQL 上构建一个函数。
我正在尝试在 EXECUTE IMMEDIATE 语句中使用表变量,但它不起作用,如您所见:
ERROR at line 1:
ORA-00904: "CENTER_OBJECTS": invalid identifier
ORA-06512: at "HIGIIA.KNN_JOIN", line 18
我使用的代码是……
一、类型定义
CREATE TYPE join_t IS OBJECT (
inn char(40),
out char(40)
);
/
CREATE TYPE join_jt IS TABLE OF join_t;
/
CREATE TYPE blob_t IS OBJECT (
id CHAR(40),
fv BLOB
);
/
CREATE TYPE blob_tt IS TABLE OF blob_t;
/
函数是:
create or replace FUNCTION knn_join (tab_inn IN varchar2, tab_out IN varchar2, blob_col1 IN varchar2, blob_col2 IN varchar2, dist_alg in VARCHAR2, kv in NUMBER ) RETURN join_jt
IS
var_fv BLOB;
var_id CHAR(40);
center_objects blob_tt := blob_tt();
retval join_jt := join_jt ();
join_table join_jt := join_jt();
sql_stmt1 varchar2(400);
sql_stmt2 varchar2(400);
BEGIN
sql_stmt1 := 'SELECT blob_t(ROWIDTOCHAR(rowid),' || blob_col1 || ') FROM ' || tab_out;
sql_stmt2 := 'SELECT join_t(ROWIDTOCHAR(r.rowid), center_objects(idx).id) FROM ' || tab_inn || ' r WHERE ' || dist_alg || '_knn(r.' || blob_col2 || ', center_objects(idx).' || blob_col1 || ')<=' || kv;
dbms_output.put_line(sql_stmt2);
EXECUTE IMMEDIATE sql_stmt1 BULK COLLECT INTO center_objects;
for idx in center_objects.first()..center_objects.last()
loop
--SELECT join_t(ROWIDTOCHAR(r.rowid), center_objects(idx).id) BULK COLLECT INTO join_table FROM londonfv r WHERE manhattan_knn(r.fv, center_objects(idx).fv) <=5;
EXECUTE IMMEDIATE sql_stmt2 BULK COLLECT INTO join_table;
for idx2 in join_table.first()..join_table.last()
loop
retval.extend();
retval(retval.count()) := join_table(idx2);
end loop;
end loop;
RETURN retval;
END;
/
运行函数:
select * from TABLE(knn_join('london','cophirfv','fv','fv','manhattan',5));
我正在尝试使用运行语句 'SELECT join_t(ROWIDTOCHAR(r.rowid), center_objects(idx).id) BULK COLLECT INTO join_table FROM london r WHERE manhattan_knn(r.fv, center_objects(idx).fv)
有人可以帮我看看吗?
提前致谢!
【问题讨论】:
-
center_objects是动态 SQL 上下文中不存在的本地 PL/SQL 变量。您可以用绑定变量替换第一个引用,但不能替换第二个。你为什么使用两个查询;为什么不使用单个查询进行连接,然后将其批量收集到retval? -
在这种情况下我不能使用连接,因为我使用的函数 (manhattan_dis) 只接受一个元素作为第二个参数,所以这就是我使用这个 'center_object' 的原因变量和两个语句。实际上,这就是我必须构建此功能的原因。
标签: sql oracle plsql execute-immediate