当前位置:首页 » 编程语言 » oraclesql语句分析
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oraclesql语句分析

发布时间: 2023-04-16 13:56:34

A. Oraclesql精妙SQL语句讲解

行列转换 行转列

DROP TABLE t_change_lc;

CREATE TABLE t_change_lc (card_code VARCHAR ( ) q NUMBER bal NUMBER);

INSERT INTO t_change_lc

SELECT card_code ROWNUM q trunc(dbms_random VALUE * ) bal FROM al CONNECT BY ROWNUM <=

UNION

SELECT card_code ROWNUM q trunc(dbms_random VALUE * ) bal FROM al CONNECT BY ROWNUM <= ;

SELECT * FROM t_change_lc;

SELECT a card_code

SUM(decode(a q a bal )) q

SUM(decode(a q a bal )) q

SUM(decode(a q a bal )) q

SUM(decode(a q a bal )) q

FROM t_change_lc a

GROUP BY a card_code

ORDER BY ;

行列转换 列转行

DROP TABLE t_change_cl;

CREATE TABLE t_change_cl AS

SELECT a card_code

SUM(decode(a q a bal )) q

SUM(decode(a q a bal )) q

SUM(decode(a q a bal )) q

SUM(decode(a q a bal )) q

FROM t_change_lc a

GROUP BY a card_code

ORDER BY ;

SELECT * FROM t_change_cl;

SELECT t card_code

t rn q

decode(t rn t q t q t q t q ) bal

FROM (SELECT a * b rn

FROM t_change_cl a

(SELECT ROWNUM rn FROM al CONNECT BY ROWNUM <= ) b) t

ORDER BY ;

行列转换 行转列 合并

DROP TABLE t_change_lc_ma;

核局陪CREATE TABLE t_change_lc_ma AS SELECT card_code quarter_ ||q AS q FROM t_change_lc;

SELECT * FROM t_change_lc_ma;

SELECT t card_code substr(MAX(sys_connect_by_path(t q ; )) ) q

FROM (SELECT a card_code

a q

row_number() over(PARTITION BY a card_code ORDER BY a q) rn

FROM t_change_lc_ma a) t

START WITH t rn =

CONNECT BY t card_code = PRIOR t card_code

AND t rn = PRIOR t rn

GROUP BY t card_code;

行列转换 列转行 分割

DROP TABLE t_change_cl_ma;

CREATE TABLE t_change_cl_ma AS

SELECT t card_code substr(MAX(sys_connect_by_path(t q ; )) ) q

FROM (SELECT a card_code

a q

腊历改蠢row_number() over(PARTITION BY a card_code ORDER BY a q) rn

FROM t_change_lc_ma a) t

START WITH t rn =

CONNECT BY t card_code = PRIOR t card_code

AND t rn = PRIOR t rn

GROUP BY t card_code;

SELECT * FROM t_change_cl_ma;

SELECT t card_code

substr(t q

instr( ; || t q ; rn)

instr(t q || ; ; rn) instr( ; || t q ; rn)) q

FROM (SELECT a card_code a q b rn

FROM t_change_cl_ma a

(SELECT ROWNUM rn FROM al CONNECT BY ROWNUM <= ) b

WHERE instr( ; || a q ; rn) > ) t

ORDER BY ;

实现一条记录根据条件多表插入

DROP TABLE t_ia_src;

CREATE TABLE t_ia_src AS SELECT a ||ROWNUM c b ||ROWNUM c FROM al CONNECT BY ROWNUM<= ;

DROP TABLE t_ia_dest_ ;

CREATE TABLE t_ia_dest_ (flag VARCHAR ( ) c VARCHAR ( ));

DROP TABLE t_ia_dest_ ;

CREATE TABLE t_ia_dest_ (flag VARCHAR ( ) c VARCHAR ( ));

DROP TABLE t_ia_dest_ ;

CREATE TABLE t_ia_dest_ (flag VARCHAR ( ) c VARCHAR ( ));

SELECT * FROM t_ia_src;

