ITPub博客

首页 > 数据库 > Oracle > [20250419]str2varlist函数的一个小错误.txt

[20250419]str2varlist函数的一个小错误.txt

原创 Oracle 作者:lfree 时间:2025-04-20 19:58:35 0 删除 编辑

[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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969784