【发布时间】:2016-02-24 09:15:31
【问题描述】:
我有一个函数,它获取一个字符串和分隔符作为输入参数,并将拆分后的字符串作为表格返回。 当我运行这个函数时:
create or replace PACKAGE split_pkg AS
TYPE triplex_record IS RECORD (
id NUMBER,
data VARCHAR2(4000),
data1 VARCHAR2(4000),
data2 VARCHAR2(4000)
);
TYPE triplex_tab IS TABLE OF triplex_record;
FUNCTION triplex (p_txt IN VARCHAR2, p_delimiter IN VARCHAR2) RETURN triplex_tab ;
END split_pkg;
/
create or replace PACKAGE BODY split_pkg AS
FUNCTION triplex (p_txt IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN triplex_tab
AS
triplex_tbl triplex_tab := triplex_tab();
BEGIN
FOR i IN 1..TRUNC((REGEXP_COUNT(p_txt , '[^' || p_delimiter || ']+'))/3)
LOOP
triplex_tbl.EXTEND;
triplex_tbl(triplex_tbl.LAST).id := i;
triplex_tbl(triplex_tbl.LAST).data := TRIM(REGEXP_SUBSTR(p_txt, '[^' || p_delimiter || ']+' , 1, 3 * i - 2));
triplex_tbl(triplex_tbl.LAST).data1 := TRIM(REGEXP_SUBSTR(p_txt, '[^' || p_delimiter || ']+' , 1, 3 * i - 1));
triplex_tbl(triplex_tbl.LAST).data2 := TRIM(REGEXP_SUBSTR(p_txt, '[^' || p_delimiter || ']+' , 1, 3 * i));
--PIPE ROW(triplex_tbl);
END LOOP;
RETURN triplex_tbl;
END triplex;
END split_pkg;
我得到以下错误:
ORA-00902: 无效的数据类型
如果创建为 PIPELINED 函数,我没有问题,我只想使用 RECORD TYPE 在 PACKAGE 的标头中定义我的 TYPE,而不是使用 CREATE TYPE 在架构级别。怎么能这样?
【问题讨论】:
-
你从哪里得到错误?编译包体时?什么时候调用函数?你是如何调用函数的?
-
@Justin Cave ,包编译没有任何错误,运行时出现错误 'SELECT * FROM TABLE(SPLIT_PKG.TRIPLEX('sample text' , ',') );'
-
我怀疑你不能从这里到达那里。这篇文章stevenfeuersteinonplsql.blogspot.com/2015/04/… 对您的选项进行了很好的概述。根据您要完成的具体任务,可能有替代方法来构建您的代码(包括填充本地集合并将其传递给
table函数),但很难猜测这些替代方法是否适合您。我强烈建议您只在 SQL 中定义类型。 -
@Justin Cave ,如果我用“CREATE OR REPLACE TYPE...”定义我的过程和函数中需要的所有类型,那会令人困惑,所以我想在其中定义它们中的每一个他们的包头。
-
那么权衡你不能在纯SQL语句中使用它们。如果您的 SQL 语句位于 PL/SQL 块中,您可以定义集合类型的局部变量,调用函数来填充该集合,然后将该集合传递给
table函数(这是 12.1 中的新功能)。