SELECT * FROM t_ia_dest_ ;

SELECT * FROM t_ia_dest_ ;

SELECT * FROM t_ia_dest_ ;

INSERT ALL

WHEN (c IN ( a a )) THEN

INTO t_ia_dest_ (flag c) VALUES(flag c )

WHEN (c IN ( a a )) THEN

INTO t_ia_dest_ (flag c) VALUES(flag c )

ELSE

INTO t_ia_dest_ (flag c) VALUES(flag ||flag c ||c )

SELECT c c f flag f flag FROM t_ia_src;

如果存在就更新 不存在就插入用一个语句实现

DROP TABLE t_mg;

CREATE TABLE t_mg(code VARCHAR ( ) NAME VARCHAR ( ));

SELECT * FROM t_mg;

MERGE INTO t_mg a

USING (SELECT the code code the name NAME FROM al) b

ON (de = de)

WHEN MATCHED THEN

UPDATE SET a NAME = b NAME

WHEN NOT MATCHED THEN

INSERT (code NAME) VALUES (de b NAME);

抽取/删除重复记录

DROP TABLE t_p;

CREATE TABLE t_p AS SELECT code_ ||ROWNUM code dbms_random string( z ) NAME FROM al CONNECT BY ROWNUM<= ;

INSERT INTO t_p SELECT code_ ||ROWNUM code dbms_random string( z ) NAME FROM al CONNECT BY ROWNUM<= ;

SELECT * FROM t_p;

SELECT * FROM t_p a WHERE a ROWID <> (SELECT MIN(b ROWID) FROM t_p b WHERE de=de);

SELECT de b NAME

FROM (SELECT de

a NAME

row_number() over(PARTITION BY de ORDER BY a ROWID) rn

FROM t_p a) b

WHERE b rn > ;

IN/EXISTS的不同适用环境

t_orders customer_id有索引

SELECT a *

FROM t_employees a

WHERE a employee_id IN

(SELECT b sales_rep_id FROM t_orders b WHERE b customer_id = );

SELECT a *

FROM t_employees a

WHERE EXISTS (SELECT

FROM t_orders b

WHERE b customer_id =

AND a employee_id = b sales_rep_id);

t_employees department_id有索引

SELECT a *

FROM t_employees a

WHERE a department_id =

AND EXISTS

(SELECT FROM t_orders b WHERE a employee_id = b sales_rep_id);

SELECT a *

FROM t_employees a

WHERE a department_id =

AND a employee_id IN (SELECT b sales_rep_id FROM t_orders b);

FBI

DROP TABLE t_fbi;

CREATE TABLE t_fbi AS

SELECT ROWNUM rn dbms_random STRING( z ) NAME SYSDATE + dbms_random VALUE * dt FROM al

CONNECT BY ROWNUM <= ;

CREATE INDEX idx_nonfbi ON t_fbi(dt);

DROP INDEX idx_fbi_ ;

CREATE INDEX idx_fbi_ ON t_fbi(trunc(dt));

SELECT * FROM t_fbi WHERE trunc(dt) = to_date( yyyy mm dd ) ;

不建议使用

SELECT * FROM t_fbi WHERE to_char(dt yyyy mm dd ) = ;

LOOP中的MIT/ROLLBACK

DROP TABLE t_loop PURGE;

create TABLE t_loop AS SELECT * FROM user_objects WHERE = ;

SELECT * FROM t_loop;

逐行提交

DECLARE

BEGIN

FOR cur IN (SELECT * FROM user_objects) LOOP

INSERT INTO t_loop VALUES cur;

MIT;

END LOOP;

END;

模拟批量提交

DECLARE

v_count NUMBER;

BEGIN

FOR cur IN (SELECT * FROM user_objects) LOOP

INSERT INTO t_loop VALUES cur;

v_count := v_count + ;

IF v_count >= THEN

MIT;

END IF;

END LOOP;

MIT;

END;

真正的批量提交

DECLARE

CURSOR cur IS

