如何将Oracle表的单列多行数据传入表函数process_teilenummer
批量处理表数据的表函数调用方案
已创建的对象
首先是定义的表类型和处理函数:
create or replace TYPE t_process_teilenummer_tab AS TABLE OF VARCHAR2(4000); create or replace FUNCTION process_teilenummer ( Teilenummer IN CLOB ) RETURN t_process_teilenummer_tab -- 内部实现逻辑:处理输入字符串并返回拆分后的字符串表
当前单值调用方式
目前可以传入逗号分隔的字符串字面量,获取拆分后的单列多行结果:
SELECT column_value FROM TABLE( process_teilenummer('abc , xyz' ) )
执行后返回2行数据:abc、xyz。
入参长度限制说明
最初选择CLOB作为入参是误以为支持超过4000字符的字符串字面量,但实际无论入参声明为VARCHAR2(4000)、VARCHAR2(30000)还是CLOB,字符串字面量本身都无法突破4000字符限制——不过这一点不影响从表中读取长数据传入函数(表中CLOB列可以存储远超过4000字符的内容)。
批量处理表数据的实现
要将另一张表(假设表名为source_table,目标列名为teilenummer_col,共5000行)的单列数据传入函数并得到处理后的结果集,可采用以下两种方式:
方式1:使用APPLY语法(Oracle 12c+)
SELECT pt.column_value FROM source_table st CROSS APPLY TABLE(process_teilenummer(st.teilenummer_col)) pt;
CROSS APPLY:仅返回原表中能通过函数生成结果的行对应的处理数据- 若需保留原表所有行(包括函数处理后无结果的行),替换为
OUTER APPLY即可
方式2:传统关联语法(兼容低版本Oracle)
SELECT pt.column_value FROM source_table st, TABLE(process_teilenummer(st.teilenummer_col)) pt;
这种写法等价于CROSS JOIN,仅返回有处理结果的行。
内容的提问来源于stack exchange,提问作者Pato
相关产品推荐
相关产品推荐

