Oracle基础知识

江南小鱼 2010-06-11 08:23:31
很久不来csdn了,端午节即将来临,祝福各位身体健康、节日愉快!
由于项目需要,刚开始学习Oracle;本人不才,当年非软件专业,当年没学习过Oracle,毕业摸爬滚打有1年半了。

各位从事Oracle开发的朋友,如果你愿意分享一下你的开发经验,给菜鸟一点指点,不胜感激。来者有分!
...全文
1380 72 打赏 收藏 转发到动态 举报
写回复
用AI写文章
72 条回复
切换为时间正序
请发表友善的回复…
发表回复
cc_user 2011-05-19
  • 打赏
  • 举报
回复
create table AAA as select *from temp_AAA
江南小鱼 2010-10-14
  • 打赏
  • 举报
回复
请教,Oracle数据类型对应的C#数据类型?
也就是说,读取Oracle表数据放在一个DataTable,取列的DataType,Oracle的数据类型分别对应C#中的什么类型。


江南小鱼 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 69 楼 leilei1983_1999 的回复:]
去 itpub 论坛吧,哪里面什么都有。
[/Quote]
顶~~~
leilei1983_1999 2010-09-24
  • 打赏
  • 举报
回复
去 itpub 论坛吧,哪里面什么都有。
江南小鱼 2010-09-22
  • 打赏
  • 举报
回复
[Quote=引用 66 楼 kaertiger999 的回复:]
都贴写乱87遭的代码干个啥?
[/Quote]

不让帖子沉下去
江南小鱼 2010-09-22
  • 打赏
  • 举报
回复
[Quote=引用 65 楼 kaertiger999 的回复:]
一句话,四个字。基础,底层!
[/Quote]
向您学习!
kaertiger999 2010-09-16
  • 打赏
  • 举报
回复
都贴写乱87遭的代码干个啥?
kaertiger999 2010-09-16
  • 打赏
  • 举报
回复
一句话,四个字。基础,底层!
江南小鱼 2010-09-02
  • 打赏
  • 举报
回复
SQL SERVER与ORACLE进行数据同步,由于月底数据库会进行结转,产生历史表;SQL SERVER结转后,同步到ORACLE,需要创建新的历史表;新创建表就涉及到把新表的权限分配问题。
CREATE OR REPLACE PROCEDURE GrantPrivilegeToYsas(

i_st in varchar2,--format:IBCS_TL

i_flag out number--0:true 1:false

) authid current_user

is--Author:wangqingkun

/*

Description:Grant Privilege to YSAS

Create date:2010-09-02

*/

--define dynamic Cursor to loop History Table

TYPE t_Cur is ref Cursor;

v_Cursor t_Cur;

--temp variable

v_tmpsql varchar2(4000);

v_NowZWNY varchar2(10);

v_TableCount number;

v_TableName varchar2(128);

BEGIN

v_tmpsql:='

select max(i_zhangwuny)

from '||i_st||'.sys_jiezhuanrz';

execute immediate v_tmpsql into v_NowZWNY;

v_NowZWNY:=v_NowZWNY-1;

--Search

v_tmpsql:='

SELECT nvl(count(TABLE_NAME),0)

FROM ALL_TABLES

WHERE TABLE_NAME LIKE ''%'||v_NowZWNY||'''';

execute immediate v_tmpsql into v_TableCount;



if v_TableCount>0 then

begin

v_tmpsql:='

SELECT TABLE_NAME

FROM ALL_TABLES

WHERE TABLE_NAME LIKE ''%'||v_NowZWNY||'''';

dbms_output.put_line(v_tmpsql);

--Open Cursor

open v_Cursor for v_tmpsql;

loop--Loop

fetch v_Cursor into v_TableName;

--Exit

exit when v_Cursor%NOTFOUND;



v_TableName:=i_st||'.'||v_TableName;

--Grant Privilege to YSAS

v_tmpsql:='

grant select on '||v_TableName||' to ysas';

dbms_output.put_line(v_tmpsql);

execute immediate v_tmpsql;

--Success

i_flag:=0;

