PLSQL语法介绍(有例子带注释)

PLSQL语法介绍(有例子带注释)
PLSQL语法介绍(有例子带注释)

PLSQL语法介绍(有例子带注释)

关键字: oracle/plsql/游标/存储过程/触发器

--最简单的语句块

set serveroutput on; //用于输出显示

begin

dbms_output.put_line('HeloWorld');

end;

--一个简单的PL/SQL语句块

declare //声明变量,必须 v_ 开头

v_name varchar2(20);

begin

v_name := 'myname'; //变量的赋值格式

dbms_output.put_line(v_name);

end;

--语句块的组成

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;

--变量声明的规则

1): 变量名不能够使用保留字,如from、select等

2): 第一个字符必须是字母

3): 变量名最多包含30个字符

4): 不要与数据库的表或者列同名

5): 每一行只能声明一个变量

--常用变量类型

1): binary_integer: 整数,主要用来计数而不是用来表示字段类型

2): number: 数字类型

3): char: 定长字符串

4): varchar2: 变长字符串

5): date: 日期

6): long: 长字符串,最长2GB

7): boolean: 布尔类型,可以取值为 true、false和null

--变量声明,可以使用 %type 属性

declare

v_empno number(4);

v_empno2 emp.empno%type;//表示该变量的类型和emp表中的empno字

段保持一致。

v_empno3 v_empno2%type;

begin

dbms_output.put_line('Test');

--Table变量类型 //类似于java中的数组

declare

type type_table_emp_empno is table of emp.empno%type index by binary_integer; //声明一个类型

v_empnos type_table_emp_empno;

begin

v_empnos(0) := 100;

v_empnos(2) := 200;

v_empnos(-1):= 300;

dbms_output.put_line(v_empnos(-1));

end;

--Record变量类型 //类似于java中的类,可以表示一整条记录

declare

type type_record_dept is record

(

deptno dept.deptno%type,

dname dept.dname%type,

loc dept.loc%type

);

v_temp type_record_dept;

begin

v_temp.deptno := 50;

v_temp.dname := 'aaa';

v_temp.loc := 'bj';

dbms_output.put_line(v_temp.deptno || '' || v_temp.dname); end;

不过当表增加了一个字段之后它就不管用了,可以选用下面的这种: %rowtype --使用%rowtype声明Record类型变量

declare

v_temp dept%rowtype;

begin

v_temp.deptno := 50;

v_temp.dname := 'aaa';

v_temp.loc := 'bj';

dbms_output.put_line(v_temp.deptno || '' || v_temp.dname);

--SQL语句的运用

1:

declare

v_ename emp.ename%type;

v_sal emp.sal%type;

begin

select ename,sal into v_ename,v_sal from emp where empno = 7369;//必须返回记录,并且只能返回一条

dbms_output.put_line(v_ename || '' || v_sal);

end;

2:

declare

v_emp emp%rowtype;

begin

select * into v_emp from emp where empno = 7396;

dbms_output.put_line(v_emp.ename);

end;

3:

declare

v_deptno dept.deptno%type := 50;

v_dname dept.dname%type := 'aaa';

v_loc dept.loc%type := 'bj';

begin

insert into dept2 values (v_deptno,v_dname,v_loc); //insert、delete、update和sql是一样的,只是可以用变量

commit;

end;

4:

declare

v_deptno emp2.deptno%type := 10;

v_count number;

begin

update emp2 set sal = sal/2 where deptno = v_deptno;

dbms_output.put_line(sql%rowcount || '条记录被影响');

commit;

end;

sql%rowcount 表示:刚执行的最后一句sql影响到了多少条记录

--执行DDL语句

begin

execute immediate 'create table T (nnn varchar2(20) default ''aaa'')';

end;

--if语句

--取出7369的薪水,如果<1200,则输出'low',如果<2000则输出'middle',否

则'high'

declare

v_sal emp.sal%type;

begin

select sal into v_sal from emp where empno = '7369'; if(v_sal < 1200) then

dbms_output.put_line('low');

elsif(v_sal < 2000) then

dbms_output.put_line('middle');

else

dbms_output.put_line('high');

end if;

end;

--循环

(1):相当于 do .. while 循环

declare

i binary_integer := 1;

begin

loop

dbms_output.put_line(i);

i := i + 1;

exit when (i >= 11); //循环结束的条件

end loop;

end;

(2):while循环

declare

j binary_integer := 1;

begin

while j < 11 loop

dbms_output.put_line(j);

j := j + 1;

end loop;

end;

(3):for循环

begin

for k in 1..10 loop

dbms_output.put_line(k);

end loop;

for k in reverse 1..10 loop //表示 k 的值从 10 到 1 dbms_output.put_line(k);

end loop;

end;

--错误处理 (too_many_rows、no_data_found 等等)

declare

v_temp number(4);

begin

select empno into v_temp from emp where empno = 10; exception

when too_many_rows then

dbms_output.put_line('太多记录了');

