[20250419]str2varlist函数的一个小错误.txt
--//晚上想验证设置vartabletype类型TABLE OF VARCHAR2 (4000)可能不合理,因为这样每个绑定变量相当于占用4000字节,传入参数也
--//是占用4000字节,这样可能导致父游标堆0占用空间增加,其它情况自己也不是很清楚,想通过测试验证。
--//无意间发现原始代码的一个错误,我上网检索发现,其实许多人都是拷贝和粘贴,都是错误的。
CREATE OR REPLACE TYPE vartabletype AS TABLE OF VARCHAR2 (4000)
/
--//我发现许多连接定义类型VARCHAR2 (1000),我感觉定义32也许更加合理,或者写2个函数str2varlist1,str2varlist2,一个使用
--//VARCHAR2 (32),另外一个写入VARCHAR2 (128),很少分割后每个字符串长度大于128的情况。
--//测试感觉似乎没有什么影响。
CREATE OR REPLACE FUNCTION str2varlist (p_string IN VARCHAR2)
RETURN vartabletype
AS
v_str LONG DEFAULT p_string || ',';
v_n VARCHAR2 (2000);
~~~~~~~~~~~~~~~~~~~~~~~~~~~
v_data vartabletype := vartabletype ();
BEGIN
LOOP
v_n := INSTR (v_str, ',');
EXIT WHEN (NVL (v_n, 0) = 0);
v_data.EXTEND;
v_data (v_data.COUNT) := LTRIM (RTRIM (SUBSTR (v_str, 1, v_n - 1)));
v_str := SUBSTR (v_str, v_n + 1);
END LOOP;
RETURN v_data;
END;
/
--//注意看下划线,这里明显写错,应该写成v_n PLS_INTEGER;,很明显许多人都是太相信别人的代码,一个抄一个都是错误的。
--//或者都是没人仔细阅读代码。接着先测试CREATE OR REPLACE TYPE vartabletype AS TABLE OF VARCHAR2 (4000)的情况。
CREATE OR REPLACE FUNCTION SCOTT.str2varlist (p_string IN VARCHAR2)
RETURN vartabletype
AS
v_str LONG DEFAULT p_string || ',';
v_n PLS_INTEGER;
v_data vartabletype := vartabletype ();
BEGIN
LOOP
v_n := INSTR (v_str, ',');
EXIT WHEN (NVL (v_n, 0) = 0);
v_data.EXTEND;
v_data (v_data.COUNT) := LTRIM (RTRIM (SUBSTR (v_str, 1, v_n - 1)));
v_str := SUBSTR (v_str, v_n + 1);
END LOOP;
RETURN v_data;
END;
/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-3081859/ ,如需转载,请注明出处,否则将追究法律责任。