MyException - 我的异常网
当前位置:我的异常网» SQL » 速成札记:Procedural Language SQL

速成札记:Procedural Language SQL

www.MyException.Cn  网友分享于:2015-08-26  浏览:3次
速成笔记:Procedural Language SQL

Procedural Language SQL

1.范例:最简单的语句块

set serveroutput on;   //可以在服务器端输出结果

begin

dbms_output.put_line(“hello world!”);  //相当于system.out.println 不能输出boolean值

end;

/

2.范例:简单的PL/SQL语句块

declare //声明变量: 变量名 变量类型

v_name varchar2(20);

begin

v_name := ‘myname’;

dbms_output.put_line(v_name);

end;

3.范例:语句块的组成

declare

v_num number := 0;

begin

v_num = 2/v_num;

dbms_output.put_line(v_num);

exception

when others then

dbms_output.put_line(‘error’);

end;

4.变量声明的规则

变量名不能够使用保留字,必须字母开头,最多30个字符,不能与数据库表或列同名,每一行只能声明一个变量

5.常用的变量类型

binary——integer:整数,主要用来计数而不是用来表示字段类型

number:数字类型

char:定长字符串

varchar2:变长字符串

date:日期

long:长字符串,最长2GB

boolean:布尔类型 可取值true false null

使用%type属性:可以保证相关变量或字段的类型发生变化时用%type声明的变量类型同步更新

v_empno emp.empno%type; //用表中某个字段类型来定义变量

                v_empno2 v_empno%type; //或 用某个变量的类型来声明变量

两种复合类型:

table  变量类型:相当于数组

//定义一种新的变量类型:类型名约定俗成                   数组下标的类型(可为负)

type type_table_emp_empno is table of emp.empno%type index by binary_integer 

v_empnos type_table_emp_empno;//再用类型声明变量

v_empnos(0) := 0;//对数组元素赋值

record变量类型:相当于类

type type_record_dept is record{

deptno dept.deptno%type,

dname dept.dname%type,

loc dept.loc%type

};

v_temp type_record_dept;

v_temp.dname := ‘deptname’;

在record中使用%rowtype声明相应字段(可以同步更新)

v_temp dept%rowtype;

6.在PL/SQL中:DML语句

①-- 可以注释掉一行

②select语句必须返回有且只有一条结果eg:

select ename,sal into v_ename,v_sal from emp where empno =7369; //into指向保存返回值的变量

③insert delete update直接用(区别在于使用变量而不是字段)commit;提交

④sql%rowcount //sql表示刚刚执行的sql语句,其属性rowcount表示影响多少条记录

select语句为1条记录被影响:表示最后产生一个值

⑤count(*)

7.在PL/SQL中:DDL语句 //单引号内部用两个单引号表示一个单引号

excute immediate ‘create table T (name varchar2(20) default ‘’aaa’’)’;

8.在PL/SQL中的分支、循环

①分支

②循环:相当于do-while

if(条件1) then

    语句;

elsif(条件2)then  //注意elsif

    语句;

else                //注意else后没有then

    语句;

end if;            //注意end if后边有分号

declare

    i binary_integer :=1 ;

begin

loop

   语句;

i := i + 1 ;

exit when(条件);

end loop;

end;

②循环:相当于for

②循环:相当于while

for k in 1...10 loop

语句

end loop;

for k in reverse 1...10 loop

语句

end loop;

declare

    i binary_integer :=1 ;

begin

while 条件 loop

   语句;

i := i + 1 ;

end loop;

end;

9.错误处理:too_many_rows太多记录了 no_data_found没数据 others其他

exception

 when 异常名字 then

异常处理语句

10.创建记录错误信息的表

create table errorlog(

id number primary key,

errcode number,

errmsg varchar2(1024),

errdate date

);

create sequence seq_errorlog_id start with 1 increment by 1;

在PL/SQL语句块中:

declare

v_errcode errorlog.errcode%type;

v_errmsg errorlog.errmsg%type;

begin

语句;

commit;

exception

when others then

  rollback;

  v_errlog := SQLCODE;

  v_errmsg :=SQLERRM;

insert into errorlog values(seq_errorlog_id.nextval,v_errlog,v_errmsg,sysdate);

commit;

end

11.游标的遍历:取出每条记录并处理

declare

cursor c is    select * from emp;

v_emp c%rowtype;

begin

open c;

loop

fetch c into v_emp;

exit when (c%notfound);