when no_data_found then

dbms_output.put_line('没数据');

when others then

dbms_output.put_line('error');

end;

--将错误信息存储到一张日志表中

(1):

create table errorlog

(

id number primary key,

errcode number,

errmsg varchar2(1024),

errdate date

);

(2):

create sequence seq_errorlog_id start with 1 increment by 1;

(3):

declare

v_deptno dept.deptno%type := 10;

v_errcode number;

v_errmsg varchar2(1024);

begin

delete from dept where deptno = v_deptno;

commit;

exception

when others then

rollback;

v_errcode := SQLCODE; //是关键字,错误代码

v_errmsg := SQLERRM; //是关键字,错误信息

insert into errorlog

values(seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate); commit;

end;

--游标

1:用游标取一条记录

cursor c is //声明一个游标,这时候不会真正执行后面的查询语句,要等到打开游标的时候才执行

select * from emp;

v_emp c%rowtype;

begin

open c;

fetch c into v_emp;

dbms_output.put_line(v_emp.ename);

close c;

end;

2:结合循环取出多条记录

(1):do..while循环

declare

cursor c is

select * from emp;

v_emp c%rowtype;

begin

open c;

loop

fetch c into v_emp;

exit when (c%notfound); //当最近一次 fetch 没有返回记录

dbms_output.put_line(v_emp.ename);

end loop;

close c;

end;

(2):while循环

declare

cursor c is

select * from emp;

v_emp emp%rowtype;

begin

open c;

fetch c into v_emp;

while (c%found) loop

dbms_output.put_line(v_emp.ename);

fetch c into v_emp;

end loop;

close c;

end;

(3):for循环

declare

cursor c is

select * from emp;

for v_emp in c loop //for循环会自动打开和关闭游标,还会自动fetch..into

dbms_output.put_line(v_emp.ename);

end loop;

end;

--带参数的游标

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

dbms_output.put_line(v_temp.ename);

end loop;

end;

--可更新的游标

declare

cursor c

is

select * from emp2 for update;

begin

for v_temp in c loop

if(v_temp.sal < 2000) then

update emp2 set sal = sal * 2 where current of c;

elsif(v_temp.sal = 5000) then

delete from emp2 where current of c;

end if;

end loop;

commit;

end;

--存储过程

存储过程:带有名字的PL/SQL的程序块,没有返回值

create or replace procedure p

is //用它代替了 declare

cursor c is

select * from emp2 for update;

begin

for v_emp in c loop

if(v_emp.deptno = 10) then

update emp2 set sal = sal + 10 where current of c; elsif(v_emp.deptno = 20) then

update emp2 set sal = sal + 20 where current of c;

else

update emp2 set sal = sal + 50 where current of c; end if;

end loop;

commit;

end;

上面的程序只是定义了一个存储过程,并没有真正执行。

执行上述存储过程:

begin

p;

end;

或:exec p;

--带有参数的存储过程

//in 和没有都表示输入参数;out 表示输出参数;in out 表示既是输入又是输出参数

create or replace procedure p

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

begin

if(v_a > v_b) then

v_ret := v_a;

else

v_ret := v_b;

end if;

v_temp := v_temp + 1;

end;

//调用存储过程

declare

v_a number := 3;

v_b number := 4;

v_ret number;

v_temp number := 5;

begin

p(v_a,v_b,v_ret,v_temp);

dbms_output.put_line(v_ret);

dbms_output.put_line(v_temp);

end;

查看编译错误信息:show error

--函数

create or replace function sal_tax

(v_sal number)

return number

is

begin

if(v_sal < 2000) then

return 0.10;

elsif(v_sal < 2750) then

return 0.15;

else

return 0.20;

end if;

end;

select sal_tax(sal) from emp;

--触发器

不能直接执行,必须依附在某张表上

create table emp2_log

(

uname varchar2(20),

action varchar2(10),

atime date

);

create or replace trigger trig

after insert or delete or update on emp2 for each row

//for each row 的作用:每条记录发生 insert,delete,update的时候都会执行触发器,

如果没有for each row,那么只会触发一次。

begin

if inserting then

insert into emp2_log values (USER,'insert',sysdate);

elsif updating then

insert into emp2_log values (USER,'update',sysdate);

elsif deletion then

insert into emp2_log values (USER,'delete',sysdate);

end if;

end;

update emp2 set sal = sal*2 where daptno = 30;

select * from emp2_log;

drop trigger trig;

--触发器的一个应用例子

(不能只更新dept表中的deptno,因为emp中有引用deptno)

create or replace trigger trig

after update on dept for each row

begin

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

经典plsql例子

