这是我第一次写博客,主要是记录下自己这半个多月以来的学习笔记,以备以后可以随时查看。

  首先就是安装Oracle的问题的,我系统是Win7 64位的,出现各种问题郁闷得不行,最终安装个Oracle10203_vista_w2k8_x86_client客户端连接公司的服务器暂时先用着吧,如果需要使用Odbc则需在C:\Windows\SysWOW64\odbcad32.exe上的系统DSN中添加Odbc的驱动管理,选择Oracle in OraClient10g_home1,有很多警告框的不用管它,Data Source Name的名称是Odbc连接字符串中的DSN名称,其他的就不罗嗦了。

  安装完客户端就安装PLSQL+Developer9.0.2来操作数据库了,默认是英文的,只要把Chinese.lang文件放到pl/sql安装目录下,再Tools->Preferences->Appearance的Language里选择Chinese.lang就可以了,为了能更加快速的找到Tables等文件夹的信息,随便把工具->浏览器文件夹中的Tables、Procedures、Indexes、Functions、Triggers、Views、Sequences、Tablespaces、Packages、Roles、Users移到最上面并将颜色设为蓝色,把工具->浏览器过滤器中的My objects设为默认,最后按照自己的习惯,把窗口的位置调整下,选择窗口->保存版面,好了,大功告成了。

现在开始Oracle的学习了,Oracle跟SQL Server很大的一个不同点就是Oracle使用表空间这一个概念,我感觉表空间就类似SQL Server的一个数据库了,然后Oracle中没有SQL Server中的自增这一概念,不过可以使用Sequences代替,使用方法是:

 CREATE SEQUENCE Seq_test
  
  INCREMENT BY 1  -- 每次加几个
  START WITH 1   -- 从1开始计数
  NOMAXVALUE    -- 不设置最大值
  NOCYCLE     -- 一直累加,不循环
  CACHE 10;

创建完之后就可以直接使用了

insert tb_Test(tId,tName) values(Seq_test.NEXTVAL,'测试');
select Seq_test.CURRVAL from dual; --返回当前的序列值

注意第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。而dual是一个伪表,不用自己创建的,只是为了操作上的方便而存在的,例如select返回的变量,入日期等。

使用Oracle最开始就是先创建表空间跟用户了

 -----------------创建表空间-----------------------------
create tablespace DBTest_tbs --一般建N个存数据的表空间和一个索引空间
datafile 'E:\Oracle\oradata\DBTest_tbs\Ordering.dbf' --表空间的路径
size 100M --大小
autoextend on --自动增长
--定义大小的命令
next 1M maxsize 1000M extent management local;
--删除表空间
--drop tablespace DBTest_tbs including contents and datafiles cascade constraints;
--创建临时表空间
create temporary tablespace DBTest_temp
tempfile 'E:\Oracle\oradata\DBTest_tbs\Temp.dbf' size 100M autoextend on next 1M maxsize 1000M extent management local;
--创建索引表空间
create tablespace DBTest_index
datafile 'E:\Oracle\oradata\DBTest_tbs\Index.dbf' size 100M extent management local;

然后就是创建用户了

 create user DBTest_user identified by 441821
default tablespace DBTest_tbs
temporary tablespace DBTest_temp;
--授权
--一般授予的权限:create session,create table,unlimited tablespace;
--对象权限:用户创建的表属于用户自己的,想给被所有人用,则grant all on table to public;
--可以指定列的权限:grant update(name) on tb to DBTest_user;
grant connect,resource,dba to DBTest_user;
--收权
Revoke dba from DBTest_user;

创建完用户并授予相应的权限就可以创建表之类的DDL操作了,具体语法跟T-SQL语法差不多的,注意一下Oracle的数据类型就可以了。

然后记录下PL/SQL的基本使用方法:

 ----------------------PL/SQL语句基础------------------------
--merge into的用法,通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
--连接条件匹配上的进行UPDATE,无法匹配的执行INSERT,效率要高于INSERT+UPDATE
merge into fzq1 aa --fzq1表是需要更新的表
  using fzq bb -- 关联表
  on (aa.id=bb.id) --关联条件
  when matched then --匹配关联条件,作更新处理
  update set
  aa.chengji=bb.chengji+1,
  aa.name=bb.name --此处只是说明可以同时更新多个字段。
  when not matched then --不匹配关联条件,作插入处理。如果只是作更新,下面的语句可以省略。
  insert values( bb.id, bb.name, bb.sex,bb.kecheng,bb.chengji); --pl/sql语句块
