当前位置: 首页 > 面试题库 >

类似UTL_MATCH的函数可与CLOB一起使用

牧飞鹏
2023-03-14
问题内容

我的问题是:
是否有一个类似UTL_MATCH的函数与aCLOB而不是a一起使用VARCHAR2

我的特定问题是: 我在Oracle数据库上。我有一堆与Domo
CenterView交互的预先编写的查询。查询中的变量由定义${variableName}。我需要重写这些查询。我没有写原始文档,所以不是想弄清楚html" target="_blank">变量的好值是什么,而是要使用应用程序运行查询并从中获取查询的内容V$SQL

所以我的解决方法是:
做一个UTL_MATCH与它的可变填充和查询V$SQL.SQL_FULLTEXT。但是,UTL_MATCH仅限于VARCHAR2的数据类型V$SQL.SQL_FULLTEXTCLOB。因此,这就是为什么我要寻找一个UTL_MATCHCLOB数据类型一起使用的类似函数的原因。

任何其他有关如何完成此操作的技巧都值得欢迎。 谢谢!

编辑有关提示。
如果您对如何执行此操作有更好的了解,请让我告诉您一些我掌握的信息。我大约有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;
/


 类似资料:
  • 我的代码是从参数:title中选择文本。但我得到的结果是不对的。在我的例子中,类书扩展了媒体。 这是我的疑问。 我的参数是“哈里”。我想只得到一个结果,但我得到了我所有的数据。我的代码有什么错误?请帮忙。

  • 问题内容: 我的包中有一个结构,上面有耗时的方法,通过工厂函数进行构造也很耗时。因此,在依赖于该其他结构的包中,我希望能够在创建后使用伪造的工厂函数和伪造的结构对其进行测试。由于结构是通过工厂函数构造的,因此我想伪造工厂函数,并在测试期间将替代工厂函数传递给我的结构。 昂贵的包装的一个例子是: 我的主包装使用以下代码: 但是,此代码抱怨以下错误: 。\ main.go:6:不能在字段值中使用昂贵的

  • 问题内容: 我想确保数据库中是否存在临时表。 我尝试使用函数,但似乎无法将其用于临时表。 我该如何解决这个问题? 问题答案: 使用 在另一个数据库的上下文中运行时获取临时表的ID。

  • 我给你的是不可变的。试试看。我需要的是能够指定一个类,所以我定义了 由immutables生成的生成器不接受此选项 因为它需要一门课 用@Value注释类型。参数很好地创建了一个有效的方法 但结果是一个实例,而不是一个生成器,因此只能使用withers设置后续值。

  • 我们有一些lob和varchar2类型的数据被错误地编码为AL32UTF8,我们需要将其编码转换为we8mswin1252字符集。我得到了用于字符集转换的convert函数,这个函数在varchar2 datatype中工作得很好,但在CLOB中使用时给出了一些模糊的字符。我当前的编码是AL32UTF8。 数据库:Oracle 12c