有趣的问题。正如 APC 所指出的,Oracle 不像其他语言那样具有反射功能,因此传入名称 (varchar2) 对 Oracle 没有多大帮助(尤其是在编译时)。我相信您在这里所说的是,您有一组表,它们都共享某些特征(以相同方式使用相同类型的一个或多个列),因此您想要创建一个通用函数,该函数适用于任何他们。
您可以执行此操作,但必须定义一个对象类型来定义各个表共享的公共列和类型。假设这是以下两列:
create or replace type my_obj as object (name varchar2(100), num number);
现在您的函数(或过程)将接受此类型作为参数:
create or replace function my_fn(obj my_obj) return varchar2 is
begin
-- do something with object
return obj.name || ',' || obj.num;
end;
你会这样称呼它:
declare
obj my_obj;
rv varchar2(1000);
begin
for rec in (select * from sometable)
loop
obj := my_obj(rec.some_varchar_col, rec.some_number_col);
select my_fn(obj) into rv from dual;
dbms_output.put_line(rv);
end loop;
end;
我能想到的唯一其他方法是接受弱类型的 sys_refcursor,然后强制调用 procs 发送正确的游标(由于潜在的运行时异常而存在风险,而且不是很清楚)。如果编码“通用”函数,我更喜欢上述方法。
编辑
为了完整起见,我将添加上面提到的 sys_refcursor 示例:
create or replace procedure my_proc(cur sys_refcursor) is
v_name varchar2(100);
v_num number;
begin
loop
fetch cur into v_name, v_num;
exit when cur%notfound;
-- do something with our common fields
dbms_output.put_line(v_name || ',' || v_num);
end loop;
end;
并称其为:
declare
v_cur sys_refcursor;
begin
open v_cur for select my_name, my_num from some_table;
my_proc(v_cur);
close v_cur;
end;
笔记
这看起来过于微不足道,只有 2 列(为什么不只是将参数设置为 varchar2 和数字),但您可能想要在函数中处理数十列,并且输入对象可以填充任意数量的列。
Cheers