PLSQL编程基础
声明:文章转自新浪”qixianchuan的博客”
原文地址:http://blog.sina.com.cn/s/blog_bd338b210101ajsj.html
1、了解SQL和PLSQL
SQL(Structured Query Language):一种结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。简单理解为平时说的“增删改查”等等(不严谨)
PLSQL(Procedural Language/SQL):一种过程化SQL语言,是面向过程的。在SQL的基础上进行编程,增加了变量处理、语句的运行控制(begin…end)、Exception等功能。
注:oracle 叫 plsql,db2叫sqlpl… 叫法不一样。此文章针对oracle的plsql。
2、plsql结构组成
PL/SQL程序由块结构组成,每一个块都包含有PL/SQL和SQL语句。
块的结构如下:
[DECLARE
-- 程序的声明部分,例如,定义变量 ①
]
BEGIN
-- 程序的执行体,具体的操作代码 ②
[EXCEPTION
-- 异常的处理 ③
]
END ;
3、变量
变量在DECLARE块中声明。变量声明同时包含名称和类型。
变量的分类(按存值多少分):
- 简单变量:也叫单值变量
声明语法:变量名 [CONSTANT] 数据类型 [NOT NULL] [:=默认值];
例:v_date date := sysdate; - 复合变量:可以存放多个值。
声明语法:
a.定义复合类型:TYPE 复合类型名 IS TABLE OF 数据类型 INDEX BY BINARY_INTEGER;
b.变量名 复合类型名;
例:type type_table_emp_empno is table of emp.empno%type index by binary_integer;
v_empnos type_table_emp_empno;
4、语句
4.1 条件语句
IF 布尔表达式1 THEN
语句块1
ELSIF 布尔表达式2 THEN
语句块2
ELSE
语句块3
END IF;
4.2 循环语句
4.2.1 loop 循环
LOOP
语句块
EXIT WHEN 退出条件;
更改条件;
END LOOP;
4.2.2 while 循环
WHILE 循环条件表达式 LOOP
语句块
END LOOP;
4.2.3 for 循环
FOR 循环变量 IN [REVERSE] 循环下限.. 循环上限 LOOP
语句块
END LOOP;
5、游标
游标(CURSOR)是ORACLE系统在内存中开辟的一个工作区,在其中存放SELECT语句返回的查询集。在游标所定义的工作区中,存在着一个指针(POINTER),在初始状态它指向查询结果的首记录。当指针放置到某行后,即可对该行数据进行操作。
5.1 使用游标时的5个步骤
a.声明游标,并指定查询
b.声明一些变量,用来保存记录的列值
c.打开游标
d.一次从游标中获取一个记录。
e.关闭游标
5.2 游标的4个属性
%ISOPEN:是否打开
%ROWCOUNT:行数
%FOUND:boolean值,是否还有数据
%NOTFOUND:是否已无数据
例子
例1
--打开serveroutput,可以查看运行结果
set serveroutput on;
declare
--基本类型变量声明①
p_name varchar2(20) := 'HelloWord';
p_date date := sysdate;
--引用类型变量声明②
p_chnname sac_channel_param.chn_name%type;
p_banknodecode sac_channel_param.bank_node_code%type;
--记录类型变量声明③
p_row sac_channel_param%rowtype;
--记录类型变量声明2④
type p_channel_record is record(
p_name sac_channel_param.chn_name%type,
p_code sac_channel_param.bank_node_code%type
);
p_channel p_channel_record;
--表类型变量声明⑤
type p_chn_table is table of
sac_channel_param%rowtype
index by binary_integer; --指索引组织类型
p_chn p_chn_table;
begin
--打印基本类型变量值①
dbms_output.put_line(p_name);
dbms_output.put_line(p_date);
--打印引用类型变量值②
select chn_name,bank_node_code into p_chnname,p_banknodecode from sac_channel_param where id=12345678;
dbms_output.put_line(p_chnname||'的银行节点是'||p_banknodecode);
--打印记录类型变量值③
select * into p_row from sac_channel_param where id=12345678;
dbms_output.put_line(p_row.chn_name||'的银行节点是'||p_row.bank_node_code);
--打印记录类型变量值④
select chn_name,bank_node_code into p_channel from sac_channel_param where id=12345678;
dbms_output.put_line(p_channel.p_name||'的银行节点是'||p_channel.p_code);
--打印表类型变量值⑤
select * bulk collect into p_chn from sac_channel_param where id=12345678;
--BULK COLLECT INTO 指是一个成批聚合类型,简单的来说,它可以存储一个多行多列存储类型
dbms_output.put_line(p_chn(1).chn_name||'的银行节点是'||p_chn(1).bank_node_code);
end;
/
例2
--例子包含 游标(不带参数)、选择语句、循环语句
set serveroutput on
declare
cursor aa is select * from sac_channel_param;--声明游标
p_chn sac_channel_param%rowtype; --声明变量
begin
open aa; --打开游标
loop --循环
fetch aa into p_chn;--取一条值
exit when aa%notfound; --退出循环条件
if mod(aa%rowcount,2)=0 then
dbms_output.put_line(p_chn.chn_name||'的银行节点是'||p_chn.bank_node_code);
elsif mod(aa%rowcount,2)!=0 then
dbms_output.put_line(p_chn.id||'的银行节点是'||p_chn.bank_node_code);
end if;
end loop; --退出循环
close aa; --关闭游标
end;
/
后续补充其他……

501

被折叠的 条评论
为什么被折叠?



