一个带有 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:数字或值错误:字符串缓冲区太小”
我需要编写一个 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:数字或值错误:字符串缓冲区太小”