setserveroutput on; --计算两个整数的和与这两个整数的差的商 declare aint:=100; bint:=200; c number; begin c:=(a+b)/(a-a); dbms_output.put_line(c); exception whenzero_divide then dbms_output.put_line('除数不能为零!'); end; / declare Num_sal number; --声明一个数值变量 Var_ename varchar2(20); --声明一个字符串变量 begin select ename,sal into Var_ename,Num_sal from scott.emp where empno=7369; --检索指定的值并保存在变量中 dbms_output.put_line(Var_ename||'的工资是'||Num_sal); --输出变量的值end; / --简单的插入一条语句 create or replace procedure pro1 is begin insert into scott.emp(empno,ename)values(1111,'1111'); end; / exec pro1; select * from scott.emp; --删除一条语句(传参) create procedure pro2(in_empno number) is begin delete from emp where empno=in_empno; end; /

--简单的插入一条语句(传参) create or replace procedure pro3(in_empnonumber,in_ename varchar2) is begin insert into scott.emp(empno,ename)values(in_empno,in_ename); end; / declare --定义变量的格式是变量名称变量的类型 v_enamevarchar2(8); begin select ename into v_ename from emp where empno=&empno; --将查询到的值存入v_ename变量中 --输出v_ename dbms_output.put_line('雇员名是'||v_ename); end; / --将上面的块改成过程 create procedure pro4(v_in_empno number) is v_enamevarchar2(8); begin selectename into v_ename from emp where empno=v_in_empno; dbms_output.put_line('雇员名是'||v_ename); end; / --编写一个过程,实现输入雇员名,新工资可以修改雇员的工资 create procedure pro5(in_ename in varchar2,in_newsal in number) is

plsql安装和配置连接教程(附一些常用设置)

plsql安装和配置连接教程 总体步骤:先安装oracle client端,然后安装plsql,配置tnsname.ora 一:安装oracle client端 下载地址: 1.加压文件,安装oracle客户端 打开安装包,找到setup.exe,开始安装。报错,具体原因和解决办法和安装oracle服务端方法一样。只是要多修改一个文件,在两个文件里添加同样的内容即可。 解决办法很简单,这是因为版本注册问题,默认oracle 11没有添加win10的注册信息,所以要讲win10的注册信息添加到oracle的配置文件里。打开oracle安装包,找到stage文件夹,找到cvu_prereq.xml文件,用记事本打开可以看到如下内容,在标签最后添加如下红色部分。

上面报错信息修改完成以后,重新setup.ext,下面界面选择“管理员”模式 安装以后在network\ADMIN文件夹中配置tnsnames.ora文件,如图:

如果client文件夹中没有network文件夹,说明安装client时安装类型没选对,这时也可以从instantclient包中,把network文件夹拷入client的目录下。 此时,基础环境已经配置完毕。 二:安装plsqldevlop 安装完毕后,不要输入账号密码先进入工具 点tools—preferences—输入client端的目录地址和oci.dll文件的地址 三:配置系统环境 右击我的电脑—属性—高级系统设置—环境变量 编辑Path,添加client端地址

PLSQL+Developer工具的使用(非常详细)

PLSQL Developer工具的使用 PLSQL Developer的安装十分简单,先安装PL.SQL.Developer.exe文件,然后安装chinese.exe文件进行汉化。安装成功后在桌面点击PLSQL Developer的快捷方式进入登录页面(如图1)。 图1 输入用户名和口令,选择好要连接的数据库,点击“确定”登录成功(如图2)。 图2 在成功登录后会进入到PLSQL Developer的操作界面(如图3)。

图3 用户可以在左边下拉菜单中选择“我的对象”,然后点击“Table”可以显示出项目所涉 及的数据库中所有表(如图4)。 新建表,点击Table文件夹,然后点击鼠标右键在列表中选择“新建”选项进入到创建

新表的页面(如图5),用户可以根据自己的需要来创建新表,但一定要遵循Oracle规范 信息填写完毕后点击“应用”按钮创建成功。 图5 修改表结构,可以选中要该表后点击鼠标右键在列表中选择“编辑”选项进入到修改表结构的页面(如图6),这里显示的都是该表的结构信息,如要进行修改操作请根据实际情况慎重修改,修改后点击“应用”按钮提交修改内容。 图6 修改表名,可以选中要该表后点击鼠标右键在列表中选择“重新命名”选项进入到重新

命名的页面(如图7),这里需要注意的是表名起的一定要有意义。 图7 查询表结构,可以选中要该表后点击鼠标右键在列表中选择“查看”选项进入到查看表结构的页面(如图8)。 图8 删除表,可以选中要该表后点击鼠标右键在列表中选择“删掉表”选项就可以删除已创

建的表了。 查询表中存储的数据,可以选中要该表后点击鼠标右键在列表中选择“查询数据”选项进入到查询结果页面(如图9),这里显示了所有已录入的数据。 图9 编辑数据,可以选中要该表后点击鼠标右键在列表中选择“编辑数据”选项进入到查询结果页面(如图10),这里显示了所有已录入的数据,用户可以对想要编辑的数据进行操作。 图10 修改数据,用户可以在页面中直接对想要修改的数据进行操作,修改后点击页面中的

plsql常用语句

