PLSQL编程
来源:互联网 发布:上海知楚仪器有限公司 编辑:程序博客网 时间:2024/06/05 16:21
一、块结构
[declare
--声明变量
变量名 类型[:=值]
]
begin
具体代码
[exception
--异常的处理
]
end;
二、复合类型变量
1.表类型:用于存放某一数据类型的值
定义:type 名称 is table of 存放数据类型 index by binary_integer;
声明:变量名 名称;
例:
declare
type emp_empno is table of number index by binary_integer;
v_empno emp_empno;
begin
v_empno(0):=7788;
v_empno(1):=7839;
v_empno(2):=7369;
dbms_output.put_line(v_empno(0));
end;
2.记录类型:可用于存放多种类型的值
定义:type 名称 is record(存放变量名1 存放数据类型,...);
声明:变量名 名称;
例:
declare
type emp_record is record(ename varchar2(20),sal number);
v_record emp_record;
begin
v_record.ename:='略略略';
v_record.sal:=11000;
dbms_output.put_line(v_record.ename||v_record.sal);
end;
三、条件逻辑
if 条件判断 then
...
elsif 条件判断 then
...
else
...
end if;
四、循环
1.
loop
具体代码
exit when 条件判断
end loop;
2.
for 循环变量 in [reverse] 循环开始数字..循环结束数字|(select * from 表名) loop
具体代码
end loop;
3.
while 条件判断 loop
具体代码
end loop;
五、游标
1.隐示游标
begin
for i in(select * from emp) loop
dbms_output.put_line('姓名:'||i.ename||' 部门:'||i.deptno||' 年薪:'||12*(i.sal+nvl(i.comm,0)));
end loop;
end;
2.显示游标
declare
--声明变量
rowobj emp%rowtype;
--声明游标
cursor mycursor is select * from emp;
begin
--打开游标
open mycursor ;
--抓取数据
loop
fetch mycursor into rowobj;
exit when mycursor%notfound;
dbms_output.put_line('姓名:'||rowobj.ename||' 部门:'||rowobj.deptno||' 年薪:'||12*(rowobj.sal+nvl(rowobj.comm,0)));
end loop;
--关闭游标
close mycursor;
end;
3.动态游标
declare
--声明变量
rowobj emp%rowtype;
sqlVar varchar2(500);
--声明游标
mycursor sys_refcursor;
begin
sqlVar:='select * from emp';
--打开游标
open mycursor for sqlVar;
--抓取数据
loop
fetch mycursor into rowobj;
dbms_output.put_line('姓名:'||rowobj.ename||' 部门:'||rowobj.deptno||' 年薪:'||12*(rowobj.sal+nvl(rowobj.comm,0)));
exit when mycursor%notfound;--退出条件,没有数据
end loop;
--关闭游标
close mycursor;
end;
六、存储过程
例:实现大写字母转小写字母(lower(string)函数)的功能
create or replace function myfunction1(str1 varchar2)
return varchar2
is
n number;
str2 varchar2(200):='';
begin
for i in 1..length(str1) loop
n:=ascii(substr(str1,i,i));
if ascii(substr(str1,i,i)) between ascii('A') and ascii('Z') then
n:=n+32;
end if;
str2:=concat(str2,chr(n));
end loop;
return str2;
end;
七.触发器
当特定的DML语句(insert,update或delete)运行之前或之后自动运行的过程
create or replace trigger 触发器名
before|after insert[ or delete[ or update]] on 表名 for each row
begin
具体代码
[declare
--声明变量
变量名 类型[:=值]
]
begin
具体代码
[exception
--异常的处理
]
end;
二、复合类型变量
1.表类型:用于存放某一数据类型的值
定义:type 名称 is table of 存放数据类型 index by binary_integer;
声明:变量名 名称;
例:
declare
type emp_empno is table of number index by binary_integer;
v_empno emp_empno;
begin
v_empno(0):=7788;
v_empno(1):=7839;
v_empno(2):=7369;
dbms_output.put_line(v_empno(0));
end;
2.记录类型:可用于存放多种类型的值
定义:type 名称 is record(存放变量名1 存放数据类型,...);
声明:变量名 名称;
例:
declare
type emp_record is record(ename varchar2(20),sal number);
v_record emp_record;
begin
v_record.ename:='略略略';
v_record.sal:=11000;
dbms_output.put_line(v_record.ename||v_record.sal);
end;
三、条件逻辑
if 条件判断 then
...
elsif 条件判断 then
...
else
...
end if;
四、循环
1.
loop
具体代码
exit when 条件判断
end loop;
2.
for 循环变量 in [reverse] 循环开始数字..循环结束数字|(select * from 表名) loop
具体代码
end loop;
3.
while 条件判断 loop
具体代码
end loop;
五、游标
1.隐示游标
begin
for i in(select * from emp) loop
dbms_output.put_line('姓名:'||i.ename||' 部门:'||i.deptno||' 年薪:'||12*(i.sal+nvl(i.comm,0)));
end loop;
end;
2.显示游标
declare
--声明变量
rowobj emp%rowtype;
--声明游标
cursor mycursor is select * from emp;
begin
--打开游标
open mycursor ;
--抓取数据
loop
fetch mycursor into rowobj;
exit when mycursor%notfound;
dbms_output.put_line('姓名:'||rowobj.ename||' 部门:'||rowobj.deptno||' 年薪:'||12*(rowobj.sal+nvl(rowobj.comm,0)));
end loop;
--关闭游标
close mycursor;
end;
3.动态游标
declare
--声明变量
rowobj emp%rowtype;
sqlVar varchar2(500);
--声明游标
mycursor sys_refcursor;
begin
sqlVar:='select * from emp';
--打开游标
open mycursor for sqlVar;
--抓取数据
loop
fetch mycursor into rowobj;
dbms_output.put_line('姓名:'||rowobj.ename||' 部门:'||rowobj.deptno||' 年薪:'||12*(rowobj.sal+nvl(rowobj.comm,0)));
exit when mycursor%notfound;--退出条件,没有数据
end loop;
--关闭游标
close mycursor;
end;
六、存储过程
例:实现大写字母转小写字母(lower(string)函数)的功能
create or replace function myfunction1(str1 varchar2)
return varchar2
is
n number;
str2 varchar2(200):='';
begin
for i in 1..length(str1) loop
n:=ascii(substr(str1,i,i));
if ascii(substr(str1,i,i)) between ascii('A') and ascii('Z') then
n:=n+32;
end if;
str2:=concat(str2,chr(n));
end loop;
return str2;
end;
七.触发器
当特定的DML语句(insert,update或delete)运行之前或之后自动运行的过程
create or replace trigger 触发器名
before|after insert[ or delete[ or update]] on 表名 for each row
begin
具体代码
end;
/*1.使用游标输出 scott中所有的雇员名称,部门名称,年薪*/--显示游标declare --声明变量 rowobj emp%rowtype; --声明游标 cursor mycursor is select * from emp;begin --打开游标 open mycursor ; --抓取数据 loop fetch mycursor into rowobj; exit when mycursor%notfound; dbms_output.put_line('姓名:'||rowobj.ename||' 部门:'||rowobj.deptno||' 年薪:'||12*(rowobj.sal+nvl(rowobj.comm,0))); end loop; --关闭游标 close mycursor;end;/*2.定义存储过程 可以传入以下参数 query(ename,job,sal) 如果传入了某几个参数 以参数组合的形式查询结果 比如调用过程如下 query('Cleck',null,null); 查询的sql为 select * from emp where ename like '%Cleck%'; query('Cleck','Manager',null); 查询的sql为 select * from emp where ename like '%Cleck%' and job like '%Manager%' 要求输出查询的结果*/--(1)创建存储过程 create or replace procedure myquery(v_name varchar2, v_job varchar2, v_sal varchar2) as --复制表所有行 rowobj emp%rowtype; sqlVar varchar2(2000):= 'select * from emp where 1=1'; --定义动态游标 mycursor sys_refcursor; begin --条件逻辑 if(v_name is not null) then sqlVar:=sqlVar||'and ename like '''||v_name||''''; end if; if(v_job is not null) then sqlVar:=sqlVar||'and job like '''||v_job||''''; end if; if(v_sal is not null) then sqlVar:=sqlVar||'and sal='||v_sal; end if; --dbms_output.put_line(sqlVar); --使用游标 open mycursor for sqlVar; loop fetch mycursor into rowobj; exit when mycursor%notfound; dbms_output.put_line('['||rowobj.ename||']['||rowobj.job||']['||rowobj.sal||']'); end loop; close mycursor; end;--(2)传入参数测试begin dbms_output.put_line('【参数1、2、3:null,null,null】'); myquery(null,null,null); dbms_output.put_line('【参数1、2、3:null,'''||'CLERK'||''',null】'); myquery(null,'CLERK',null); dbms_output.put_line('【参数1、2、3:'''||'SCOTT'||''',null,null】'); myquery('SCOTT',null,null);end;/*3.查找出输入的用户下,每张表的记录数,(提示:使用 tab表)以scott用户为例,结果应如下:? DEPT...................................4? EMP...................................14? BONUS.................................0? SALGRADE.............................5*/declare v_sql varchar(2000); cou number; mycursor sys_refcursor ;begin for i in (select * from user_tables) loop v_sql:='select count(rowid) from '||i.table_name; --游标操作 open mycursor for v_sql; loop fetch mycursor into v_sql; exit when mycursor%notfound; cou:=v_sql; end loop; close mycursor; --打印语句 dbms_output.put_line(i.table_name||'...........'||cou); end loop;end; /*4.定义一个存储过程 传入表名 删除该表中的重复记录 比如 deleteMul(tableName) 调用 deleteMul('emp'); 必须删除表emp的重复数据 (execute immediate using )*/create or replace procedure deleteMul(tableName varchar2)as mycursor sys_refcursor; v_sql varchar2(2000):='select t.column_name from user_col_comments t where t.table_name = '; v_colnames user_col_comments.column_name%type; leim varchar2(2000);begin v_sql:=v_sql||''''||tableName||''''; open mycursor for v_sql; loop fetch mycursor into v_colnames; exit when mycursor%notfound; leim:=leim||v_colnames||','; end loop; close mycursor; leim:=substr(leim,1,length(leim)-1); execute immediate 'delete from '||tableName||' e1 where e1.rowid not in (select max(rowid) from '||tableName||' e2 group by '||leim||')'; commit;end;/*5.写出一个分页的存储过程 定义如下 tablePager(tableName,curPage,pageSize) 调用 tablePager('Emp',2,10) 查询emp表中 第二页的数据(每页显示10条 第二页就是 10-20条)*/create or replace procedure tablePager(tableName varchar2,curPage number,pageSize number)as starIndex number:=(curPage-1)*pageSize+1; endIndx number:=curPage*pageSize; vSql varchar2(2000):=''; colSql varchar2(2000):=''; mycursor sys_refcursor; myResult varchar2(2000);begin select replace(wm_concat(column_name),',','||'' ''||') into colSql from user_tab_cols where table_name=tableName; vSql:='select '||colSql||' from (select t.*,rownum rn from '||tableName||' t) where rn>='||starIndex||' and rn<= '||endIndx; open mycursor for vSql; loop fetch mycursor into myResult; exit when mycursor%notfound; syso(myResult); end loop; close mycursor;end;
阅读全文
0 0
- plsql编程
- plsql编程
- PLSQL编程
- PLSQL编程
- PLSQL编程2:PLSQL变量
- ORcale PLSQL编程
- PLSQL编程、游标、异常
- plsql oracle 编程
- plsql编程语法
- oracle plsql 编程
- plsql编程总结
- plsql oracle 编程
- PLSQL 编程基础
- PLSQL编程之异常
- oracle学习PLSQL编程
- PLSQL编程综述
- plsql编程语言示例
- plsql 编程入门基础
- LED的电学指标
- Google发布AVA:一个用于理解人类动作的精细标记视频数据集
- 1001. 害死人不偿命的(3n+1)猜想 (15) && 1005. 继续(3n+1)猜想 (25)
- activemq 自动安装配置出了问题
- [珍藏] 技能图谱握在手,召唤神龙不用愁
- PLSQL编程
- 1+2+3+...n<8888的最大正整数n
- ServletContext作用功能详解
- 从西安国际贵宾室来看海航好不好
- Balance-Binary-Tree算法推演
- 如何使用rem单位
- maven的常用命令
- spring相关的知识
- baidu