我的问题是: 是否有一个类似UTL_MATCH的函数与aCLOB而不是a一起使用VARCHAR2?
UTL_MATCH
CLOB
VARCHAR2
我的特定问题是: 我在Oracle数据库上。我有一堆与Domo CenterView交互的预先编写的查询。查询中的变量由定义${variableName}。我需要重写这些查询。我没有写原始文档,所以不是想弄清楚变量的好值是什么,而是要使用应用程序运行查询并从中获取查询的内容V$SQL。
${variableName}
V$SQL
所以我的解决方法是: 做一个UTL_MATCH与它的可变填充和查询V$SQL.SQL_FULLTEXT。但是,UTL_MATCH仅限于VARCHAR2的数据类型V$SQL.SQL_FULLTEXT为CLOB。因此,这就是为什么我要寻找一个UTL_MATCH与CLOB数据类型一起使用的类似函数的原因。
V$SQL.SQL_FULLTEXT
任何其他有关如何完成此操作的技巧都值得欢迎。 谢谢!
编辑有关提示。 如果您对如何执行此操作有更好的了解,请让我告诉您一些我掌握的信息。我大约有100个查询,它们都在excel电子表格中(${variableName}其中包含)。因此,我可以很容易地使用excel为我编写查询。我希望将所有这些查询合并在一起,然后将输出复制到另一张纸上。无论如何,如果您认为有更好的方法可以这样做,那么这可能会有所帮助。
一个例子: 假设我有以下来自Domo的查询:
select department.dept_name from department where department.id = '${selectedDepartmentId}' ;
我想这样称呼:
select v.sql_fulltext from v$sql v where utl_match.jaro_winkler_similarity(v.sql_fulltext, 'select department.dept_name from department where department.id = ''${selectedDepartmentId}''') > 90 ;
得到这样的回报:
SQL_FULLTEXT ------------------------------------------ select department.dept_name from department where department.id = '154'
我尝试过的
我尝试将Clob放入子字符串并将其转换为varchar。我真的很希望这能够奏效,但是这给了我一个错误。这是代码:
select v.sql_fulltext from v$sql v where utl_match.jaro_winkler_similarity( cast( substr (v.sql_fulltext, 0, 4000) as varchar2 (4000)), 'select department.dept_name from department where department.id = ''${selectedDepartmentId}''') > 90 ;
这是错误:
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 8000, maximum: 4000)
但是,如果我运行此程序,它将正常工作:
select cast(substr(v.sql_fulltext, 0, 4000) as varchar2 (4000)) from v$sql v ;
所以我不确定强制转换子字符串是什么问题…
我最终为其创建了一个自定义函数。这是代码:
CREATE OR REPLACE function match_clob(clob_1 clob, clob_2 clob) return number as similar number := 0; sec_similar number := 0; sections number := 0; max_length number := 3949; length_1 number; length_2 number; vchar_1 varchar2 (3950); vchar_2 varchar2 (3950); begin length_1 := length(clob_1); length_2 := length(clob_2); --dbms_output.put_line('length_1: '||length_1); --dbms_output.put_line('length_2: '||length_2); IF length_1 > max_length or length_2 > max_length THEN FOR x IN 1 .. ceil(length_1 / max_length) LOOP --dbms_output.put_line('((x-1)*max_length) + 1'||(x-1)||' * '||max_length||' = '||(((x-1)*max_length) + 1)); vchar_1 := substr(clob_1, ((x-1)*max_length) + 1, max_length); vchar_2 := substr(clob_2, ((x-1)*max_length) + 1, max_length); -- dbms_output.put_line('Section '||sections||' vchar_1: '||vchar_1||' ==> vchar_2: '||vchar_2); sec_similar := UTL_MATCH.JARO_WINKLER_SIMILARITY(vchar_1, vchar_2); --dbms_output.put_line('sec_similar: '||sec_similar); similar := similar + sec_similar; sections := sections + 1; END LOOP; --dbms_output.put_line('Similar: '||similar||' ==> Sections: '||sections); similar := similar / sections; ELSE similar := UTL_MATCH.JARO_WINKLER_SIMILARITY(clob_1,clob_2); END IF; --dbms_output.put_line('Overall Similar: '||similar); return(similar); end; /