说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select * into b from a where 1<>1 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL: insert into b(a, b, c) select d,e,f from b; 说明:显示文章、提交人和最后回复时间 SQL: select a.title,https://www.360docs.net/doc/118568436.html,ername,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 说明:外连接查询(表名1:a 表名2:b) SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 说明:日程安排提前五分钟提醒 SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 说明:两张关联表,删除主表中已经在副表中没有的信息 SQL: delete from info where not exists ( select * from infobz where info.infid=infobz.infid ) 说明:-- SQL: SELECT A.NUM, https://www.360docs.net/doc/118568436.html,, B.UPD_DATE, B.PREV_UPD_DATE FROM TABLE1, (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, (SELECT NUM, UPD_DATE, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') ¦¦ '/01','YYYY/MM/DD') - 1, 'YYYY/MM') ) Y, WHERE X.NUM = Y.NUM (+) AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND ) B WHERE A.NUM = B.NUM 说明:-- SQL: select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩 说明:从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源) SQL: SELECT https://www.360docs.net/doc/118568436.html,erper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear, 说明:四表联查问题: SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... 说明:得到表中最小的未使用的ID号 SQL:

PLSQL应用程序开发

Oracle PL/SQL ProGramming 学习笔记 Author:丁俊 目录 序言-特点介绍 (2) PART1 用PL/SQL设计程序 (4) 第一章plsql在10g中的新特性 (4) 第二章建立和运行plsql程序 (6) 第三章plsql语言基本原理 (9) PART2 PL/SQL应用程序结构 (12) 第四章条件和序列控制 (12) 第五章循环控制 (19) 第六章异常处理 (23) PART3 PL/SQL程序应用 (25) 第七章用数据来工作 (25) 第八章Strings (27) 第九章Numbers (31) 第十章Records (36) 第十一章集合类型 (38)

序言-特点介绍 1-1 pl/sql可以做的工作: 1.用pl/sql的存储过程和数据库触发器实现至关重要的商业规则。 2.在数据库中生成和完全地管理xml文档。 3.web页面与数据库的结合。 4.实现自动化的数据库管理,用pl/sql建立安全级别来管理回滚段。 1-2 pl/sql特点: 从oracle 6开始,模仿Ada语言的实现,Ada语言强调数据抽象,信息隐藏,还有其他现代语言设计中的关键策略。pl/sql做为3GL语言具有面向过程语言的许多重要特性,如: 1.丰富的数据类型,从number到string,从复杂的record到table,以及集合类型等。 2.显示的可读性强的块状结构,可以增强我们维护plsql程序。 3.条件,循环语句,包括if---else,3个loop循环(简单loop,for...loop,while...loop)。 4.完整地异常处理机制。 5.命名的,可重用的代码,如包,函数,过程,触发器,对象类型等。 6.plsql是sql的有力补充,与sql之间的联系紧密,整合性强。 7.plsql是oracle数据库产品的内置语言,不是一个孤立的语言。 8.是一种高性能的语言。 9.pl/sql运行过程 Plsql引擎可以接受应用程序的程序,然后将sql部分和plsql部分分离出来,分别交给sql 引擎和plsql引擎执行,提高执行效率。 10.plsql可以每次发送成组的sql语句到服务器端执行,不像sql每次只能发送一句,减少网络负载量,提高效率,而且在oracle的相关工具中,如oracle form中,plsql也得到增强。 11.总结一句话:plsql有应用程序的特性,是sql的有力补充,具有流程控制,申明和使用变量,plsql能运行在任何具有oracle的环境中。

PLSQL语法介绍(有例子带注释)

PLSQL语法介绍(有例子带注释) 关键字: oracle/plsql/游标/存储过程/触发器 --最简单的语句块 set serveroutput on; //用于输出显示 begin dbms_output.put_line('HeloWorld'); end; --一个简单的PL/SQL语句块 declare //声明变量,必须 v_ 开头 v_name varchar2(20); begin v_name := 'myname'; //变量的赋值格式 dbms_output.put_line(v_name); end; --语句块的组成 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; --变量声明的规则 1): 变量名不能够使用保留字,如from、select等 2): 第一个字符必须是字母 3): 变量名最多包含30个字符 4): 不要与数据库的表或者列同名 5): 每一行只能声明一个变量 --常用变量类型 1): binary_integer: 整数,主要用来计数而不是用来表示字段类型 2): number: 数字类型 3): char: 定长字符串 4): varchar2: 变长字符串 5): date: 日期 6): long: 长字符串,最长2GB 7): boolean: 布尔类型,可以取值为 true、false和null --变量声明,可以使用 %type 属性 declare v_empno number(4); v_empno2 emp.empno%type;//表示该变量的类型和emp表中的empno字

PLSQL查询语句

一、简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的 表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。SELECT nickname,email FROM testtable WHERE name='张三' (一) 选择列表 选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 量和全局变量)等构成。 1、选择所有列 例如,下面语句显示testtable表中所有列的数据: SELECT * FROM testtable 2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 例如: SELECT nickname,email FROM testtable 3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列 标题: SELECT 昵称=nickname,电子邮件=email FROM testtable 4、删除重复行 SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT 时,说明n是