语句用v_emp.ename等等取出某字段值;

end loop;

close c;

end;

declare

cursor c is    select * from emp;

begin

 //for自动声明v_emp同时自动open/fetch/close

for v_emp in c loop

语句用v_emp.ename等等取出某字段值;

end loop;

end;

12.带参数的游标:

declare

   cursor c(v_deptno emp.deptno%type , v_job emp.job%type) is

      select ename ,sal from emp where deptno=v_deptno and job=v_job;

begin

 for v_temp in c(30,’CLERK’) loop

    语句;

end loop;     end;

13.可更新的游标 在声明 cursor的最后 加上for update;

update/delete.... where current of c;

14.存储过程:相当于替换declare 其他不变

①创建存储过程

create or replace procedure p is

.... ...

②调用存储过程

exec p; 或 begin   p;   end;

③带参数的存储过程

create or replace procedure p 

(v_a in number,v_b in number ,v_ret out number,v_temp in out number) 

is   //传入参数 传出参数(返回值) 既传入又传出

.... ...

④调用带参数的存储过程:declare与形参对应的实参变量 在begin-end中调用p(实参列表)

⑤当存储过程内部发生错误时:创建的过程带有编译错误 但不具体指出哪里错了

使用show error显示具体错误信息

15. 触发器:

create or replace trigger trig

after insert or delete or update on emp for each row  //另一种为before

begin

   if inserting then     语句1;

   elsif updating then  语句2;

   elsif deleting then   语句3;

end if;

end

16. 函数

create or replace function sal_tax  //函数名

(v_sal number)               //函数参数

return number               //函数返回值

is      begin-end语句块

17.实现update dept set depno=90 where deptno =10 ; //违反完整约束条件

创建触发器 //很少使用:先触发器,再检查约束条件

create or replace trigger trig

   afer update on dept for each row

begin                     //:NEW代表update的新状态 :OLD表示update的旧状态

    update emp set deptno =:NEW.deptno where deptno =:OLD.deptno;

end

18.树状结构的存储与展示

create table article(

id number primary key,

cont varchar2(4000),

pid number,        //回复的父节点id

isleaf number(1),    //0代表非叶子节点 1代表叶子节点(没有其他回复了)

alevel number);

insert into article values (1,’楼主1楼帖子’,0,0,0)

insert into article values (2,’回复1楼帖子’,1,0,1)

insert into article values (3,’回复2楼帖子’,2,1,2)

insert into article values (4,’回复2楼帖子’,2,0,2)

insert into article values (5,’回复4楼帖子’,4,1,3)

insert into article values (6,’回复1楼帖子’,1,0,1)

insert into article values (7,’回复6楼帖子’,6,1,2)

insert into article values (8,’回复6楼帖子’,6,1,2)

insert into article values (9,’回复2楼帖子’,2,0,2)

insert into article values (10, 回复9楼帖子’,9,1,3)

对应的展示树状结构的存储过程:

create or replace procedure p (v_pid article.pid%type) is

  cursor c is select * from article where pid=v_pid;

begin

   for v_article in c loop

     dbms_output.put_line(v_article.cont);

     if(v_article.isleaf = 0) then

p(v_article.id);

     end if;

end loop;

end;

19.PL/SQL缺点:数据库平台移植性差 只针对oracle

文章评论

科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
旅行,写作,编程
旅行,写作,编程
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员都该阅读的书
程序员都该阅读的书
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
一个程序员的时间管理
一个程序员的时间管理
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员的鄙视链
程序员的鄙视链
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
鲜为人知的编程真相
鲜为人知的编程真相
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
代码女神横空出世
代码女神横空出世
我是如何打败拖延症的
我是如何打败拖延症的
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员必看的十大电影
程序员必看的十大电影
程序员应该关注的一些事儿
程序员应该关注的一些事儿
漫画:程序员的工作
漫画:程序员的工作
 程序员的样子
程序员的样子
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
如何成为一名黑客
如何成为一名黑客
Java程序员必看电影
Java程序员必看电影
那些争议最大的编程观点
那些争议最大的编程观点
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
老程序员的下场
老程序员的下场
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
10个调试和排错的小建议
10个调试和排错的小建议
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
总结2014中国互联网十大段子
总结2014中国互联网十大段子
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
编程语言是女人
编程语言是女人
我的丈夫是个程序员
我的丈夫是个程序员
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
程序员和编码员之间的区别
程序员和编码员之间的区别
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有