SELECT * FROM user_objects;

TYPE rec IS TABLE OF user_objects%ROWTYPE;

recs rec;

BEGIN

OPEN cur;

WHILE (TRUE) LOOP

FETCH cur BULK COLLECT

INTO recs LIMIT ;

forall 实现批量

FORALL i IN recs COUNT

INSERT INTO t_loop VALUES recs (i);

MIT;

EXIT WHEN cur%NOTFOUND;

END LOOP;

CLOSE cur;

END;

悲观锁定/乐观锁定

DROP TABLE t_lock PURGE;

CREATE TABLE t_lock AS SELECT ID FROM al;

SELECT * FROM t_lock;

常见的实现逻辑 隐含bug

DECLARE

v_cnt NUMBER;

BEGIN

这里有并发性的bug

SELECT MAX(ID) INTO v_cnt FROM t_lock;

here for other operation

v_cnt := v_cnt + ;

INSERT INTO t_lock (ID) VALUES (v_cnt);

MIT;

END;

高并发环境下 安全的实现逻辑

DECLARE

v_cnt NUMBER;

BEGIN

对指定的行取得lock

SELECT ID INTO v_cnt FROM t_lock WHERE ID= FOR UPDATE;

在有lock的情况下继续下面的操作

SELECT MAX(ID) INTO v_cnt FROM t_lock;

here for other operation

v_cnt := v_cnt + ;

INSERT INTO t_lock (ID) VALUES (v_cnt);

MIT; 提交并且释放lock

END;

硬解析/软解析

DROP TABLE t_hard PURGE;

CREATE TABLE t_hard (ID INT);

SELECT * FROM t_hard;

DECLARE

sql_ VARCHAR ( );

BEGIN

hard parse

java中的同等语句是 Statement execute()

FOR i IN LOOP

sql_ := insert into t_hard(id) values( || i || ) ;

EXECUTE IMMEDIATE sql_ ;

END LOOP;

MIT;

soft parse

java中的同等语句是 PreparedStatement execute()

sql_ := insert into t_hard(id) values(:id) ;

FOR i IN LOOP

EXECUTE IMMEDIATE sql_

USING i;

END LOOP;

MIT;

END;

正确的分页算法

SELECT *

FROM (SELECT a * ROWNUM rn

FROM (SELECT * FROM t_employees ORDER BY first_name) a

WHERE ROWNUM <= )

WHERE rn > ;

分页算法(why not this one)

SELECT a * ROWNUM rn

FROM (SELECT * FROM t_employees ORDER BY first_name) a

WHERE ROWNUM <= AND ROWNUM > ;

分页算法(why not this one)

SELECT b *

FROM (SELECT a * ROWNUM rn

FROM t_employees a

WHERE ROWNUM < =

ORDER BY first_name) b

WHERE b rn > ;

OLAP

小计合计

SELECT CASE

WHEN a deptno IS NULL THEN

合计

WHEN a deptno IS NOT NULL AND a empno IS NULL THEN

小计

ELSE

|| a deptno

END deptno

a empno

a ename

SUM(a sal) total_sal

FROM scott emp a

GROUP BY GROUPING SETS((a deptno) (a deptno a empno a ename) ());

分组排序

SELECT a deptno

a empno

a ename

a sal

可跳跃的rank

rank() over(PARTITION BY a deptno ORDER BY a sal DESC) r

密集型rank

dense_rank() over(PARTITION BY a deptno ORDER BY a sal DESC) r

不分组排序

rank() over(ORDER BY sal DESC) r

FROM scott emp a

ORDER BY a deptno a sal DESC;

当前行数据和前/后n行的数据比较

SELECT a empno

a ename

a sal

上面一行

lag(a sal) over(ORDER BY a sal DESC) lag_

下面三行

lead(a sal ) over(ORDER BY a sal DESC) lead_

FROM scott emp a

lishixin/Article/program/Oracle/201311/16728

B. oracle 怎么分析sql效率 sql语句

