【发布时间】:2010-07-25 11:55:16
【问题描述】:
我遇到了 oracle 数据库的问题,我创建了一个存储过程,我想将一组项目的 id 传递给这个过程,以使用“in”子句根据项目数组选择数据,可用的解决方案正如我发现的那样,创建一个函数并传递一个字符串值,其中所有项目的 id 用逗号分隔,并且此函数将返回一个数据表,其中每个项目 id 都有一行。当我在选择中的 toad 中尝试它时,这种方法工作正常声明,但是当我在存储过程中使用它时,我得到一个奇怪的错误
“ORA-12714:指定的国家字符集无效”
在搜索了该错误的原因后,我发现这是该版本的 oracle 中的错误,根据此页面,它已在 10.2.0.4 oracle 补丁中修复,确切原因是为函数声明游标返回数据表
由于我不可能让在实时生产环境中工作的用户停止服务器以应用更新补丁,我想知道是否有任何 Oracle 专家可以帮助我声明一个游标并返回该游标而不是返回表格。
我的 Oracle 函数,在此先感谢
create or replace
FUNCTION SplitIDs(
v_List IN VARCHAR2)
RETURN RtnValue_Set PIPELINED
AS
SWV_List VARCHAR2(2000);
v_RtnValue Dt_RtnValue := Dt_RtnValue(NULL);
BEGIN
SWV_List := v_List;
WHILE (instr(SWV_List,',') > 0)
LOOP
FOR RetRow IN
(SELECT ltrim(rtrim(SUBSTR(SWV_List,1,instr(SWV_List,',') -1))) SelectedValue
FROM dual
)
LOOP
v_RtnValue.SelectedValue := RetRow.SelectedValue;
PIPE ROW(v_RtnValue);
END LOOP;
SWV_List := SUBSTR(SWV_List,instr(SWV_List,',')+LENGTH(','),LENGTH(SWV_List));
END LOOP;
FOR RetRow IN
(SELECT ltrim(rtrim(SWV_List)) SelectedValue FROM dual
)
LOOP
v_RtnValue.SelectedValue := RetRow.SelectedValue;
PIPE ROW(v_RtnValue);
END LOOP;
RETURN;
END;
【问题讨论】:
-
这是一种将逗号分隔的字符串拆分为一系列标记的复杂方法。看看这个更简单的方法来实现同样的事情:stackoverflow.com/questions/3142665/…
-
非常感谢,工作正常。我是 Oracle 新手,我在 T-Sql 中创建它并使用转换器工具并将其转换为 PL-Sql