PLSQL 示例代码

PL/SQL 示例代码 这些PL/SQL 代码示例演示了如何在Oracle 数据库中使用各种PL/SQL 特性。 示例代码— Oracle 数据库10g PL/SQL 示例应用程序— FORALL [2005 年 1 月12 日] Oracle 数据库10g 通过集合中的非连续索引,引入了对FORALL 语法的支持。INDICES OF 子句允许将FORALL 语法用于稀疏集合,而VALUE OF 子句用于指向其他集合的索引集合。该示例显示了如何在PL/SQL 应用程序中使用这些特性。 自述文件下载(ZIP) 正则表达式—用户搜索示例 [2004 年12 月13 日] 本示例演示了如何使用正则表达式API 通过TRIGGER、ROCEDURE、CURSOR 等从数据库中验证、搜索和提取信息。借助用户信息系统的场景,本示例使用各种模式来搜索和提取存储在数据库表中的用户信息(如爱好和兴趣、位置信息等)。 自述文件下载(ZIP) 正则表达式—DNA 示例 [2004 年12 月 1 日] 本示例使用正则表达式API 来分析从SGD 数据库接收到的原始HTTP 流,并且仅提取DNA 序列。该序列存储在本地的表中,并使用正则表达式函数进一步分析它以识别特定的酶切图谱。 自述文件下载(ZIP) 正则表达式—用户验证示例[2004 年9 月28 日] 借助一个典型的用户注册情景,本示例应用程序使用了在Oracle 数据库10g中实现的正则表达式函数来验证用户输入。 自述文件下载(ZIP) 示例代码— Oracle9i数据库版本2 除了依赖于公共模式中的对象(特别是员工表)外,这些示例是完全独立的。这些对象已经安装在预先构建的数据库中。可以通过运行Oracle HOME 目录下的demo/schema 目录中的mksample.sql 在定制的数据库中创建它们。 关联数组(index-by-varchar2 表) 在PL/SQL 程序中使用SQL 的RECORD 绑定 Utl_File:在Oracle9i数据库9.2.0 版中所引入增强功能的概述 示例代码— Oracle9i数据库版本1 除了依赖于公共模式中的对象(特别是员工表)外,这些示例是完全独立的。这些对象已经安装在预先构建的数据库中。可以通过运行Oracle HOME 目录下的demo/schema 目录中的mksample.sql 在定制的数据库中创建它们。 PL/SQL 静态SQL 中的游标重用 在PL/SQL 程序中使用CASE 语句 批量绑定增强 表函数和游标表达式

PLSQL学习简易快速入门

PLSQL学习简易快速入门 课程一 PL/SQL 基本查询与排序 本课重点: 1、写SELECT语句进行数据库查询 2、进行数学运算 3、处理空值 4、使用别名ALIASES 5、连接列 6、在SQL PLUS中编辑缓冲,修改SQL SCRIPTS 7、ORDER BY进行排序输出。 8、使用WHERE 字段。 一、写SQL 命令: 不区分大小写。 SQL 语句用数字分行,在SQL PLUS中被称为缓冲区。 最后以;或 / 结束语句。 也可以用RUN来执行语句 二、例1:SQL> SELECT dept_id, last_name, manager_id FROM s_emp; 2:SQL> SELECT last_name, salary * 12, commission_pct FROM s_emp; 对于数值或日期型的字段,可以进行相应的四则运算,优先级与标准的高级语言相同。 SQL> SELECT last_name, salary, 12 * (salary + 100) FROM s_emp; 三、列的别名ALIASES: 计算的时候特别有用; 紧跟着列名,或在列名与别名之间加“AS”; 如果别名中含有SPACE,特殊字符,或大小写,要用双引号引起。 例(因字体原因,读者请记住:引号为英文双引号Double Quotation): SQL> SELECT last_name, salary, 12 * (salary + 100) ”Annual Salary” FROM s_emp;

四、连接符号:|| 连接不同的列或连接字符串 使结果成为一个有意义的短语: SQL> SELECT first_name || ’’ || last_name || ’, ’|| title ”Employees” FROM s_emp SQL> select divid ||' '|| divname from pub_t_division_test where superid='001' 效果如下图: 五、管理NULL值: SQL> SELECT last_name, title, salary * NVL(commission_pct,0)/100 COMM FROM s_emp; 此函数使NULL转化为有意义的一个值,相当于替换NULL。 select divid,divname,NVL(addr,0) from pub_t_division_test where superid='001' 效果如下图: 六、SQL PLUS的基本内容,请参考 七、ORDER BY 操作: 与其他SQL92标准数据库相似,排序如: SELECT expr FROM table[ORDER BY {column,expr} [ASC|DESC]]; 从Oracle7 release 7.0.16开始,ORDER BY 可以用别名。 另:通过位置判断排序: SQL> SELECT last_name, salary*12 FROM s_emp ORDER BY 2; select * from pub_t_division_test where superid='001'order by3 这样就避免了再写一次很长的表达式。 另:多列排序: SQL> SELECT last name, dept_id, salary FROM s_emp ORDER BY dept_id, salary DESC; SQL>select * from pub_t_division_test where superid='001' order by 1,3 desc