查询一和二都是全表内查询,一中嵌套子查询,还是用的In操作符,困锋效率较低。像单表的这种查询二是衡宽最快的,大部分情咐尺亮况oracle内置的东西,效率都不低的,如果还想提交效率,可在fclass加个索引

C. 请问,在ORACLE里,如何判断一个SQL的性能如何有没有好用的工具

explain plan 是一个很好的分析sql语句的工具,它甚至可以在不执行sql的情况下分析语句. 通过分析,我们就可以知道oracle是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称.

你需要按照从里到外,从上到下的次序解读分析的结果. explain plan分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行.

nested loop是少数不按照上述规则处理的操作, 正确的执行路径是检查对nested loop提供数据的操作,其中操作号最小的将被最先处理.

译者按:

通过实践, 感到还是用sqlplus中的set trace 功能比较方便.

举例:

sql> list

1 select *

2 from dept, emp

3* where emp.deptno = dept.deptno

sql> set autotrace traceonly /*traceonly 可以不显示执行结果*/

sql> /

14 rows selected.

execution plan

----------------------------------------------------------

0 select statement optimizer=choose

1 0 nested loops

自己往后看吧

D. 在oracle存储过程中sql语句想分析该语句,却看不见执行计划,我该怎么办请高手指点!谢谢!

按执行结果来看,是和字符有关,与执行计划有什么关系?!
count(1)可以直接赋值啊:改成下面的再试一下
把iv_specialtag定义成INT类型
SELECT count(1) INTO iv_specialtag
FROM uop_act1.tf_f_user_highvalue
WHERE user_id = iv_user_id
AND partition_id = mod(iv_user_id,10000);

IF iv_specialtag=1 THEN
GOTO LABEL_NEXTUSER;
END IF;

想查执行效率,直接用楼上的SELECT部分语句

E. oracle sql执行计划怎么分析

在发现一个语句的执行计划有异常的时候,通常会生成一个sqlrpt看看使用的执行计划是否正确,如何来判断执行计划是否正确,将通过以下几个步骤来判断:
1.先查看sql语句的结构,看语句中连接是union,还是等值连接还是左、右连接,再看连接中的表数量。
2.查看执行计划中出现异常的部分。
3.查看各表的索引情况及表是否是分区的,在where条件上使用的索引列是否正确,看统计分析表中对表的分析结果是否正确
4.分析表的用途,表的数据日增长量。
5.分析为什么会出现异常的执行计划。
跟踪执行计划的方法:
(1) set autotrace on explain 只显示查询结果和执行计划
set autotrace on statistic 只显示查询结果统计信息
set autotrace on 显示前两者
set autotrace traceonly 不显示查询结果,只显示执行计划和统计信息
set autotrace off 关闭跟踪
要使用autotrace,必须在sqlplus里面使用,且使用的是sys用户。
(2)可以使用explain plan for select * from c_cons 可以解析执行计划,然后通过select * from table(dbms_xplain.display(null,null,’outline’,null));来显示执行计划。
(3)使用工具Toad for oracle使用sql_id来生成执行计划

F. 【基于ORACLE数据库的SQL语句优化分析】 数据库查询语句的优化

