请问怎么样在Oracle的9i版本中使用wm_concat这个函数,自定义此函数为什么不行??

yvhuuif15 2011-11-14 08:37:15
每次执行strcat时总是提示错误:程序包或函数STRCAT处于无效状态
到底是什么情况,函数写得也没什么问题呀,请各位帮帮忙!
自定义的函数如下:
create or replace function strcat(input varchar2)
return varchar2
parallel_enable aggregate using strcat_type;
TYPE:
CREATE or replace type strcat_type as object (
cat_string varchar2(4000),
static function odciaggregateinitialize(cs_ctx in out strcat_type) return number,
member function odciaggregateiterate(self in out strcat_type,value in varchar2) return number,
member function odciaggregatemerge(self in out strcat_type,ctx2 in out strcat_type) return number,
member function odciaggregateterminate(self in out strcat_type,returnvalue out varchar2,flags in number) return number
)
...全文
299 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yvhuuif15 2011-11-15
  • 打赏
  • 举报
回复
好的,谢谢你呀,现在可以了
[Quote=引用 10 楼 tx2730 的回复:]
引用 4 楼 tx2730 的回复:
从网上搜的例子改写的,lz试试

SQL code

CREATE OR REPLACE TYPE string_sum_obj AS OBJECT (
--聚合函数的实质就是一个对象
sum_string VARCHAR2 (4000),
STATIC FUNCTION odciaggregateinitialize (v_self IN O……
[/Quote]
007-x 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tx2730 的回复:]
从网上搜的例子改写的,lz试试

SQL code

CREATE OR REPLACE TYPE string_sum_obj AS OBJECT (
--聚合函数的实质就是一个对象
sum_string VARCHAR2 (4000),
STATIC FUNCTION odciaggregateinitialize (v_self IN OUT string_su……
[/Quote]
试试我在四楼发的,然后执行下面的SQL查看效果
with t1 as(select 1 id,test1 value from dual union all select 1 id,test2 value from dual ) select id,fun_concat(value) value from t1
yvhuuif15 2011-11-15
  • 打赏
  • 举报
回复
是按顺序执行的,重新执行创建函数的SQL文编译也是通过的,很奇怪啊[Quote=引用 8 楼 xiaobn_cn 的回复:]
引用 6 楼 yvhuuif15 的回复:
我重新用你的给的在PL/SQL里重新编译后使用还是一样的报错:ORA-06575:程序包或函数F_LINK
处于无效状态

引用 3 楼 xiaobn_cn 的回复:
楼主你的代码少了关键部分,自定义集合函数分三数据:
1. 类型的声明
2. 类型的实现
3. 函数的定义

你这里只实现了第1步和第3步,缺少了第2步,也就是类型的实现……
[/Quote]
xiaobn_cn 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yvhuuif15 的回复:]
我重新用你的给的在PL/SQL里重新编译后使用还是一样的报错:ORA-06575:程序包或函数F_LINK
处于无效状态

引用 3 楼 xiaobn_cn 的回复:
楼主你的代码少了关键部分,自定义集合函数分三数据:
1. 类型的声明
2. 类型的实现
3. 函数的定义

你这里只实现了第1步和第3步,缺少了第2步,也就是类型的实现也就是type body部分。

类型声明……
[/Quote]

1. 三部分代码需要按顺序执行,类型声明-->类型实现-->函数定义
2. 楼主你去看下你的函数F_LINK是否处于无效状态,如果是,执行下创建函数的SQL,看下是什么原因导致函数创建失败。
yvhuuif15 2011-11-15
  • 打赏
  • 举报
回复
你这也是一样报错:ORA-06575:程序包或函数fun_concat处于无效状态。。。
[Quote=引用 4 楼 tx2730 的回复:]
从网上搜的例子改写的,lz试试

SQL code

CREATE OR REPLACE TYPE string_sum_obj AS OBJECT (
--聚合函数的实质就是一个对象
sum_string VARCHAR2 (4000),
STATIC FUNCTION odciaggregateinitialize (v_self IN OUT string_su……
[/Quote]
yvhuuif15 2011-11-15
  • 打赏
  • 举报
回复
我重新用你的给的在PL/SQL里重新编译后使用还是一样的报错:ORA-06575:程序包或函数F_LINK
处于无效状态
[Quote=引用 3 楼 xiaobn_cn 的回复:]
楼主你的代码少了关键部分,自定义集合函数分三数据:
1. 类型的声明
2. 类型的实现
3. 函数的定义

你这里只实现了第1步和第3步,缺少了第2步,也就是类型的实现也就是type body部分。

类型声明

SQL code


CREATE OR REPLACE TYPE "T_LINK" ……
[/Quote]
yvhuuif15 2011-11-15
  • 打赏
  • 举报
回复
嗯,直接提示无效,编译的时候没有错误[Quote=引用 2 楼 yixilan 的回复:]
引用楼主 yvhuuif15 的回复:
每次执行strcat时总是提示错误:程序包或函数STRCAT处于无效状态

提示你无效了。
编译的时候不报错么?
[/Quote]
007-x 2011-11-15
  • 打赏
  • 举报
回复
从网上搜的例子改写的,lz试试
CREATE OR REPLACE TYPE string_sum_obj AS OBJECT (
--聚合函数的实质就是一个对象
sum_string VARCHAR2 (4000),
STATIC FUNCTION odciaggregateinitialize (v_self IN OUT string_sum_obj)
RETURN NUMBER,
--对象初始化
MEMBER FUNCTION odciaggregateiterate (
SELF IN OUT string_sum_obj,
VALUE IN VARCHAR2
)
RETURN NUMBER,
--聚合函数的迭代方法(这是最重要的方法)
MEMBER FUNCTION odciaggregatemerge (
SELF IN OUT string_sum_obj,
v_next IN string_sum_obj
)
RETURN NUMBER,
--当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
MEMBER FUNCTION odciaggregateterminate (
SELF IN string_sum_obj,
return_value OUT VARCHAR2,
v_flags IN NUMBER
)
RETURN NUMBER
--终止聚集函数的处理,返回聚集函数处理的结果.
);
/

CREATE OR REPLACE TYPE BODY string_sum_obj
IS
STATIC FUNCTION odciaggregateinitialize (v_self IN OUT string_sum_obj)
RETURN NUMBER
IS
BEGIN
v_self := string_sum_obj (NULL);
RETURN odciconst.success;
END;
MEMBER FUNCTION odciaggregateiterate (
SELF IN OUT string_sum_obj,
VALUE IN VARCHAR2
)
RETURN NUMBER
IS
BEGIN
/* 连接,解决逗号分隔第一个字母是逗号的问题 */
IF NOT SELF.sum_string IS NULL
THEN
SELF.sum_string := SELF.sum_string || ',' || VALUE;
ELSE
SELF.sum_string := VALUE;
END IF;

RETURN odciconst.success;

END;
MEMBER FUNCTION odciaggregatemerge (
SELF IN OUT string_sum_obj,
v_next IN string_sum_obj
)
RETURN NUMBER
IS
BEGIN
/* 连接 */
SELF.sum_string := SELF.sum_string || v_next.sum_string;
RETURN odciconst.success;

END;
MEMBER FUNCTION odciaggregateterminate (
SELF IN string_sum_obj,
return_value OUT VARCHAR2,
v_flags IN NUMBER
)
RETURN NUMBER
IS
BEGIN
return_value := SELF.sum_string;
RETURN odciconst.success;
END;
END;
/

CREATE OR REPLACE FUNCTION fun_concat (VALUE VARCHAR2)
RETURN VARCHAR2 PARALLEL_ENABLE AGGREGATE
USING string_sum_obj;
/
xiaobn_cn 2011-11-15
  • 打赏
  • 举报
回复
楼主你的代码少了关键部分,自定义集合函数分三数据:
1. 类型的声明
2. 类型的实现
3. 函数的定义

你这里只实现了第1步和第3步,缺少了第2步,也就是类型的实现也就是type body部分。

类型声明

CREATE OR REPLACE TYPE "T_LINK" AS OBJECT (

STR VARCHAR2(30000),

STATIC FUNCTION ODCIAGGREGATEINITIALIZE (ACTX IN OUT T_LINK) RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATEITERATE (SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATETERMINATE (SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATEMERGE (SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER

)


类型实现

CREATE OR REPLACE TYPE BODY T_LINK IS

STATIC FUNCTION ODCIAGGREGATEINITIALIZE (ACTX IN OUT T_LINK) RETURN NUMBER IS

BEGIN

ACTX := T_LINK(NULL);

RETURN ODCICONST.SUCCESS;

END;



MEMBER FUNCTION ODCIAGGREGATEITERATE (SELF IN OUT T_LINK, VALUE IN VARCHAR2) RETURN NUMBER IS

BEGIN
IF SELF.STR IS NULL THEN
SELF.STR := VALUE;
ELSE
SELF.STR := SELF.STR || ',' || VALUE;
END IF;

RETURN ODCICONST.SUCCESS;

END;



MEMBER FUNCTION ODCIAGGREGATETERMINATE (SELF IN T_LINK, RETURNVALUE OUT VARCHAR2, FLAGS IN NUMBER) RETURN NUMBER IS

BEGIN

RETURNVALUE := SELF.STR;

RETURN ODCICONST.SUCCESS;

END;

MEMBER FUNCTION ODCIAGGREGATEMERGE (SELF IN OUT T_LINK, CTX2 IN T_LINK) RETURN NUMBER IS

BEGIN

NULL;

RETURN ODCICONST.SUCCESS;

END;

END;


函数定义

CREATE OR REPLACE FUNCTION F_LINK

(P_STR VARCHAR2) RETURN VARCHAR2

AGGREGATE USING T_LINK;
yixilan 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 yvhuuif15 的回复:]
每次执行strcat时总是提示错误:程序包或函数STRCAT处于无效状态
[/Quote]
提示你无效了。
编译的时候不报错么?
thedayidie 2011-11-14
  • 打赏
  • 举报
回复
我也想知道,帮顶。不过楼主还用9i呀,落伍了!呵呵!

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