PLSQL使用详细介绍

PL/SQL Developer使用指南 一、安装 PL/SQL Developer不需要执行安装程序,只要从其他机上copy一个来就可以使用。 二、登录 在使用PL/SQL Developer之前,首先需要在本机上配置数据库客户端(在oracle自带工具Net8Assistant中可配置)。配置完成后,在以下窗口中敲入用户名和密码就可进入PL/SQL Developer了。 进入PL/SQL Developer以后,会见到以下窗口: 在这里,可以对数据库中的任何对象(包括函数、存储过程、包、表、触发器等等)进行编辑、修改、运行等。(要视乎该用户的权限而定)。 如果用户要重新登录另一数据库,则可以按下“”重新输入本地数据库标识和用户及密码重新登录。

三、修改对象或编译存储过程 我们以存储过程为例: 双击菜单项“procedures”,按右键即可选择新建存储过程(new)或是修改存储过程(edit)等等。选择完毕后则用oracle的PL/SQL语句对存储过程进行编辑,在编辑完以后 按下可以对它进行编译,如果编译未通过,会在窗口中出现错误提示(如下图所示), 用户可根据提示进行修改和再次编译。 当完全编译通过后,用户可单击存储过程并按右键,选择“test”(执行存储过程),出现以下窗口:

在执行前,首先按“”进行调试,然后按“”执行该存储过程;如果用户在执行过程 中发生错误异常退出了,PL/SQL Developer会在窗口中显示错误,并提示退出。在发生错误后,用户可以选择在存储过程中添加“DBMS_OUTPUT.put_line(字符串)”语句来进行错 误跟踪或是通过一步步执行存储过程(按)来查看执行过程中数据的变化从而进行纠错。 除了存储过程之外,还可以通过PL/SQL Developer对数据库中的其他对象进行修改和授权,情况和以上存储过程的修改大同小异。 四、SQL语句的执行 如果用户要在oracle中执行sql语句,可以点击工具栏上的“new”()中的“SQL window”,这时会弹出一个sql语句的输入窗口,用户就可以在此窗口中敲入sql语句了。并按“F8”或是“”执行,执行后的结果会在下面显示出来,但默认情况下一次只能显 示一页,可以按“”显示下一页;如果用户需要显示全部,则可以按下“”;而按下 “”则可以输入查询条件。如下面两张图所示:

PLSQL触发器详解-2

Oracle触发器详细介绍 Oracle触发器详细介绍一 触发器 是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。 功能: 1、允许/限制对表的修改 2、自动生成派生列,比如自增字段 3、强制数据一致性 4、提供审计和日志记录 5、防止无效的事务处理 6、启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id before insert or update of department_id on employees referencing old as old_value new as new_value for each row when (new_value.department_id<>80 ) begin :new_https://www.360docs.net/doc/118568436.html,mission_pct :=0; end; / 触发器的组成部分: 1、触发器名称 2、触发语句 3、触发器限制 4、触发操作 1、触发器名称 create trigger biufer_employees_department_id 命名习惯: biufer(before insert update for each row) employees 表名 department_id 列名 2、触发语句 比如: 表或视图上的DML语句 DDL语句 数据库关闭或启动,startup shutdown 等等 before insert or update of department_id

on employees referencing old as old_value new as new_value for each row 说明: 1、无论是否规定了department_id ,对employees表进行insert的时候 2、对employees表的department_id列进行update的时候 3、触发器限制 when (new_value.department_id<>80 ) 限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。 其中的new_value是代表更新之后的值。 4、触发操作 是触发器的主体 begin :new_https://www.360docs.net/doc/118568436.html,mission_pct :=0; end; 主体很简单,就是将更新后的commission_pct列置为0 触发: insert into employees(employee_id, last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct ) values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@https://www.360docs.net/doc/118568436.html,’,60,10000,.25); select commission_pct from employees where employee_id=12345; 触发器不会通知用户,便改变了用户的输入值。 触发器类型: 1、语句触发器 2、行触发器 3、INSTEAD OF 触发器 4、系统条件触发器 5、用户事件触发器 注释: before和after:指在事件发生之前或之后激活触发器。 instead of:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。insert、delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。 referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为new和old。table_or_view_name:指要创建触发器的表或视图的名称。 for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器。 when:限制执行触发器的条件,该条件可以包括新旧数据值得检查。 declare---end:是一个标准的PL/SQL块。 Oracle触发器详细介绍二--语句触发器 1、语句触发器

PLSQL怎么执行SQL语句