【摘要】随着数据库应用范围及规模的不断扩大,数据库的性能问题逐渐显现,优化数据库有助于维持系统的稳定性以及运行的高效性。本文主要依据笔者在实际工作中的精坦敏拍英,对SQL语句优化的目的、SQL语句优化技术及原则进行全面分析和阐述。
【关键词】ORACLE数据库;SQL语句;优化
1前言
随着现代化信息技术的迅猛发展,互联网应用的日益普及,数据库技术的影响力越来越大。作为信息系统管理的核心,数据库的主要操作就是查询,数据库的应用效率在很大程度上是由查询速度决定的,特别是对于规模较大的数据库而言,查询速度十分关键。查询速度在SQL语句中占有很大比重,所以,通过对查询语句进行优化有助于促进应用系统性能及效率的进一步提升。
2SQL语句优化分析
2.1SQL语句优化的目的
对于一个数据库而言,在确保设计无误的前提下,要想避免出现性能问题必须确保其拥有合理的SQL语句拿唤结构。最简单的数据库寻找数据路径是对SQL语句进行调整,ORACLE数据库性能提升的主要途径就是对SQL语句进行适当的调整。从本质上讲,SQL语句优化就是确保所使用的语句可以被优化器识别,对索引进行有效利用以便控制表扫描的I/O次数,有效防止出现表搜索。用高性能的SQL语句替代低性能的SQL语句,确定最佳的数据查找路径,尽可能使CPU时间与I/O时间保持平衡是进行优化的主要目的。在对SQL语句进行优化的过程中,以系统需求为依据确定最有可能实现性能提升的语句并进行优化。
2.2SQL语句优化技术及原则
当数据量积累到一定程度之后,对于数据库全表SQL语句进行一次扫描,若查询策略较好,一般只用几秒钟,但如果SQL语句性能较低,就需要用几分钟甚至更多时间。从这点不难看出,SQL语句性能对于查询速度具有极大的影响,所以,对于应用系统而言,不仅能满足功能的实现,还要保证SQL语句的质量。
(1)采取适宜的索引。为达到优化查询的目的,一项重要工作就是确定相适应的索引,并严格依照原则加以使用,与此同时,为有效控制I/O竞争,不可以在同一个磁盘中同时建立索引和用户表空间。
语句1:SELECT CUS_NO, CUS_NAME FROM CUSTOMER WHERE CUS_NO NOT IN
(SELECT CUS_NO FROM SERVICE);
语句2: SELECT CUS_NO, CUS_NAME FROM CUSTOMER WHERE NOT EXISTS
(SELECT * FROM SERVICE WHERE SERVICE.CUS_NO=CUSTOMER.CUS_NO);
上述两个语句可以达到一致的查询结果,对二者进行对比,当执行语句1时,由于ORACLE未利用CUSTOMER 表上CUS_NO索引,所以就会扫描整表,在执行语句2的过让羡程中,ORACLE所扫描的只是CUSTOMER 表子查询中的联合查询,并且使用了CUS_NO索引,因此,在执行效率方面明显优于前者。
(2)避免在SELECT子句中出现“*”。ORACLE在进行解析时,需要按照一定顺序对“*”进行转换,该项转换工作的进行需要对数据库的数据字典进行查询,势必需要花费较多的时间,这样就会导致较低的效率,所以,要避免在SELECT子句中出现“*”。
(3)如果必要可以利用COMMIT提交事务。ORACLE能够自动提交DDL语句,而诸如DML等类型的语句的提交则是通过手动方式或者回滚事务实现的。在编写应用程序的过程中,在操作诸如insert、delete以及update 等较为复杂的语境的时候,利用COMMIT提交事务可以讲会话中持有的锁加以释放,将存在于缓存中的未经修改的数据块进行清除,进而将系统资源予以释放,促进系统性能的进一步提升,因此,如果有必要,可以利用COMMIT对相关事务进行提交。
(4)联合查询连接顺序的确定。如果查询操作涉及到多个表,基础表应当是交叉表,所谓交叉表具体是指被其他表引用的表。连接执行效果在很大程度上受到FROM语句中表的顺序的影响,对于FROM中所包含的表,ORACLE解析器进行处理的顺序是由右至左,SQL语句中所选择的基础表会因优化器的不同而有所区别,在使用CBO的情况下,优化器会对SQL语句中各个表的物理大小以及索引状态进行检查,在此基础上确定一个花费最小的执行路径;在使用RBO的情况下,如果全部的连接条件均有索引与之相对应,那么,FROM子句中位置最后面的表就是基础表。
(5)IN用EXISTS取代。在对数个基础表查询过程中,一般需要进行表的连接。因为利用IN的子查询过程中,ORACLE的扫描对象是全表,因此,出于提高查询效率目的的考虑,应当将IN用EXISTS取代。
(6)在索引列中不使用计算。当通过对函数进行引用在WHERE子句中进行计算的时候,假如索引列只是函数的一部分,优化器就会针对全表进行扫描,而不会使用索引,所以,在索引列中不能使用函数。
3结语
综上所述,随着现代化信息技术的迅猛发展,互联网应用的日益普及,数据库技术的影响力越来越大。在信息量迅速激增的形势下,数据库优化调整成为当前所面临的一大关键性问题,特别是对规模较大的数据库而言,及时进行优化的意义更加倍重大。对于数据库的运行性能而言,最主要的影响因素主要体现在以下几点:数据库系统架构的设计是否合理,资源配置是否科学以及SQL语句编写效率等。笔者从事的是电信企业的运营分析工作,每天都要从数据库取各种数据,可以说是离不开数据库,所以在实践中,我觉得严格遵守SQL语句优化原则及方法,并在实践中及时总结经验教训,可以实现对系统响应时间的有效控制,促进运行效率的提升。
参考文献
[1] 许开宇,胡文骅. 如何提高ORACLE数据库应用程序的性能[J]. 计算机应用与软件. 2002(10)
[2] 郑耀,吴建岚. 基于Oracle数据库的语句优化策略[J]. 信息与电脑(理论版). 2011(07)
[3] 高攀,施蔚然. 基于Oracle数据库的SQL语句优化[J]. 电脑编程技巧与维护. 2010(22)
[4] 钟小权,叶猛. Oracle数据库的SQL语句优化[J]. 计算机与现代化. 2011(03)
作者简介:
王勇军,男,(1981.1-),吉林通化人,就职于中国联合网络通信有限公司长春市分公司,通信工程师,本科,研究方向:SQL使用
(作者单位:中国联合网络通信有限公司长春市分公司)