end loop;

close v_Cursor;--Close Cursor

--error occurr

EXCEPTION

when others then

rollback;

i_flag:=1;

return;

end;

end if;

END GrantPrivilegeToYsas;
江南小鱼 2010-09-01
  • 打赏
  • 举报
回复
一问题百思不得其解,牛人们指点。
一存储过程连不同的服务器,执行效率相差很大;两个ORACLE服务器数据量、索引都一致。
很反常的现象:客户端连低性能ORACLE服务器,执行效率高;连高性能ORACLE服务器,执行效率低。
江南小鱼 2010-08-30
  • 打赏
  • 举报
回复
长整数的处理。假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,则实际的长整数m

表示为:
m=a[k]×10(k-1次幂)+a[k-1]×10(k-2次幂)+….+a[2]×10+a[1]
其中a[0]保存该长整数的位数。求: 长整数加长整数或长整数减长整数。
/* 
* int[] a={3,3,9,1}
* 表示的长整数是:193
*/
using System;
using System.Collections.Generic;
using System.Text;

namespace SquareCalc
{
class Program
{
static void Main(string[] args)
{
//产生随机数
Random rn = new Random();
int len = rn.Next(1, 10);
//定义数组a
int[] a = new int[len + 1];
GenerateArray(len, a, rn);
//DisplayArray(a);//输出数组
//定义数组b
int[] b = new int[len + 2];
GenerateArray(len+1, b, rn);
//DisplayArray(b);//输出数组
Console.WriteLine(CalcLongOperation(a,b,0));
Console.ReadKey();
}
static void DisplayArray(params int[] arr)
{
string str = string.Empty;
foreach (int item in arr)
{
str +=item;
Console.WriteLine(item);
}
Console.WriteLine(str);
}
static void GenerateArray(int len, int[] arr,Random rn)
{
arr[0] = len;
for (int i = 1; i < len + 1; i++)
{
arr[i] = rn.Next(1, 10);
}
}
/// <summary>
/// 计算两个数的和或差
/// </summary>
/// <param name="a">长整数1</param>
/// <param name="b">长整数2</param>
/// <param name="type">0:add,1:sub</param>
/// <returns></returns>
static double CalcLongOperation(int[] a,int[] b,int type)
{
int k,k2;
double result, result2;
result = 0d;
result2 = 0d;

k = a.Length == 2 ? 1 : a.Length - 1;
k2 = b.Length == 2 ? 1 : b.Length - 1;
#region
//for (int i = k,j=k-1; i >0; i--,j--)
//{
// result += a[i] * Math.Pow(10, j-1);
//}
//result = double.Parse(result.ToString().Split('.')[0] + result.ToString().Split('.')[1]);
#endregion
result=OutputArray(a, k);
result2 = OutputArray(b, k2);
if (type == 0)
{
return result + result2;
}
else
{
return result - result2;

}
}
static double OutputArray(int[] arr, int k)
{
double result = 0d;
for (int i = k, j = k - 1; i > 0; i--, j--)
{
result += arr[i] * Math.Pow(10, j - 1);
}
result = double.Parse(result.ToString().Split('.')[0] + result.ToString().Split('.')[1]);
return result;
}
}
}
hyl04 2010-08-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lovelj2012 的回复:]
请教两个问题:
1、在sqlplus /nolog下怎么执行返回数据集(即有游标输出参数)的存储过程?
2、存储过程查询的表在ibcs表空间下,存储过程在ysas表空间下;存储过程中都是ibcs.KG_BiaoKaXX这种引用的,但是执行存储过程会报错,提示“ORA-00942:表或视图不存在”。
[/Quote]
第1个问题:
declare
v_cur 包名.游标(此游标为你在包中声明的游标名称)
begin
调用存储过程
end;
奋斗小青年 2010-08-28
  • 打赏
  • 举报