declare
ecount tb_food.count%Type; --定义表中的字段类型
eno number;
eresult number;
food tb_food%rowtype; --定义表类型,只能存储一条记录
begin
eno:=&no; --要用户输入信息
select count into ecount from tb_food where foodID='F001';
select * into food from tb_food where foodID='F001';
eresult:=ecount/eno;
dbms_output.put_line(ecount||'/'||eno||'='||eresult);
dbms_output.put_line(food.FoodID);
exception --捕捉异常
when zero_divide then
dbms_output.put_line('error');
end;
/ --执行语句 --loop循环
declare
cou number;
begin
cou:=1;
loop
dbms_output.put_line('cou='||cou);
exit when cou>10;
cou:=cou+1;
end loop;
end;
/ --while循环
declare
cou number;
begin
cou:=1;
while(cou<10)
loop
dbms_output.put_line('cou='cou);
cou:=cou+1;
end loop;
end;
/ --for循环
declare
cou number;
begin
for cou in 1..10 loop
dbms_output.put_line('cou='||cou);
end loop;
end;
/ --if...else语句
declare
cou number;
begin
cou:=1;
if cou>10 then
dbms_output.put_line('cou='||cou);
else
dmbs_ouput.put_line(条件不满足);
end if;
end;
/ --goto语句
declare
eID tb_food.FoodID%Type;
ecount tb_food.Count%Type;
begin
eID:=%ne;
select count into ecount from tb_food where FoodID=eID;
if ecout>5 then
goto po1;
else
goto po2;
end if;
<<po1>>dbms_output.put_line('数量大于5');
<<po2>>dbms_output.put_line('数量小于等于5');
end;
/

注意:PL/SQL中的赋值是使用":="代替的,而字符串连接则使用"||"代替。

创建函数的方法:

 create or replace function myfun(fid tb_food.foodID%type)
return number
as
Fname narchar2;
select FoodName into Fname from tb_food where FoodId=fid;
return Fname;
end;
/
--调用函数
select myfun('F001') from dual;

创建存储过程的方法:

 create or replace procedure myproc
(fid in out tb_food.foodId%type) --带值进带值出
as
cou number;
v_id char;
begin
select count(*) into cou from tb_food where foodId=fid;
if cou=0 then --不存在ID
insert into tb_food values(fid,'名称');
else --已存在,不能插入
fid:=-1;
end if;
end;
/ --执行存储过程
declare
fid tb_food.foodid%type;
begin
fid:='F001';
myproc(fid);
dbms_output.put_line(fid);
end;
/ --删除存储过程
drop procedure myproc;

注意:存储过程返回数据集不像SQL Server的一样直接select就可以了,需要使用游标来存储数据集,具体使用方法如下:

 --带结果集的存储过程
--创建包
create or replace package pak_test
is type refcursor is ref cursor;
procedure pro_test(cur out refcursor);
end;
/
--创建包体
create or replace package body pak_test is
procedure pro_test
(cur out refcursor)
is
begin
open cur for
select * from tb_food;
return;
end;
end;
/ --执行存储过程
declare
v_cur pak_test.refcursor;
v_food tb_food%rowtype;
begin
pak_test.pro_test(v_cur);
FETCH v_cur INTO v_food;
WHILE v_cur%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(v_food.FoodID);
FETCH v_cur INTO v_food;
END LOOP;
end;
/

创建触发器的方法:

 --------触发器------------
--触发器不能从触发器所对应的基本中读取数据,否则执行时会出错
--Before语句触发器
create or replace trigger tr_src_emp
before insert or update or delete on emp
begin
if to_char(sysdate,'DY','nls_date_language=AMERICAN') in('SAT','SUN') then
raise_application_error(-20001,'工作人员不能在周末改变雇员信息');
end if;
end;
/ --Bofre行触发器,没作用一行就触发一次触发器
create or replace trigger tr_emp_sal
before update of sal on emp
for each row
begin
if:new.sal<:old.sal then
raise_application_error(-20010,'员工工资不能低于原有工资');
end if;
end;
/ --限制行触发器
create or replace trigger tr_sal_sal
after update of sal on emp
for each row
when (old.job='salesman')
declare
v_temp int;
begin
select count(*) into v_temp from emp where name=:old.name;
if v_temp=0 then
insert into emp values(:old.name,:old.sal,:new.sal);
else
update emp set oldsal=:old.sal,newsal=:new.sal where name=:old.name;
end if;
end;
/

动态执行SQL语句的方法:

 ----------动态执行SQL语句------------
declare
sql_stmt varchar2(200); --动态SQL语句
kind_name nvarchar2(50):='测试';
kind_id tb_foodKind.Kindid%type:='';
cur_foodkind tb_foodKind%rowtype;
begin
--无子句的execute immediate
execute immediate 'create table t_test(id number)';
--using子句的execute immediate
sql_stmt:='insert into tb_foodKind(kindid,KindName) values(:1,:2)';
execute immediate sql_stmt using kind_id,kind_name;
--into子句的execute immediate
--sql_stmt:='select * from tb_foodkind where kindID=:1';
execute immediate sql_stmt into cur_foodkind using kind_id;
dbms_output.put_line(cur_foodkind.kindid);
--returning into子句的execute immediate
--returning 可以把操作影响行中的数据返回
sql_stmt:='update tb_foodkind set kindname=''西瓜'' where kindid=:1 returning kindname into :2';
execute immediate sql_stmt using kind_id returning into kind_name;
dbms_output.put_line(kind_name);
end;
/

  最后,讲一下在C#中操作Oracle数据库,我使用的是Odbc连接数据库的,连接字符串是"DSN=testdb;uid=dbtest;pwd=dbtest",DSN就是之前添加的ODBC驱动名称,其他的也就跟Sql的差不多了,还需要注意的是使用OdbcParameter参数的SQL语句中,参数的要用"?"作为替代符,例如"select * from tb_foodKind where KindID=?",而且如果想使用ODBC来调用存储过程,存储过程中如果存在参数,则需要使用cmd.CommandText = "{call pro_AddPackageDetail(?,?,?,?,?)}"这样的格式才能执行,如果没有参数则可以直接使用存储过程名称。

  好了,暂时就先记录到这里了,如果以后有继续学到更多的知识再来补充。