G. 如何对一个oracle11gsql语句进行统计分析

可以通过district来取出字段,之后通过count计算总数量。
sql:select count(district id) from tablename;
如果id字段没有空值的话,可以通过count统计字段的总数量(字段内容可能重复)。
sql:select count(id) from tablename;

H. oraclesql条件语句

1. oracle SQL查询中,如何在where中用条件语句,判断不同情况,追加不同的And条件

1、先创建一个简单的数据表。

2. oracle数据库中多条脊碧件查询语句怎么写

1、首先需要打开一个oracle数据库界面。

3. oracle sql条件查询

update tb
set studystatus = '002'
where exsist (
select c.courseid
from tb c
where c.courseid = tb.courseid and c.studystatus = '002'
) and studystatus != '002';

说明: 使用exists做条件, 如果有courseid值相同的, 且studystatus为002的, 则将studystatus更新为002, 条件studystatus != '002'则是限制已经为002的记录不需要更新.

你是要修改查询到的结果? 可以在查询语句中使用case when来根据条件得到不同的值:
select s.courseid, case when exists (select c.courseid from tb c where c.courseid = s.courseid and c.studystatus = '002' and rownum < 2) then '002' else s.studystatus end as studystatus
from tb s;
这个是不是你想要的?

4. oracle sql语句时间条件

where time beeen '08:00' and '18:00'

以上是大概意思,具体时间的表示方法要根据数据库时间字段的类型和格式来。

5. ORACLE sql 里面可以用if 语句吗语法是什么

insert 语句中值的顺序如果和表结构一致可以省略列名列表。
这个物野册SQL的意思没看懂,我给分析一下看对不对,
你是不是想表达这个意思:
如果在yangao这个表中存在age3=4的数据,那么,就向yangao中插入一行数据,行数据的内容是罩宏(4,NULL,1).
如果是这样的话,那么IF用的是不对的。
在SQL里面条件的关键字是WHERE。
insert into yangao values(4,NULL,1)
where exists (select * from yangao where(AGE3=4));
mit;
但如果你想表达的是:
在yangao表中插入一条数据,如果存在(select * from yangao where(AGE3=4)) 这样的数据就提交的话,那么应该这么写:
insert into yangao values (4, NULL, 1);
select count(*) into n_count from yangao where (AGE3 = 4);
if n_count > 0 then
mit;
end if;