回复
一起学习
hyl04 2010-08-28
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 jerry_bj 的回复:]
哈哈 我接分...同时告诉你关于oracle的备份
分析Oracle下导出某用户所有表的方法 可能很多使用Oracle的客户都会遇到想把某用户所有表导出的情况,本文就提供这样一个方法帮你轻松解决这个问题。

  首先在sqlplus下以该用户登录到Oracle数据库,然后将以下内容粘贴到sqlplus中:

    set feedback off;
    set pagesize ……
[/Quote]
试了一下,好像不行哎!!!
江南小鱼 2010-08-27
  • 打赏
  • 举报
回复
http://www.cnblogs.com/kingjiong/archive/2008/12/21/1359140.html
江南小鱼 2010-08-23
  • 打赏
  • 举报
回复
有一存储过程,在我本地运行(连我本子上的ORACLE服务器)正常;连另外一台ORACLE服务器,执行该存储过程会提示“ORA-03113:通信通道的文件结束”,请问这个怎么解决呢?是什么情况造成的呢?
江南小鱼 2010-07-12
  • 打赏
  • 举报
回复
感谢以上各位的支持!
我本是朱 2010-07-11
  • 打赏
  • 举报
回复
复制 粘贴 学习了 谢谢
山书生 2010-07-11
  • 打赏
  • 举报
回复
mark~.~
da21 2010-07-11
  • 打赏
  • 举报
回复


30. 不明确的索引等级


当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的.

举例:

DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引.


SELECT ENAME

FROM EMP

WHERE DEPTNO > 20

AND EMP_CAT > ‘A';


这里, ORACLE只用到了DEPT_NO索引. 执行路径如下:


TABLE ACCESS BY ROWID ON EMP

INDEX RANGE SCAN ON DEPT_IDX


译者按:

我们来试一下以下这种情况:

SQL> select index_name, uniqueness from user_indexes where table_name = 'EMP';


INDEX_NAME UNIQUENES

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

EMPNO UNIQUE

EMPTYPE NONUNIQUE


SQL> select * from emp where empno >= 2 and emp_type = 'A' ;


no rows selected



Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE)


虽然EMPNO是唯一性索引,但是由于它所做的是范围比较, 等级要比非唯一性索引的等式比较低!



===========================================================================
31. 强制索引失效


如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) .


举例:


SELECT ENAME

FROM EMP

WHERE EMPNO = 7935

AND DEPTNO + 0 = 10 /*DEPTNO上的索引将失效*/

AND EMP_TYPE ||'' = 'A' /*EMP_TYPE上的索引将失效*/


这是一种相当直接的提高查询效率的办法. 但是你必须谨慎考虑这种策略,一般来说,只有在你希望单独优化几个SQL时才能采用它.


这里有一个例子关于何时采用这种策略,


假设在EMP表的EMP_TYPE列上有一个非唯一性的索引而EMP_CLASS上没有索引.


SELECT ENAME

FROM EMP

WHERE EMP_TYPE = ‘A'

AND EMP_CLASS = ‘X';


优化器会注意到EMP_TYPE上的索引并使用它. 这是目前唯一的选择. 如果,一段时间以后, 另一个非唯一性建立在EMP_CLASS上,优化器必须对两个索引进行选择,在通常情况下,优化器将使用两个索引并在他们的结果集合上执行排序及合并. 然而,如果其中一个索引(EMP_TYPE)接近于唯一性而另一个索引(EMP_CLASS)上有几千个重复的值. 排序及合并就会成为一种不必要的负担. 在这种情况下,你希望使优化器屏蔽掉EMP_CLASS索引.

用下面的方案就可以解决问题.

SELECT ENAME

FROM EMP

WHERE EMP_TYPE = ‘A'

AND EMP_CLASS||'' = ‘X';



32. 避免在索引列上使用计算.

WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.


举例:


低效:

SELECT …

FROM DEPT

WHERE SAL * 12 > 25000;


高效:

SELECT …

FROM DEPT

WHERE SAL > 25000/12;


译者按:

这是一个非常实用的规则,请务必牢记



33. 自动选择索引

如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性.

在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引.


举例:

SELECT ENAME

FROM EMP

WHERE EMPNO = 2326

AND DEPTNO = 20 ;


