oracle初学者,求大神

oracle初学者,求大神,第1张

CREATE OR REPLACE PROCEDURE p_count(v_owner IN VARCHAR2,

v_table_name IN VARCHAR2) IS

v_sql VARCHAR2(500);

r_return NUMBER(10);

BEGIN

v_sql := NULL;

v_sql := 'select count(1) from ' || v_owner || '' || v_table_name;

EXECUTE IMMEDIATE v_sql

INTO r_return;

dbms_outputput_line(r_return);

END p_count;

rownum是从第一行开始查询的伪列,是返回的总行数,不能直接用rownum=2你可以通过子查询实现

select from(select rownum no ,id,name from a) where no=2

1、查看表空间的大小,首先我们要登录到oracle数据库,我们要使用管理员的身份登录,因为管理员的权限要相对的大一些。

2、登录到数据库之后,我们要在侧边栏找到dataspace这个文件夹,这个文件夹下存放的就是我们管理员可以管理的所有的表空间的名称。

3、根据dataspace文件夹下的内容名称,选择我们想要看的表空间,使用右键点击的方式,选择右键显示中的属性按钮。

4、进入到属性表之后,我们可以看到当前表空间的许多属性,其中有个属性叫做segment space management的选项,当这个选项的值为auto的时候,表示当前表空间是可以自增长的,否则就是固定大小的。

注释

oracle使用的是 –(两个 ) 批量注释 //

mysql使用的是 # 批量注释 //

通配符的使用

mysql和oracle都支持通配符 % 用以模糊查询 mysql还可以用instr(para para )函数来做匹配查询 速度更快 para 是原字符串 可以是表的字段 para 是需要匹配到的字符串

自增长数据类型的处理

oracel没有自动增长的数据类型 需要建立序列号 插入记录时 对该序列号使用nextval方法获取数据值

mysql有自动增长的数据类型 插入记录时不用 *** 作该字段 自动获取增长值

字符串单引号双引号的处理

oracel只能使用单引号包起字符串

mysql对字符串可以使用单引号和双引号 两个都支持

按位与函数

oracle的按位与 *** 作是 bitand() 按位或 bitor() 按位异或 bitxor()

eg select bitand( ) from dual ;

mysql的按位与是 & 按位或 | 按位异或 ^

eg select & ;

from子句

mysql可以没有from字句 oracle则是需要的 如查询系统当前时间:

oracle:

select sysdate from dual

mysql:

select sysdate();

查询结果数据分页

orale使用rowmum限制查询返回的总行数 是oracle系统顺序分配查询返回的行的编号 返回的第一行分配的是

因为rownum总是从 开始 当rownum=n或rownum>n时(n> 的自然数) 系统认为是false条件 所以无法查到 即rownum只支持小于判断 用于返回多少条以内的记录 如果想要返回的记录是一个区间 需要定义一个子查询 并且为子查询的rownum命名一个别名 如想要返回一个表的第二条和第三条记录:

select from (select rownum no col col from table where rownum=

另外 rownum不能以任何表的名称作为前缀

mysql使用limit分页 limit 子句可以被用于强制 select语句返回指定的记录数 limit接受一个或两个数字参数 参数必须是一个整数常量 第一个参数指定第一个返回记录行的偏移量 可缺省 默然为 第二个参数指定返回记录行的最大数目 初始记录行的偏移量是

eg select from table limit ; #检索记录行

#为了检索从某一个偏移量到记录集的结束所有的记录行 可以指定第二个参数为

select from table limit ; # 检索记录行 last

#如果只给定一个参数 它表示返回最大的记录行数目

select from table limit ; # 检索前 个记录行 换句话说 limit n 等价于 limit n

日期字段处理

orale日期字段只有date mysql日期字段分date和time两种

oracle的时间系统函数是sysdate

mysql:

current_date/curdate() 以 YYYY MM DD 或YYYYMMDD格式返回今天日期值 取决于函数是在一个字符串还是数字上下文被使用

current_time/curtime() 以 HH:MM:SS 或HHMMSS格式返回当前时间值 取决于函数是在一个字符串还是在数字的上下文被使用

now()/sysdate() 以 YYYY MM DD HH:MM:SS 或YYYYMMDDHHMMSS格式返回当前的日期和时间 取决于函数是在一个字符串还是在数字的上下文被使用

now()/sysdate()函数以 YYYY MM DD HH:MM:SS 返回当前的日期时间 可以直接存到datetime字段中 curdate()以 YYYY MM DD 的格式返回今天的日期 可以直接存到DATE字段中 CURTIME()以 HH:MM:SS 的格式返回当前的时间 可以直接存到TIME字段中

查询一个表 其日期字段date_col的值系统时间 天以内

oracle

SELECT FROM table WHERE date_col >= sysdate –

mysql:

select from table where to_days(date_col) >= to_days(now()) – ;

select date_sub(now() interval day); # select date_add(now() interval day); date_add 是增加

日期格式

oracle 使用to_char()函数

select to_char(sysdate yyyy mm dd ) from dual;

select to_char(sysdate hh :mi:ss ) from dual;

mysql 使用date_format() 或 time_format()

select date_format(now() %Y %m %d );

lishixinzhi/Article/program/Oracle/201311/18066

以下的文章主要是对Oracle g <;数据库的相关内容的介绍 我们可以对其使用更多更新的optimizer hints来控制优化的相关行为 以下就是对Oracle g数据库的解析一下这些强大的新hints:

spread_min_ ysis

使用这一hint 你可以忽略一些关于如详细的关系依赖图分析等电子表格的编译时间优化规则 其他的一些优化 如创建过滤以有选择性的定位电子表格访问结构并限制修订规则等 得到了继续使用

由于在规则数非常大的情况下 电子表格分析会很长 这一提示可以帮助我们减少由此产生的数以百小时计的编译时间

例:

SELECT /+ SPREAD_MIN_ANALYSIS /

spread_no_ ysis

通过这一hint 可以使无电子表格分析成为可能 同样 使用这一hint可以忽略修订规则和过滤产生 如果存在一电子表格分析 编译时间可以被减少到最低程度

例:

SELECT /+ SPREAD_NO_ANALYSIS /

use_nl_with_index

这项hint使CBO通过嵌套循环把特定的表格加入到另一原始行 只有在以下情况中 它才使用特定表格作为内部表格:如果没有指定标签 CBO必须可以使用一些标签 且这些标签至少有一个作为索引键值加入判断;反之 CBO必须能够使用至少有一个作为索引键值加入判断的标签

例:

SELECT /+ USE_NL_WITH_INDEX (polrecpolrind) /

CARDINALITY

此hint定义了对由查询或查询部分返回的基数的评价 注意如果没有定义表格 基数是由整个查询所返回的总行数

例:

SELECT /+ CARDINALITY ( [tablespec] card ) /

SELECTIVITY

此hint定义了对查询或查询部分选择性的评价 如果只定义了一个表格 选择性是在所定义表格里满足所有单一表格判断的行部分 如果定义了一系列表格 选择性是指在合并以任何顺序满足所有可用判断的全部表格后 所得结果中的行部分

例:

SELECT /+ SELECTIVITY ( [tablespec] sel ) /

然而 注意如果Oracle g的bhints CARDINALITY 和 SELECTIVITY都定义在同样的一批表格 二者都会被忽略

no_use_nl

Hint no_use_nl使CBO执行循环嵌套 通过把指定表格作为内部表格 把每个指定表格连接到另一原始行 通过这一hint 只有hash join和sort merge joins会为指定表格所考虑

例:

SELECT /+ NO_USE_NL ( employees ) /

no_use_merge

此hint使CBO通过把指定表格作为内部表格的方式 拒绝sort merge把每个指定表格加入到另一原始行

例:

SELECT /+ NO_USE_MERGE ( employees dept ) /

no_use_hash

此hint使CBO通过把指定表格作为内部表格的方式 拒绝hash joins把每个指定表格加入到另一原始行

例:

SELECT /+ NO_USE_HASH ( employees dept ) /

no_index_ffs

此hint使CBO拒绝对指定表格的指定标签进行fast full index scan

Syntax: /+ NO_INDEX_FFS ( tablespecindexspec ) /

lishixinzhi/Article/program/Oracle/201311/17053

我把分页查询的模板发给你,我自己总结的,你先看看,现在很晚了,是在不行我明天来答

这是我写的表及测试数据,你先看看能看懂不,主要是把原理弄懂

create table book

(

BID varchar2(10) primary key,

Title varchar2(50),

Author varchar2(50)

);

insert into book values('b1','我爱这土地','艾青');

insert into book values('b2','C#高级程序设计','小C');

insert into book values('b3','这是一本计算机的书','我是作者');

insert into book values('b4','这是一本数学的书','我是写数学的作者');

insert into book values('b5','工商管理学','小工');

insert into book values('b6','余秋雨散文集','余秋雨');

insert into book values('b7','繁星春水','冰心');

insert into book values('b8','Java高级程序设计','Java');

insert into book values('b9','一百个励志故事','励志');

insert into book values('b10','凯西来了','布莱尔');

insert into book values('b11','工商工商工商','工工工');

insert into book values('b12','数学微积分','小伟');

insert into book values('b13','ASPNET核心技术','小菜');

insert into book values('b14','C#与WinForm高级程序设计','刘智勇');

insert into book values('b15','数学数学数学','树蜀黍');

insert into book values('b16','人生若只如初见','安意如');

commit;

/

--统计每个部门有多少人

/select ejob,count(decode(edeptno,'10',1)) 部门10,count(decode(edeptno,'20',1)) 部门20,count(decode(edeptno,'30',1)) 部门30,count(decode(edeptno,'40',1)) 部门40 from emp e group by ejob;

/

--分页

/小于大的大于小的,查询出表的总行数

select t2 from (select rownum r,t1 from 表名 t1 where rownum<每页条数当前页数+1) t2

where t2r>每页条数(当前页数-1);

/

/select t2 from (select rownum r,t1 from book t1 where rownum<101+1) t2

where t2r>10(1-1);

对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号 返回的第一行分配的是 第二行是 依此类推 这个伪字段可以用于限制查询返回的总行数 而且rownum不能以任何表的名称作为前缀

举例说明

例如表 student(学生)表 表结构为

ID           varchar ( ) 学号

namevarchar ( )  姓名

create table student (ID varchar ( ) name varchar ( ));

insert into student values( 张一 );

insert into student values( 王二 );

insert into student values( 李三 );

insert into student values( 赵四 );

mit;

( ) rownum 对于等于某值的查询条件

如 果希望找到学生表中第一条学生的信息 可以使用rownum= 作为条件 但是想找到学生表中第二条学生的信息 使用rownum= 结果查不到数据 因 为rownum都是从 开始 但是 以上的自然数在rownum做等于判断是时认为都是false条件 所以无法查到rownum = n(n> 的自然数)

SQL> select rownum id name from student where rownum= ;(可以用在限制返回记录条数的地方 保证不出错 如 隐式游标)

SQL> select rownum id name from student where rownum= ;

ROWNUM ID     NAME

张一

SQL> select rownum id name from student where rownum = ;

ROWNUM ID     NAME

( )rownum对于大于某值的查询条件

如果想找到从第二行记录以后的记录 当使用rownum> 是查不出记录的 原因是由于rownum是一个总是从 开始的伪列 Oracle 认为rownum> n(n> 的自然数)这种条件依旧不成立 所以查不到记录

SQL> select rownum id name from student where rownum > ;

ROWNUM ID     NAME

那如何才能找到第二行以后的记录呀 可以使用以下的子查询方法来解决 注意子查询中的rownum必须要有别名 否则还是不会查出记录来 这是因为rownum不是某个表的列 如果不起别名的话 无法知道rownum是子查询的列还是主查询的列

SQL>select from(select rownum no id name from student) where no> ;

NO ID     NAME

李三

赵四

SQL> select from(select rownum id name from student)where rownum> ;

ROWNUM ID     NAME

( )rownum对于小于某值的查询条件

如果想找到第三条记录以前的记录 当使用rownum< 是能得到两条记录的 显然rownum对于rownum<n((n> 的自然数)的条件认为是成立的 所以可以找到记录

SQL> select rownum id name from student where rownum < ;

ROWNUM ID     NAME

张一

王二

综 上几种情况 可能有时候需要查询rownum在某区间的数据 那怎么办呀从上可以看出rownum对小于某值的查询条件是人为true的 rownum对 于大于某值的查询条件直接认为是false的 但是可以间接的让它转为认为是true的 那就必须使用子查询 例如要查询rownum在第二行到第三行之 间的数据 包括第二行和第三行数据 那么我们只能写以下语句 先让它返回小于等于三的记录行 然后在主查询中判断新的rownum的别名列大于等于二的记 录行 但是这样的 *** 作会在大数据集中影响速度

SQL> select from (select rownum no id name from student where rownum<= ) where no >= ;

NO ID     NAME

王二

李三

( )rownum和排序

Oracle中的rownum的是在取数据的时候产生的序号 所以想对指定排序的数据去指定的rowmun行数据就必须注意了

SQL> select rownum id name from student order by name;

ROWNUM ID     NAME

李三

王二

张一

赵四

可以看出 rownum并不是按照name列来生成的序号 系统是按照记录插入时的顺序给记录排的号 rowid也是顺序分配的 为了解决这个问题 必须使用子查询

SQL> select rownum id name from (select from student order by name);

ROWNUM ID     NAME

李三

王二

张一

赵四

这样就成了按name排序 并且用rownum标出正确序号(有小到大)

笔者在工作中有一上百万条记录的表 在jsp页面中需对该表进行分页显示 便考虑用rownum来作 下面是具体方法(每页

显示 条)

select from tabname where rownum< order by name 但却发现oracle却不能按自己的意愿来执行 而是先随便取 条记录 然后再 order by 后经咨询oracle 说rownum确实就这样 想用的话 只能用子查询 来实现先排序 后rownum 方法如下

select from (select from tabname order by name) where rownum< 但这样一来 效率会较低很多

后经笔者试验 只需在order by 的字段上加主键或索引即可让oracle先按 该字段排序 然后再rownum 方法不变

select from tabname where rownum< order by name

取得某列中第N大的行

select column_name from

(select table_name dense_rank() over (order by column desc) rank from table_name)

where rank = &N

假如要返回前 条记录

select from tablename where rownum< ;(或是rownum <= 或是rownum != )

假如要返回第 条记录

select from tablename

where …

and rownum<

minus

select from tablename

where …

and rownum<

order by name

选出结果后用name排序显示结果 (先选再排序)

注意 只能用以上符号(< <= !=)

select from tablename where rownum != ;返回的是前9条记录

不能用 > >= = Beeen and 由于rownum是一个总是从 开始的伪列 Oracle 认为这种条件 不成立 查不到记录

另外 这个方法更快

select from (

select rownum r a from yourtable

where rownum <=

order by name )

where r >

这样取出第 条记录!(先选再排序再选)

要先排序再选则须用select嵌套 内层排序外层选 rownum是随着结果集生成的 一旦生成 就不会变化了 同时 生成的结果是依次递加的 没有 就永远不会有 rownum 是在 查询集合产生的过程中产生的伪列 并且如果where条件中存在 rownum 条件的话 则:

假如 判定条件是常量 则

只能 rownum = <= 大于 的自然数 = 大于 的数是没有结果的 大于一个数也是没有结果的

即 当出现一个 rownum 不满足条件的时候则 查询结束 this is stop key!

: 当判定值不是常量的时候

lishixinzhi/Article/program/Oracle/201311/17923

以上就是关于oracle初学者,求大神全部的内容,包括:oracle初学者,求大神、oracle中从不同的表中取数据的写法、oracle数据库如何查询表数据量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9418680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存