6. vc 中Oracle sql多条件查询语句怎么写
where1=1--这个你写在后台
and条件1--其他的你就按这种方式来拼就行了,其他的条件不输入也不影响你前边的执行
and条件2
and条件3
and条件4
能按懂吧?

7. oracle数据库条件判断的查询语句怎么写

建表,测试数据:
createtabletest
(收款标志int)

insertintotestvalues(1);
insertintotestvalues(1);
insertintotestvalues(1);
mit;
执行:

selectcase
whena.cnt=b.cntthen
'未收款'
whena.cnt=d.cntthen
'已收款'
whenc.cnt<>0then
'部分收款'
end收款状态
from(selectcount(*)cntfromtest)a,
(selectcount(*)cntfromteshere收款标志=1)b,
(selectcount(*)cntfromteshere收款标志=2)c,
(selectcount(*)cntfromteshere收款标志=3)d
结果:

然后你自己换点其他数据测试一下吧,思路就这么个思路了。

8. 如何在Oracle的Where语句中添加条件判断

*******************
plsql写法:
*******************
1、在sqlplus 中定义一个 游标变量
var p_cursor refcursor

2、写一个plsql过程块
declare
sql_str varchar(1000) := ' ';
begin
if 2 > 1 then
sql_str := 'select * from student where Name=''小王''';
else
sql_str := 'select * from student where Name=''小李''';
end if;
open :p_cursor for sql_str;
end;

3、在sqlplus中打印输出结果
print p_cursor;

***************
补充:有点错误修正了下
***************

---
以上,希望对你有所帮助。

9. Oracle sql查询 in 条件语句

你这样的语句本身应该是有问题的吧,你是想要实现什么样的效果,如果只是想找出tableName表中不同的id,可以这样查:
select distinct id from tableName;

10. Oracle SQL语句实现按条件表达式更新列数据

update .. set col_length=(length(col_number)-4)/2+1

I. 帮我整体分析和讲解下以下 SQL语句(ORACLE中的),给50分~~~

select:
查询
c.dsc
订货方式:
c表的dsc字段
显示字段名字为
订货方式
count():聚合函数
统计数量的
distinct
:消除重复的
from
orderhist
a,names
c,
orderdet
y:要查询的坦伏表
orderhist表在这条语虚晌句中命名为a
where
:条让誉携件
between
and
:在这2个时间内
x.soldwith
in
('1','2','3'):x表soldwith
字段的值是1
2
3的
group
by
:分组显示
sum():聚合函数
字段的值的和

J. oracle sql是怎么解析的

导读:Oracle的后台运作原理是什么?我们的一条命令是如何被执行的?今天我们就从一条简单的Select语句开始,看看Oracle数据库后台的运作机制。

Select语句可以说是DBA和数据库开发者在工作中使用最多的语句之一,但这条语句是如何执行?在Oracle数据库中又是如何运作的呢?今天我们就从一条简单的Select语句开始,看看Oracle数据库后台的运作机制。这对于我们之后的系统管理与故障排除非常有帮助。

第一步:客户端把语句发给服务器端执行

当我们在客户端执行select语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端。虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用事不相同的。服务器上的数据库进程才会对SQL语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程。所以,由于所有的SQL语句都是服务器进程执行的,所以,有些人把服务器进程形象地比喻成客户端进程的“影子”。

第二步:语句解析

当客户端把SQL语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工作,也是在服务器端所进行的。虽然这只是一个解析的动作,但是,其会做很多“小动作”。

1. 查询高速缓存。服务器进程在接到客户端传送过来的SQL语句时,不会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在数据高速缓存中,刚好有其他人使用这个查询语句的话,则服务器进程就会直接执行这个SQL语句,省去后续的工作。所以,采用高速数据缓存的话,可以提高SQL语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面,也是因为这个语句解析的原因。