通过f5查看到的执行计划,其实是pl/sql developer工具内部执行查询 plan_table表然后格式化的结果。 select * from plan_table where statement_id=...。其中 description列描述当前的数据库操作, object owner列表示对象所属用户, object name表示操作的对象, cost列表示当前操作的代价(消耗),这个列基本上就是评价sql语句的优劣,cardinality列表示操作影响的行数, bytes列表示字节数篇二:plsqldeveloper工具使用教程 plsql入门 pl/sql的概述 pl/sql的优势 pl/sql是一种块结构的语言,允许你将业务逻辑封装在一起,这是到目前为止使用pl/sql的最大优势 pl/sql是在服务器上运行,可以与数据库和sql引擎直接进行交互, pl/sql是什么? (procedural language/sql) 是oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用列外处理各种错误,这样使得它的功能变得更加强大。 特性: 减少java程序的复杂性 一.过程,函数,触发器是pl/sql编写的 二.过程、函数、触发器是在oracle中 三. pl/sql是非常强大的数据库过程语言 四.过程,函数可以再java程序中调用 为什么学? a) 提高应用程序的运行性能 b) 模块化的设计思想[分页的过程,订单的过程,转账的过程] c) 减少网络传输量(传统的方法,用sql语句传输!现在就只需要调用存储过程) d) 提高安全性(传统sql 可以看到表名字段等…) 不好: 移植性不好,(你写好的存储过程,函数等当我们要换数据库时,这些东西就没用了)开发工具: 1. sqlplus 开发工具 是oracle公司提供的一个工具,这个因为我们在以前介绍过: 2. pl/sql developer开发工具 pl/sql developer是用于开发pl/sql块的集成开发环境(ide) 它是一个独立的产品,而不是oracle的一个附带品, createprocedure sp_pro1//存储过程名字 is begin ---执行部分 insert into mytest values(‘’,’’); end; / 查看错误信息

PLSQL使用方法

1.1PLSQl远程连接oracle数据库 1.1.1配置tnsnames.ora 路径:X:\XXX\PLSQL Developer 9.0.0.1601\orcl_client\tnsnames.ora tnsnames.ora配置: orcl = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) ) (CONNECT_DATA = (SID = orcl) ) ) 其中HOST为主机IP地址,红色字体处 PORT为oracle开放端口号 SERVICE_NAME为连接数据库名字,蓝色字体处 *此配置参数可以配置多个,也就是可以配置多个连接字符串(全局名称) 1.1.2添加连接环境变量 变量名:TNS_ADMIN 变量值:X:\XXX\PLSQL Developer 9.0.0.1601\orcl_client 1.1.3添加ORACLE的语言环境变量: 变量名:NLS_LANG 变量值:AMERICAN_AMERICA.ZHS16GBK(设置ORACLE的语言) 重新连接,即可正常显示中文。 如果想转换为UTF8字符集,可以赋予"NLS_LANG"为"AMERICAN_AMERICA.UTF8",其他编码同上

1.1.4下载并安装PL.SQL.Developer,配置应用: 配置tools->preferences->connection PLSQL 设置 Oracle Home=X:\XXX\PLSQL Developer 9.0.0.1601\orcl_client OCI library=X:\XXX\PLSQL Developer 9.0.0.1601\orcl_client\oci.dll 1.1.5重启plsql 再次打开plsql则会在database中有oracledata选项输入用户名密码就可以登陆。 1.2导入基础数据 1.2.1输入用户名密码登录plsql

Oracle_10g_plsql实战笔记

