`
zzx0421
  • 浏览: 99003 次
  • 性别: Icon_minigender_1
  • 来自: 株洲/深圳
社区版块
存档分类
最新评论

Oracle经典SQL语句

阅读更多
Oracle 三元条件查询
select (case a.status
         when '1' then '库存'
         when '2' then '可以使用'
         when '3' then '在用'
         when '4' then '损坏'
         when '5' then '报废'
         when '6' then '已注销'
         else '未知状态'
       end) as status, a.*
from T_MKCARD a;

select decode(a.status,'1','库存','2','可以使用','3','在用','4','损坏','5','报废','6','已注销','未知状态') as status, a.*
from T_MKCARD a;

select decode(greatest(endtime,sysdate),sysdate,'系统时间','结束时间')||'大' from t_pdproduct t;


Oracle正则表达式替换
SELECT REGEXP_REPLACE(forwarddestination,'(.*)@.*','\1@szrhzs.com.cn') from users order by username;
update users set forwarddestination=REGEXP_REPLACE(forwarddestination,'(.*)@.*','\1@szrhzs.com.cn') where username='111';




Oracle处理树
select * from t_bossmenu where parentcode=000224 connect by parentcode = prior menucode start with menucode =000223 order by menucode asc;

select lpad(ename, level * 2 + length(ename), '    ') as enames from emp where level <= 3 connect by prior empno = mgr start with empno = 7839 order by deptno;




Oracle查询表结构
select * from user_col_comments where table_name = 'T_ACINVOICE';

select a.column_id as 列号,
       a.column_name as 列名,
       a.data_type as 类型,
       decode(a.data_type, 'NUMBER', a.data_precision, a.data_length) as 长度,
       a.data_scale as 小数位,
       decode(e.uniqueness, 'UNIQUE', 'Y', 'N') as 是否是唯一的,
       decode(e.key, 'Y', 'Y', 'N') 是否是主键,
       f.comments as 注释,
       a.nullable as 是否允许空,
       a.data_default as 默认值
  from user_tab_columns a,
       user_col_comments f,
       (select b.table_name,
               b.index_name,
               b.uniqueness,
               c.column_name,
               decode(d.constraint_name, NULL, 'N', 'Y') key
          from user_indexes b,
               user_ind_columns c,
               (select constraint_name
                  from user_constraints
                 where constraint_type = 'P') d
         where b.index_name = c.index_name
           and b.index_name = d.constraint_name(+)) e
 where a.table_name = 'T_ACINVOICE'
   and a.table_name = e.table_name(+)
   and a.column_name = e.column_name(+)
   and a.table_name = f.table_name
   and a.column_name = f.column_name
 order by a.column_id;


创建和运行Oracle的Job
variable job number; 
begin 
        sys.dbms_job.submit(job => :job, 
                            what => 'DELETE FROM CA_APPCMD_LOG WHERE V_ENTITLECODE IS NULL;', 
                             next_date => to_date('15-03-2009 10:06:41', 'dd-mm-yyyy hh24:mi:ss'), 
                             interval => 'sysdate+1/288',
														 no_parse=>true);--每天1440分钟,即五分钟运行语句一次 
       commit; 
      end; 
/

select * from dba_jobs;
/

begin 
dbms_job.run(:job); 
end; 
/ 


Oracle分页查询语句:
SELECT *
  FROM (SELECT temp.*, ROWNUM num
          FROM (
                --完整的查询语句
                select a.*,
                        to_char(a.BEGINTIME, 'yyyy-mm-dd') as begindate,
                        to_char(a.ENDTIME, 'yyyy-mm-dd') as enddate,
                        b.REGIONNAME,
                        c.STORENAME,
                        d.PARANAME as PROD_TYPENAME,
                        e.FEENAME as FEENAME
                  from T_PDPRODUCT a,
                        T_MKREGION  b,
                        T_MKSTORE   c,
                        T_SYDICT    d,
                        T_ACFEETYPE e
                 where a.REGIONCODE = b.REGIONCODE
                   and a.STORECODE = c.STORECODE
                   and a.PROD_TYPE = d.PARAVALUE
                   and a.FEECODE = e.FEECODE(+)
                   and d.TYPECODE = '014'
                 order by a.PROD_SN
								 --end
								 ) temp
         where ROWNUM <= 10)
 where num > 0;


SELECT rs2.*, rs2.rownumber
  FROM (SELECT rs1.*, ROWNUM AS rownumber
          FROM (
                --完整的查询语句
                select a.*,
                        to_char(a.BEGINTIME, 'yyyy-mm-dd') as begindate,
                        to_char(a.ENDTIME, 'yyyy-mm-dd') as enddate,
                        b.REGIONNAME,
                        c.STORENAME,
                        d.PARANAME as PROD_TYPENAME,
                        e.FEENAME as FEENAME
                  from T_PDPRODUCT a,
                        T_MKREGION  b,
                        T_MKSTORE   c,
                        T_SYDICT    d,
                        T_ACFEETYPE e
                 where a.REGIONCODE = b.REGIONCODE
                   and a.STORECODE = c.STORECODE
                   and a.PROD_TYPE = d.PARAVALUE
                   and a.FEECODE = e.FEECODE(+)
                   and d.TYPECODE = '014'
                 order by a.PROD_SN
								 --end
								 ) rs1) rs2
 WHERE rs2.rownumber <= 10
   and rs2.rownumber > 0;


利用分析函数:
select * from(select 表名.*,row_number() over(order by 排序字段) as 排序别名 from 所有者.表名) where 排序别名>(当前显示页面数-1)*每页显示纪录数 and 排序别名<=当前显示页面数*每页显示纪录数;
示例:
/*先按字段排序,然后分页,再按其他字段排序*/
 select * from (select rownum,scott.emp.*,row_number() over(order by sal desc) as r from scott.emp) where r between 1 and 5 order by empno desc;

/*分页后再按其他字段排序*/
 select * from (select rownum,scott.emp.*,row_number() over(order by rowid) as r from scott.emp) where r between 1 and 5 order by empno desc;


利用伪列rownum:(不能排序)
select * from(select rownum 伪列别名,表名.* from 所有者.表名) where 伪列别名>(当前显示页面数-1)*每页显示纪录数 and 伪列别名<=当前显示页面数*每页显示纪录数;
示例:
/*分页后再按其他字段排序*/
select * from (select rownum rowno,e.* from 表 e where rownum<=结束记录数) where rowno<=结束纪录数 and rowno>=开始记录数 order by empno desc;
select * from (select rownum rowno,e.* from scott.emp e where rownum<=5) where rowno<=5 and rowno>=0 order by empno desc;
/*先按字段排序,然后分页,再按其他字段排序*/
select rownum,e.* from (select emp.*,rownum rowno from scott.emp order by sal desc) e where rownum between 1 and 5 order by empno desc;
/*分页后再按其他字段排序*/
select rownum,e.* from (select emp.*,rownum rowno from scott.emp order by sal desc) e where rowno between 1 and 5 order by empno desc;


利用集合操作:(不能排序)
SELECT rownum,表名.* FROM 表名 WHERE ROWNUM<=当前显示页面数*每页显示纪录数
MINUS
SELECT rownum,表名.* FROM 表名 WHERE ROWNUM<=(当前显示页面数-1)*每页显示纪录数
示例:
/*分页后排序,不适合查询大批量数据*/
select * from(SELECT rownum,emp.* FROM emp WHERE ROWNUM<=5
MINUS
SELECT rownum,emp.* FROM emp WHERE ROWNUM<=0) order by empno;

--先按id排序,分页后按照typecode排序
select * from (select rownum,t_sydict.*,row_number() over(order by id desc) as r from t_sydict) where r between 1 and 5 order by typecode desc;


--分页后按照id排序
SELECT * FROM (  SELECT temp.* ,ROWNUM num FROM ( 

select * from T_SYDICT where typecode=021  order by typecode asc

) temp where ROWNUM <= 3 )where num >0 order by id desc;



--几乎每一个WEB应用都会用到分页,因此,将其做得通用高效就变得非常重要了,根据自己的想法用存储过程做了一个分页的存储过程,与大家分享,希望能够通过讨论得到更好的解决方案。 
--之所以用存储过程,是因为以后需要修改的话不需要修改程序代码,只需要修改存储过程的代码。但这个例子是在存储过程里动态生成的SQL语句,不知道会不会因此失去存储过程一次编译和快速的特点。代码如下:

--1、首先建立一个包,用户创建一个游标类型
create or replace package pkg_query as
  type cur_query is ref cursor;
end pkg_query;

--2、创建存储过程

CREATE OR REPLACE PROCEDURE prc_query
       (p_tableName        in  varchar2,   --表名
        p_strWhere         in  varchar2,   --查询条件
        p_orderColumn      in  varchar2,   --排序的列
        p_orderStyle       in  varchar2,   --排序方式
        p_curPage          in out Number,  --当前页
        p_pageSize         in out Number,  --每页显示记录条数
        p_totalRecords     out Number,     --总记录数
        p_totalPages       out Number,     --总页数
        v_cur              out pkg_query.cur_query)   --返回的结果集
IS
   v_sql VARCHAR2(1000) := '';      --sql语句
   v_startRecord Number(4);         --开始显示的记录条数
   v_endRecord Number(4);           --结束显示的记录条数
BEGIN
   --记录中总记录条数
   v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || p_tableName || ' WHERE 1=1';
   IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
       v_sql := v_sql || p_strWhere;
   END IF;
   EXECUTE IMMEDIATE v_sql INTO p_totalRecords;
   
   --验证页面记录大小
   IF p_pageSize < 0 THEN
       p_pageSize := 0;
   END IF;
   
   --根据页大小计算总页数[Page]
   IF MOD(p_totalRecords,p_pageSize) = 0 THEN
       p_totalPages := p_totalRecords / p_pageSize;
   ELSE
       p_totalPages := p_totalRecords / p_pageSize + 1;
   END IF;
   
   --验证页号
   IF p_curPage < 1 THEN
       p_curPage := 1;
   END IF;
   IF p_curPage > p_totalPages THEN
       p_curPage := p_totalPages;
   END IF;
   
   --实现分页查询
   v_startRecord := (p_curPage - 1) * p_pageSize + 1;
   v_endRecord := p_curPage * p_pageSize;
   v_sql := 'SELECT * FROM (SELECT A.*, rownum r FROM ' ||
            '(SELECT * FROM ' || p_tableName;
   IF p_strWhere IS NOT NULL or p_strWhere <> '' THEN
       v_sql := v_sql || ' WHERE 1=1' || p_strWhere;
   END IF;
   IF p_orderColumn IS NOT NULL or p_orderColumn <> '' THEN
       v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
   END IF;
   v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= '
            || v_startRecord;
   DBMS_OUTPUT.put_line(v_sql);
   OPEN v_cur FOR v_sql;
END prc_query;


批量插入测试数据
set serveroutput on
    Declare
       rcode integer;
    begin
		      dbms_output.enable(99999999999999);
          for i in 1..10000
  loop
            insert into T_CUSTOMERINFO values (LPAD(seq_custno.nextval,10,'0'),null,01,0101,LPAD(seq_custno.currval,10,'0'),1,1,'110',null,'110','110',null,null,'000',to_date('2009-05-20' , 'yyyy-mm-dd') ,'系统数据',null,'A','系统地址','admin',19,0,null);
            dbms_output.put_line('rcode:'||to_char(i));
          end loop;
          rcode := 1;
          dbms_output.put_line('结果是:'||to_char(rcode));
    exception
      when others then
        rollback;
        rcode := 0;
        dbms_output.put_line('结果是:'||to_char(rcode));
    end;		
/
分享到:
评论

相关推荐

    Oracle 经典 SQL 语句

    综合来看,这些Oracle经典SQL语句覆盖了多个关键领域,它们展示了如何通过SQL语言处理复杂的业务逻辑,优化查询性能,以及应对并发控制和数据聚合等挑战。掌握这些经典语句不仅能够帮助开发人员和数据库管理员提高...

    oracle经典sql语句练习题和答案

    本资源“oracle经典sql语句练习题和答案”提供了在scott用户下的两个典型表格——emp(员工表)和dept(部门表)的实践操作题目,旨在帮助用户提升SQL技能。 首先,让我们来了解这两个核心表格。`emp`表通常包含...

    Oracle Sql语句转换成Mysql Sql语句

    本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要差异在于以下几个方面: 1. **数据类型**:Oracle支持的数据类型如NUMBER、LONG、RAW等在...

    Oracle数据库sql语句 跟踪器

    Oracle数据库SQL语句跟踪器,通常被称为SQL Monitor,是一种强大的工具,用于监控和分析数据库中的SQL语句执行情况。在Oracle环境中,理解SQL语句的行为是优化数据库性能的关键。SQL Monitor提供实时视图,帮助DBA...

    压测Oracle的SQL语句的性能情况

    本文将深入探讨如何利用压力测试工具来评估和优化Oracle数据库中的SQL语句性能。 标题"压测Oracle的SQL语句的性能情况"暗示了我们关注的是在高负载情况下,Oracle数据库处理SQL查询的能力。压力测试(Pressure ...

    Oracle-Sql语句资料oracle+110个常用函数经典SQL语句大全.zip

    Oracle_Sql语句资料oracle+110个常用函数经典SQL语句大全,可供学习参考。

    ORACLE常用SQL语句大全.pdf

    Oracle 常用 SQL 语句大全 本文档总结了 Oracle 中常用的 SQL 语句,包括数据库的创建、删除、备份、表的创建、删除、修改、索引的创建、视图的创建等基本操作,以及一些高级查询运算符的使用。 一、数据库操作 ...

    ORACLE数据库SQL语句美化器

    对ORACLE-SQL进行一些布局优化,更新它的格式

    oracle常用SQL语句(汇总版).docx

    Oracle 常用 SQL 语句汇总 Oracle 是一个功能强大且复杂的关系数据库管理系统,它提供了多种 SQL 语句来管理和操作数据库。在本文中,我们将详细介绍 Oracle 中常用的 SQL 语句,包括数据控制语句(DML)、数据定义...

    [自己开发]一款非常好用的抓取Oracle数据库SQL语句的工具

    Oracle SQL Profiler,自己设计算法写的一款非常好用的抓取Oracle数据库SQL语句的工具,可以再没有源码的情况下监控ORACLE数据库服务器的v$sqlarea视图抓取出从点击开始按钮到点击结束按钮期间执行过的SQL语句。...

    oracle的SQL语句的一些经验总结

    Oracle SQL语句是数据库管理员和开发人员在处理Oracle数据库时不可或缺的工具。它允许用户查询、更新、插入和删除数据,以及执行各种复杂的数据库操作。以下是对"Oracle的SQL语句的一些经验总结"中可能涉及的关键...

    Oracle高效SQL语句原则

    Oracle 高效 SQL 语句原则是指在编写 Oracle 数据库 SQL 语句时需要遵循的一些基本原则,以便提高 SQL 语句的执行效率,减少数据库服务器的负载,提高应用程序的性能。下面是 Oracle 高效 SQL 语句原则的详细介绍: ...

    oracle监听执行sql语句

    ### Oracle监听执行SQL语句详解 #### 一、Oracle监听执行概述 在Oracle数据库管理与维护过程中,有时候我们需要了解应用程序正在执行哪些SQL语句,这不仅有助于性能优化,还可以帮助我们诊断潜在的问题。通过监听...

    Oracle中SQL语句执行效率的查找与解决

    本文将深入探讨Oracle中SQL语句执行效率的查找与解决方法,特别关注于如何识别和优化那些导致性能瓶颈的查询。 ### Oracle SQL执行效率:查找与解决 #### 一、资源消耗分析 在Oracle中,SQL语句执行效率低下通常...

    Oracle基本sql语句

    Oracle数据库是全球最广泛使用的数据库管理系统之一,它遵循SQL标准,提供了一套强大的SQL语句,使得数据库操作变得高效和灵活。在Oracle数据库中,SQL语句是与数据库进行交互的主要方式。本文将总结一些Oracle基本...

    sqlserver自动生成sql语句工具sqlserver转oracle

    本篇文章将详细探讨如何利用工具实现SQL Server自动生成SQL语句并转换到Oracle。 首先,标题中的"sqlserver自动生成sql语句工具"指的是可以分析SQL Server数据库结构和数据,自动生成对应的SQL创建语句的软件。这种...

    oracle、sql语句基础

    oracle、sql语句基础

    ORACLE_SQL语句

    根据给定的文件信息,以下是对Oracle SQL语句的关键知识点的详细解读: ### Oracle SQL语句概述 Oracle SQL是Oracle数据库系统中用于管理和查询数据的标准语言。它提供了强大的功能来处理复杂的数据库操作,包括...

Global site tag (gtag.js) - Google Analytics