首页 > 其他分享 >[20250103]distinct的函数实现.txt

[20250103]distinct的函数实现.txt

时间:2025-01-05 19:54:56浏览次数:8  
标签:00 name distinct -- str 20250103 txt book01p select

[20250103]distinct的函数实现.txt

--//前天使用递归代替类似select distinct rtype from routine2;
--//今天尝试使用函数是否可以实现,首先提一下,写pl/sql代码不是我擅长的工作,我的工作不需要写代码。
--//主要目的仅仅为了学习。

1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.建立测试环境:
create table t as select * from all_objects;
create index i_t_owner on t(owner) COMPRESS 1;
--//alter table t modify owner not null;这步不需要。
--//分析略。

CREATE OR REPLACE FUNCTION distinct2varlist
(
   p_table_name    IN VARCHAR2
  ,p_column_name   IN VARCHAR2
)
   RETURN vartabletype
   PIPELINED
AS
   v_str   VARCHAR2 (100);
BEGIN
   EXECUTE IMMEDIATE
      'select min(' || p_column_name || ')' || ' from ' || p_table_name
      INTO v_str;

   LOOP
      EXIT WHEN (v_str IS NULL);
      PIPE ROW (v_str);
      EXECUTE IMMEDIATE 'select min('||p_column_name||')'||' from '||p_table_name||' where '||p_column_name||'> :j' into v_str using v_str;
   END LOOP;
   RETURN;
END;
/
--//传入2个参数,表以及字段。
--//小插曲,调试函数遇到1个问题,PIPE ROW (v_str);一定要加括号,不然过不去。
SCOTT@book01p> show error
Errors for FUNCTION DISTINCT2VARLIST:

LINE/COL ERROR
-------- ----------------------------------------------------------------------------------------------------
17/16    PLS-00103: Encountered the symbol "V_STR" when expecting one of the following: (

20/4     PLS-00103: Encountered the symbol "RETURN" when expecting one of the following:
         end not pragma final instantiable persistable order
         overriding static member constructor map

3.测试:
SCOTT@book01p> @ sl all
alter session set statistics_level = all;
Session altered.

SCOTT@book01p> select * from distinct2varlist('T','owner') ;
COLUMN_VALUE
---------------
APPQOSSYS
AUDSYS
BBB
CTXSYS
DBSFWUSER
DBSNMP
DVF
DVSYS
GSMADMIN_INTERNAL
LBACSYS
MDSYS
OJVMSYS
OLAPSYS
ORACLE_OCM
ORDDATA
ORDPLUGINS
ORDSYS
OUTLN
PUBLIC
REMOTE_SCHEDULER_AGENT
SCOTT
SI_INFORMTN_SCHEMA
SYS
SYSTEM
WMSYS
XDB
26 rows selected.

SCOTT@book01p> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  9p7a9u1b3xp3r, child number 1
-------------------------------------
select * from distinct2varlist('T','owner')
Plan hash value: 2418813107
------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name             | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                  |      1 |        |       |    29 (100)|          |     26 |00:00:00.01 |      54 |
|   1 |  COLLECTION ITERATOR PICKLER FETCH| DISTINCT2VARLIST |      1 |   8168 | 16336 |    29   (0)| 00:00:01 |     26 |00:00:00.01 |      54 |
------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$F5BB74E1 / "KOKBF$0"@"SEL$2"
--//54个逻辑读,前面使用递归35个逻辑读。

--//测试返回数字的情况,按照上面的脚本修改如下:
CREATE OR REPLACE TYPE numtabletype AS TABLE OF NUMBER
/

CREATE OR REPLACE FUNCTION distinct2numlist
(
   p_table_name    IN VARCHAR2
  ,p_column_name   IN VARCHAR2
)
   RETURN numtabletype
   PIPELINED
AS
   v_str   NUMBER;
BEGIN
   EXECUTE IMMEDIATE
      'select min(' || p_column_name || ')' || ' from ' || p_table_name
      INTO v_str;

   LOOP
      EXIT WHEN (v_str IS NULL);
      PIPE ROW (v_str);

      EXECUTE IMMEDIATE
            'select min('
         || p_column_name
         || ')'
         || ' from '
         || p_table_name
         || ' where '
         || p_column_name
         || '> :j'
         INTO v_str
         USING v_str;
   END LOOP;

   RETURN;
END;
/


SCOTT@book01p> select * from distinct2numlist('emp','deptno') ;
COLUMN_VALUE
------------
          10
          20
          30

SCOTT@book01p> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  7ysn70g61z2pu, child number 0
-------------------------------------
select * from distinct2numlist('emp','deptno')
Plan hash value: 1096181357
------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name             | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                  |      1 |        |       |    29 (100)|          |      3 |00:00:00.01 |      24 |
|   1 |  COLLECTION ITERATOR PICKLER FETCH| DISTINCT2NUMLIST |      1 |   8168 | 16336 |    29   (0)| 00:00:01 |      3 |00:00:00.01 |      24 |
------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$F5BB74E1 / "KOKBF$0"@"SEL$2"
--//没有建立索引,可以发现执行效率不高,这是第2次执行测试的逻辑读24.。

--//建立索引后,重复测试:
SCOTT@book01p> create index i_emp_deptno on emp(deptno);
Index created.

SCOTT@book01p> set feed on
SCOTT@book01p> select * from distinct2numlist('emp','deptno') ;
COLUMN_VALUE
------------
          10
          20
          30
3 rows selected.

SCOTT@book01p> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  7ysn70g61z2pu, child number 0
-------------------------------------
select * from distinct2numlist('emp','deptno')
Plan hash value: 1096181357
------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name             | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers |
------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                  |      1 |        |       |    29 (100)|          |      3 |00:00:00.01 |       4 |
|   1 |  COLLECTION ITERATOR PICKLER FETCH| DISTINCT2NUMLIST |      1 |   8168 | 16336 |    29   (0)| 00:00:01 |      3 |00:00:00.01 |       4 |
------------------------------------------------------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$F5BB74E1 / "KOKBF$0"@"SEL$2"

4.总结:
--//仅仅为了学习,没有实际的意义.在返回值很少并且相关字段索引存在的情况下也许执行效率高。
--//另外测试没有考虑NULL的情况。
--//理论还可以修改返回多个值,不在上面浪费时间。
--//再次提醒一些开发在写代码时想想,我开发的程序运行时间有多长,数据结构是否合理。
--//再贴一个生产系统看到的情况:

SYS@127.0.0.1:9105/xtdb/xtdb1> @ sql_id 43cm4x9swk2ga
-- SQL_ID = 43cm4x9swk2ga come from shared pool
select distinct MR_Class from MED_EMR_ARCHIVE_DETIAL;

SYS@127.0.0.1:9105/xtdb/xtdb1> @ seg2 %.MED_EMR_ARCHIVE_DETIAL

    SEG_MB OWNER                SEGMENT_NAME                   SEGMENT_TYPE         SEG_TABLESPACE_NAME                BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ -------------------- ------------------------------ ---------- ---------- ----------
        41 MEDCOMM              MED_EMR_ARCHIVE_DETIAL         TABLE                TSP_MEDCOMM                          5248          2      19346

SYS@127.0.0.1:9105/xtdb/xtdb1> @ desczz MEDCOMM.MED_EMR_ARCHIVE_DETIAL MR_Class
eXtended describe of MEDCOMM.MED_EMR_ARCHIVE_DETIAL

DISPLAY TABLE_NAME OF COLUMN_NAME INFORMATION.
INPUT   OWNER.TABLE_NAME  <filters>
SAMPLE  : @ desczz TABLE_NAME column_name1,column_name2
IF NOT INPUT <filters> ,USE "" .
Owner      Table_Name           SAMPLE_SIZE LAST_ANALYZED       Col# Column Name          Null?      Type                 NUM_DISTINCT        Density  NUM_NULLS HISTOGRAM       NUM_BUCKETS Low_value High_value
---------- -------------------- ----------- ------------------- ---- -------------------- ---------- -------------------- ------------ -------------- ---------- --------------- ----------- --------- -----------
MEDCOMM    MED_EMR_ARCHIVE_DETI        5518 2024-12-05 22:01:54    3 MR_CLASS             NOT NULL   VARCHAR2(10)                    1   .00000209385          0 FREQUENCY                 1 麻醉      麻醉
           AL
--//不同的值仅仅1个.无语.
--//自己想想随着表数据增加,如果程序代码经常这样调用有意义吗?

标签:00,name,distinct,--,str,20250103,txt,book01p,select
From: https://www.cnblogs.com/lfree/p/18653788

相关文章

  • distinct去重的局限性,建议优先使用group by或row_number() over() [oracle]
    my_table表的数据如下,其中Eve的那两行是name和age的数据均相同,Bob的两行name相同,但是age不同selectdistinctnamefrommy_table;查询结果如下图selectdistinctname,agefrommy_table;查询结果如下图.有重复的name数据(3个Bob).重复的name值Eve被去重了,Bob没有,因......
  • txt文件加密的四种方法
    在数字化时代,信息安全至关重要。TXT文件作为最常用的文本格式之一,经常包含敏感或私人信息。因此,了解如何加密TXT文件变得尤为重要。本文将介绍三种有效的加密方法:利用Windows系统自带的加密功能、WINRAR加密功能以及使用奥凯丰极简加密软件,帮助您轻松保护数据安全。方法一:RAR......
  • C++期末总复习last day 20250103
    内容主体来自于QJH先生,向其表示敬意。C++高级程序设计题目类型简述题(5题、25分)什么是数据抽象与封装?相比于过程抽象与封装,数据抽象与封装有什么好处?……(不用死记硬背)程序分析题(5题、40分)指出下面程序的错误和错误原因写出下面程序的运行结果。写出下面程序的运行......
  • MySQL中distinct和group by去重的区别
    MySQL中distinct和groupby去重的区别在MySQL中,我们经常需要对查询结果进行去重,而DISTINCT和GROUPBY是实现这一功能的两种常见方法。虽然它们在很多情况下可以互换使用,但它们之间还是存在一些差异的。接下来,我们将通过创建测试数据和执行不同的查询来探讨这两种方法的区......
  • [20241230]21c HIST_HEAD$ UNIFIED AUDIT.txt
    [20241230]21cHIST_HEAD$UNIFIEDAUDIT.txt--//看标题有点奇怪,生产系统19c遇到的问题,在我的测试环境21c也存在,就是访问ALL_TAB_COLS,ALL_TAB_COLUMNS视图时会访问--//HIST_HEAD$表,会触发审计记录相关信息,有点奇怪,做一个记录并分析。1.环境:SYS@book01p>@ver2==================......
  • [20241227]字符串转换成列表问题.txt
    [20241227]字符串转换成列表问题.txt--//开发经常会写sql语句,经常会出现in('111122','1111113'..,'2222111')之类的情况,一般语句in里面内容经常变化,导致无法使--//用绑定变量。--//实际上以前例子,通过建立type,然后建立函数将拼接的字符串转换为数字或者字符串列表。--//前几天有......
  • windows命令大全.txt
    1echo和@回显命令@          #关闭单行回显echooff       #从下一行开始关闭回显@echooff      #从本行开始关闭回显。一般批处理第一行都是这个echoon       #从下一行开始打开回显echo   ......
  • [20241222]关于日期输出格式问题.txt
    [20241222]关于日期输出格式问题.txt--//https://connor-mcdonald.com/网站写了一系列相关blog,命名为KrisKringle系列。--//其中链接提到的例子https://connor-mcdonald.com/2024/12/21/kris-kringle-the-database-what-day-is-it/--//重复测试:1.环境:SCOTT@book01p>@ver2=====......
  • YOLO目标检测—XML标签文件与TXT标签文件相互转换
    XML标签文件转换为TXT标签文件importosimportxml.etree.ElementTreeasET#类别编号和名称的映射class_mapping={#替换为自己的类别编号和名称映射'person':'0','car':'1','bike':'2'}#更新后的源文件夹和目标文件夹路径sou......
  • wsxy96w2032_hcip555(551).txt
    wsxy96w2032_hcip555(551).txt第1、(单选题)5.区域间路由汇总功能在什么路由器上配置A:ABR;B:ASBR;C:IR;D:BR;解析:这道题考察的是对网络设备功能的理解。在OSPF(开放最短路径优先)协议中,区域边界路由器(ABR)负责将一个区域的路由信息汇总后发送到其他区域,实现区域间的路由汇总功能。因......