1编写一个存储过程,该过程可以向某表中添加记录 1) 创建一个简单的表 create table mytest(name varchar2(30),passwd varchar2(30)); 2)创建过程: create or replace procedure sp_pro1 is bgin 3)执行部分 insert into mytest values('zhangsan','zhangsan'); 4) 结束 end; 5) / 如何查看错误:show error; 如何调用过程: 1)exec 过程名(参数值1,参数值2……)--调用一次就插入一条记录2)call 过程名(参数值1,参数值2……) select * from mytest;--查看结果 2编写一个存储过程,该过程可以删除表记录 create or replace procedure sp_pro2 is bgin --执行部分 delete from mytest where name = 'zhangsan'; end; 5) / java程序结果 public static void main(String[] args) { int a = 1; try { a++; } catch(Exception e) { //异常处理 }

--打开输出选项 set serveroutput on; --关闭输出选项 set serveroutput off; exec sp_pro3(‘SCOTT’,4890); //娱乐测试 如何在java程序中调用一个存储过程? 在java中建立一个project程序 //演示用例:演示java程序调用oracle的存储过程案例 Try { //1 加载驱动 class.forName(“oracle.jdbc.driver.OracleDriver”); //2 连接 //…… //3 创建CallableStatement ableStatement cs = ct.prepareCall(“{call sp_pro3(?,?)}”); //4给?赋值 cs.setString(1,”SMITH”); cs.setInt(2,1005); //5 执行 cs.execute(); //6 关闭 cs.close(); conn.close(); } 。 游标 A cursor is a name for a specific private SQL area in which information for processing the specific statement is kept

plsql使用技巧详解

plsql使用技巧详解 1.记住登陆密码 为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码;设置方法: PL/SQL Developer 7.1.2 ->tools->Preferences->Oracle->Logon History ,“Store history”是默认勾选的,勾上“Store with password”即可,重新登录在输入一次密码则记住了; 2.登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的用户是dba,要展开tables 目录,正常情况都需要Wait几秒钟,而选择My Objects后响应速率则是以毫秒计算的。 设置方法: Tools菜单 --> Brower Filters,会打开Brower Folders的定单窗口,把“My Objects”设为默认即可。 Tools菜单--Brower Folders,中把你经常点的几个目录(比如:Tables Views Seq Functions Procedures)移得靠上一点,并加上颜色区分,这样你的平均寻表时间会大大缩短。 3.类SQL PLUS窗口 File->New ->Command Window 这个类似于oracle的客户端工具sql plus,但用比它好用多了; 4.关键字自动大写 Tools->Preferences->Editor,将Keyword case选择Uppercase。这样在窗口中输入sql语句时,关键字会自动大写,而其它都是小写。这样阅读代码比较容易,且保持良好得编码风格,同理,在 Tools->Preferences->Code Assistant里可以设置数据库对象的大写、小写,首字母大写等。 5.查看执行计划 选中需要分析的SQL语句,然后点击工具栏的Explain plan按钮(即执行计划),或者直接按F5;这个主要用于分析SQL语句执行效率,分析表的结构,便于为sql调优提供直观依据。 6.使用自定义快捷键 PL/SQL Developer也可以像其他IDE那样使用自定义快捷键提高编写代码效率,节省时间。 如我们平时在sql窗口中使用最频繁的 select * from 我们就可以设置一个快捷键来简化select * from的输入。 1)。建立一个文本文件shortcuts.txt,并写入如下内容: s = SELECT * FROM sc = SELECT count(*) FROM 复制代码另存到PL/SQL Developer的安装路径下的~/PlugIns目录下 2)。Tools-->Preferences-->User Interface-->Editor-->AutoReplace,选中Enable复选框,然后浏览文件选中之前创建的shortcuts.txt,点击Apply 3)。重启PL/SQL Developer,在sql窗口中输入s+空格,sc+空格做测试 7.执行单条SQL语句 PL/SQL Developer 7.1.2 -->tools->Preferences-->Window types ,勾上“AutoSelect Statement”。在使用 PL/SQL Developer的SQL Window时,按F8键,PL/SQL Developer默认是执行该窗口的所有SQL语句,需要设置为鼠标所在的那条SQL语句,即执行当前SQL语句。 8.PL/SQL Beautifier(PL/SQL 美化器)

oracle包以及简单操作样例

一、包的概念 PL/SQL为了满足程序模块化的需要,除了块(block)和子程序结构外,还引入了包的构造。 (1)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位,是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装。 (2)包类似于C++和JAVA语言中的类,其中变量相当于类中的成员变量,过程和函数相当于类方法。把相关的模块归类成为包,可使开发人员利用面向对象的方法进行存储过程的开发,从而提高系统性能。 (3)与类相同,包中的程序元素也分为公用元素和私用元素两种,这两种元素的区别是他们允许访问的程序范围不同,即它们的作用域不同。公用元素不仅可以被包中的函数、过程所调用,也可以被包外的PL/SQL 程序访问,而私有元素只能被包内的函数和过程序所访问。 (4)PL/SQL的包具有信息隐蔽性(information hiding),仅在算法和数据结构设计有关层可见。可将过程说明和过程体组成一个程序单位。也可将过程说明与它的过程体分开,在这种情况下,将过程放置在一个包中,可隐蔽实现的细节。也可在包中定义过程,而该过程在包说明中没有定义过程说明,这样定义的过程仅在包内使用。

(5)在PL/SQL程序设计中,使用包不仅可以使程序设计模块化,对外隐藏包内所使用的信息(通过使用私用变量),而写可以提高程序的执行效率。因为,当程序首次调用包内函数或过程时,ORACLE将整个包调入内存,当再次访问包内元素时,ORACLE直接从内存中读取,而不需要进行磁盘I/O操作,从而使程序执行效率得到提高。如果ORACLE具有Procedure选件,包可以编译、存贮在ORACLE数据库中,其内容可为许多应用共享。 二、包的作用 包可以将任何出现在块声明的语句(过程,函数,游标,游标,类型,变量)放于包中,相当于一个容器。将声明语句放入包中的好处是:用户可以从其他PL/SQL块中对其进行引用,因此包为PL/SQL提供了全程变量。 三、包定义: (1)一个包由两个分开的部分组成: (2)包定义(PACKAGE):包定义部分是为应用程序的接口,声明包内数据类型、变量、常量、游标、子程序和异常错误处理等元素,这些元素为包的公有元素。

相关文档
最新文档