这里,只有EMPNO上的索引是唯一性的,所以EMPNO索引将用来检索记录.

TABLE ACCESS BY ROWID ON EMP

INDEX UNIQUE SCAN ON EMP_NO_IDX



34. 避免在索引列上使用NOT

通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的

影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.

举例:


低效: (这里,不使用索引)


SELECT …

FROM DEPT

WHERE DEPT_CODE NOT = 0;


高效: (这里,使用了索引)


SELECT …

FROM DEPT

WHERE DEPT_CODE > 0;


需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符.

NOT > to <=

NOT >= to <

NOT < to >=

NOT <= to >



译者按:

在这个例子中,作者犯了一些错误. 例子中的低效率SQL是不能被执行的.

我做了一些测试:


SQL> select * from emp where NOT empno > 1;

no rows selected

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)


SQL> select * from emp where empno <= 1;

no rows selected

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'

2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)


两者的效率完全一样,也许这符合作者关于” 在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符” 的观点.



35. 用>=替代>


如果DEPTNO上有一个索引,


高效:


SELECT *

FROM EMP

WHERE DEPTNO >=4


低效:


SELECT *

FROM EMP

WHERE DEPTNO >3


两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.



===========================================================================

36. 用UNION替换OR (适用于索引列)

通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.

在下面的例子中, LOC_ID 和REGION上都建有索引.

高效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10

UNION

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE REGION = “MELBOURNE”


低效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10 OR REGION = “MELBOURNE”


如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.


注意:


WHERE KEY1 = 10 (返回最少记录)

OR KEY2 = 20 (返回最多记录)


ORACLE 内部将以上转换为

WHERE KEY1 = 10 AND

((NOT KEY1 = 10) AND KEY2 = 20)

============================================================================
38. 避免在索引列上使用IS NULL和IS NOT NULL

避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果至少有一个列不为空,则记录存在于索引中.

举例:

如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值(123,null)的记录(插入). 然而如果

所有的索引列都为空,ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000

条具有相同键值的记录,当然它们都是空!


因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.

举例:


低效: (索引失效)

SELECT …

FROM DEPARTMENT

WHERE DEPT_CODE IS NOT NULL;


高效: (索引有效)

SELECT …

FROM DEPARTMENT

WHERE DEPT_CODE >=0;

===========================================================================
39. 总是使用索引的第一个列

如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.


译者按:

这也是一条简单而重要的规则. 见以下实例.


SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));

Table created.

SQL> create index multindex on multiindexusage(inda,indb);

Index created.

SQL> set autotrace traceonly


SQL> select * from multiindexusage where inda = 1;

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE'

2 1 INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE)


SQL> select * from multiindexusage where indb = 1;

Execution Plan

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

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE'


很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引

加载更多回复(52)
谢谢大家的支持,我会陆续上传相关电子书 由于体积较大,本书分两卷压缩,请都下载完再解压! Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) http://download.csdn.net/source/3268312 内容简介   本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)。   除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sql和pl/sql初学者,也适合于有经验的oracle应用开发人员。 前言 第一部分 sql和pl/sql相关工具  第1章 在windows 平台上安装oracle database 11g  第2章 配置网络服务名  第3章 使用sql database  第4章 使用sql*plus 第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 操纵数据  第9章 复杂查询  第10章 管理常用对象 第三部分 pl/sql  第11章 pl/sql基础  第12章 访问oracle  第13章 编写控制结构  第14章 使用复合数据类型  第15章 使用游标  第16章 异常处理 . 第17章 本地动态sql  第18章 pl/sql过程  第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  第24章 读写os文件  第25章 开发多媒体应用  第26章 开发web应用  第27章 dbms_sq动态sql  第28章 管理统计  第29章 使用数据库资源管理器  第30章 数据加密和解密  第31章 使用调度程序  第32章 使用flashback  第33章 使用重定义联机表  第34章 修正损坏块  第35章 使用日里民挖掘  第36章 使用管道  第37章 使用精细访问控制  第38章 使用精细审计  第39章 使用预警事件  第40章 转换rowid  第41章 其他常用包 习题答案

17,091

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