一个带有 CLOB 或 VARCHAR2 输入和 CLOB 或 VARCHAR2 return 值的单个 PLSQL 函数

One single PLSQL function with CLOB or VARCHAR2 input and CLOB or VARCHAR2 return value

我需要编写一个 PLSQL 函数,它必须分别处理 CLOB 和 VARCHAR2 输入以及 return CLOB 或 VARCHAR2。但是无论输入类型如何,该函数实现的功能都是完全相同的(它执行一系列 REGEXP_REPLACE 调用)。是否可以编写一个可以同时接受 CLOB 和 VARCHAR2 以及 return 接收到的类型的函数?我想避免写两个非常相似的函数,从而重复代码。

我的第一个函数是这样的:

FUNCTION Test(i_text CLOB) RETURN CLOB IS
v_text CLOB;
BEGIN
  v_text := i_text;  
  ... a series of REGEXP_REPLACE calls like v_text := REGEXP_REPLACE(v_text,...)
  RETURN v_text
END;

我的另一个功能是:

FUNCTION Test(i_text VARCHAR2) RETURN VARCHAR2 IS
v_text VARCHAR2;
BEGIN
  v_text := i_text;  
  ... a series of REGEXP_REPLACE calls like v_text := REGEXP_REPLACE(v_text,...)
  RETURN v_text
END;

由于函数内部有很多 REGEXP_REPLACE 次调用,我宁愿只有一个函数 - 如果可能的话。

CLOB 输入可能很大,因此无法在函数调用之前将 CLOB 转换为 VARCHAR2。

甚至 REGEXP_REPLACE 也适用于各种输入,例如 CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB 或 NCLOB。所以这就是为什么我希望有一个解决方案来满足这个需求。

您可以创建一个包含两个Test在包中重载)函数的包,例如

CREATE OR REPLACE PACKAGE Pkg_Test IS
  FUNCTION Test (i_text VARCHAR2) RETURN VARCHAR2
  FUNCTION Test (i_text CLOB) RETURN CLOB;
END;
/

CREATE OR REPLACE PACKAGE BODY Pkg_Test IS
  FUNCTION Test (i_text VARCHAR2) RETURN VARCHAR2 IS
   val VARCHAR2;
  BEGIN
   SELECT ...
     INTO val
     FROM tab t
    WHERE t.col1 = i_text;
    
   RETURN val; 
  END;

  FUNCTION Test (i_text CLOB) RETURN CLOB IS
   val CLOB;
  BEGIN
   SELECT ....
     INTO val
     FROM tab t
    WHERE t.col2 = i_text;
    
   RETURN val; 
  END;
END;
/

无论参数的数据类型是什么,都使用与下面相同的名称调用

BEGIN
  :result := Pkg_Test.test(:prm);
END;
/

@BarbarosOzhan 是正确的,您需要一个包来获得过载能力。但是您不需要复制代码。虽然您在将 CLOB 转换为 VARCHAR2 是不可能的方面是正确的,但没有什么可以阻止您将 VARCHAR2 转换为 CLOB。然后,假设您没有扩展正则表达式的长度,将结果转换回 VARCHAR2。然后处理 varchar2 的函数就变成了一个只处理转换的包装器。

create or replace package test_pkg is
    function test(i_text clob) return clob;
    function test(i_text varchar2) return varchar2;
end test_pkg;   
/

create or replace package body test_pkg is
    function test(i_text clob) return clob is
      v_text clob;
    begin
      v_text := i_text;  
      --...
      return v_text;
    end test;
    
    function test(i_text varchar2) return varchar2 is
      v_text clob;
      v_res  varchar2(32767);   -- 4000 is actually used in SQL statement
    begin
       v_text := cast(i_text as clob); 
       v_res := cast (test(v_text) as varchar2);
       return v_res;
    end test;
end test_pkg; 

您的调用例程应该预期并处理异常“ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小”