不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。

2. 语句合法性检查。当在高速缓存中找不到对应的SQL语句时,则数据库服务器进程就会开始检查这条语句的合法性。这里主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在这个语法检查的过程中,不会对SQL语句中所包含的表名、列名等等进行SQL他只是语法上的检查。

3. 语言含义检查。若SQL语句符合语法上的定义的话,则服务器进程接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。

所以,有时候我们写select语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名错误。若能够掌握这个顺序的话,则在应用程序排错的时候,可以节省时间。

4. 获得对象解析锁。当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。对于加锁的原理与方法,我在其他文章中已经有专门叙述,在这里就略过不谈了。

5. 数据访问权限的核对。当语法、语义通过检查之后,客户端还不一定能够取得数据。服务器进程还会检查,你所连接的用户是否有这个数据访问的权限。若你连接上服务器的用户不具有数据访问权限的话,则客户端就不能够取得这些数据。故,有时候我们查询数据的时候,辛辛苦苦地把SQL语句写好、编译通过,但是,最后系统返回个 “没有权限访问数据”的错误信息,让我们气半死。这在前端应用软件开发调试的过程中,可能会碰到。所以,要注意这个问题,数据库服务器进程先检查语法与语义,然后才会检查访问权限。

6. 确定最佳执行计划。当语句与语法都没有问题,权限也匹配的话,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。不过要注意,这个优化是有限的。一般在应用软件开发的过程中,需要对数据库的sql语言进行优化,这个优化的作用要大大地大于服务器进程的自我优化。所以,一般在应用软件开发的时候,数据库的优化是少不了的。

当服务器进程的优化器确定这条查询语句的最佳执行计划后,就会将这条SQL语句与执行计划保存到数据高速缓存。如此的话,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行SQL语句,提高SQL语句处理效率。

第三步:语句执行

语句解析只是对SQL语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条SQL语句。

这个语句执行也分两种情况。一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客户端,而不是从数据库文件中去查询数据。若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中。

这里仍然要注意一点,就是Oracle数据库中,定义了很多种类的高速缓存。像上面所说的SQL语句缓存与现在讲的数据缓存。我们在学习数据库的时候,需要对这些缓存有一个清晰的认识,并了解各个种类缓存的作用。这对于我们后续数据库维护与数据库优化是非常有用的。

第四步:提取数据

当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给用户端进程,从而完成整个查询动作。

从这整个查询处理过程中,我们在数据库开发或者应用软件开发过程中,需要注意以下几点:

一是要了解数据库缓存跟应用软件缓存是两码事情。数据库缓存只有在数据库服务器端才存在,在客户端是不存在的。只有如此,才能够保证数据库缓存中的内容跟数据库文件的内容一致。才能够根据相关的规则,防止数据脏读、错读的发生。而应用软件所涉及的数据缓存,由于跟数据库缓存不是一码事情,所以,应用软件的数据缓存虽然可以提高数据的查询效率,但是,却打破了数据一致性的要求,有时候会发生脏读、错读等情况的发生。所以,有时候,在应用软件上有专门一个功能,用来在必要的时候清除数据缓存。不过,这个数据缓存的清除,也只是清除本机上的数据缓存,或者说,只是清除这个应用程序的数据缓存,而不会清除数据库的数据缓存。

二是绝大部分SQL语句都是按照这个处理过程处理的。我们DBA或者基于Oracle数据库的开发人员了解这些语句的处理过程,对于我们进行涉及到SQL语句的开发与调试,是非常有帮助的。有时候,掌握这些处理原则,可以减少我们排错的时间。特别要注意,数据库是把数据查询权限的审查放在语法语义的后面进行检查的。所以,有时会若光用数据库的权限控制原则,可能还不能满足应用软件权限控制的需要。此时,就需要应用软件的前台设置,实现权限管理的要求。而且,有时应用数据库的权限管理,也有点显得繁琐,会增加服务器处理的工作量。因此,对于记录、字段等的查询权限控制,大部分程序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。