初次使用Oracle的更多相关文章

  1. PLSQL初次登录oracle报错处理

    server1上面装了oracle client ,也装了plsql,但是登录了以后,不显示database 和connect as 手工输入正确的用户名和database后报错如下 于是就取消登录 ...

  2. plsql初次连接oracle报错解决方案

    windows7 64bit Oracle win64 11gR2(两个文件) PL/SQL v9.0 详细错误信息 Initialization error Could not initialize ...

  3. Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持

    一.Oracle XE 数据库与连接工具安装使用 Oracle数据库历来以价格昂贵出名,当然贵有贵的道理,成为一个Oracle DBA也是令人羡慕的事情,如果程序员熟悉Oracle使用也有机会接触到大 ...

  4. Oracle常用知识小结

    前言: 前一段时间项目开发数据库环境为Oracle,作为一个SQLer,表示各种不适应.所以刚开始的时候走了一些弯路,浪费了一席时间.因此就想把这些常用的东西给总结一下,算是对自己学习的总结,也希望能 ...

  5. 电脑IP改变后oracle em无法登陆的解决办法(亲测)

    以下方法为本人亲测 情况:假设电脑初次安装oracle时的ip是192.168.133.110 那么进入em的地址就是http://192.168.133.110:1158/em/console/lo ...

  6. 初级Oracle和SQL学习者的学习笔记。韩顺平-玩转oracle。

    我自己就是一个oracle和sql的初学者,前段时间看了韩顺平老师的oracle视频教程,觉得很深入浅出,收获了很多.同时自己也做了不少笔记,现在想将纸质笔记以自己的话总结出来.俗话说得好:教学总是相 ...

  7. Oracle 免费的数据库

    Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持 一.Oracle XE 数据库与连接工具安装使用 O ...

  8. 使用PLSQL Developer连接Oracle Database 11g Express Edition

    要使用oracle数据库,需要准备三部分: 1.oracle服务端 2.oracle客户端 3.连接工具 你装的Oracle Database 11g Express Edition就是服务端,pls ...

  9. .Net程序员学用Oracle系列(12):增删改查

    1.插入语句 1.1.INSERT 1.2.INSERT ALL 2.删除语句 2.1.DELETE 2.2.TRUNCATE 3.更新语句 3.1.UPDATE 3.2.带子查询的 UPDATE 3 ...

随机推荐

  1. 多线程 AfxBeginThread 与 CreateThread 的区别

      简言之:  AfxBeginThread是MFC的全局函数,是对CreateThread的封装. CreateThread是Win32 API函数,前者最终要调到后者. 1>.具体说来,Cr ...

  2. EffectiveC#1--尽可能的使用属性(property),而不是数据成员(field)

    1.属性可以进行数据绑定 2.可以做数据安全校验.在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决 如下代码不可取 public string Name { get { if(thi ...

  3. ora-24247:网络访问被访问控制列表(ACL)拒绝

    用dba账户使用下面脚本授予报错账户访问外部网络服务的权限,以SCOTT为例: BEGIN -- Only uncomment the following line if ACL "netw ...

  4. AngularJS Directive - 开场小介绍(转)

    Directive其实就是让html变得更强大的一种方法.它可以根据需求对dom变形,或注入行为. 觉得它很神秘么,其实一点儿也不神秘,只要开始使用AngularJS了,就一定在使用着Directiv ...

  5. JS如何判断IE和火狐与Chrome浏览器

    var isIE=navigator.userAgent.toUpperCase().indexOf("MSIE")?true:false; 类似的可以写var isFirefox ...

  6. ios变量的property属性设置和意义

    IOS 的@property和@synthesize帮我们轻易的生成对象的getter和setter方法来完成对对象的赋值和访问.但是如果我们如果要动态设置对象的getter和setter方法可以使用 ...

  7. uva 1597 Searching the Web

    The word "search engine" may not be strange to you. Generally speaking, a search engine se ...

  8. activiti笔记二:用户任务

    1, assignee 代替humanPerformer  功能 2, cadidateUsers代替potentialOwner功能 3, candidateGroups代替potentialOwn ...

  9. 【00】why集搜客网络爬虫?

    与各种大企业相比,大数据对于没有数据资源的个体而言是奢侈品. 然而在“互联网思维”.“互联网+”引领下,我们应当勇于实践和颠覆传统,将数据平民化. 不管你是财经.金融.经管.社科专业的技术小白,正在做 ...

  10. R语言数据合并使用merge数据追加使用rbind和cbind

    R语言中的横向数据合并merge及纵向数据合并rbind的使用 我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同.处理的办法就是使用merge(x, y ,by.x = ,by.y ...