【PL/SQL】PL/SQL语言基础
一、PL/SQL的块
(1)块(Block)是PL/SQL的基本程序单元
(2)一个PL/SQL应用程序由一个或多个块组成
1.PL/SQL块的基本组成
(1)定义部分(declare)
——定义常量、变量、游标等
——可选(不是块的必须部分)
(2)执行部分(begin…end;)
——执行SQL语句或PL/SQL语句
(3)异常部分(exception)
——处理运行时的错误
——可选(不是块的必须部分)
2.PL/SQL块的分类
(1)匿名块(anonymous):动态构造,只能执行一次,可调用其他程序,但不能被其他程序调用。
①无变量匿名块
SQL> begin
2
3 dbms_output.put_line('Hello World ');
4
5 end;
6 /
PL/SQL procedure successfully completed
SQL> /
Hello World
PL/SQL procedure successfully completed
②有变量的匿名块,定义变量:
SQL> declare
2 v_ename VARCHAR2(10);
3 v_sal NUMBER(7,2);
4
5 begin
6
7 select ename,sal into v_ename,v_sal from emp where empno=#
8
9 dbms_output.put_line('Employees name is: '||v_ename);
10 dbms_output.put_line('Employees salary is: '||v_sal);
11
12 end;
13 /
Employees name is: SCOTT
Employees salary is: 9000
(2)命名块(named):是带有名称的匿名块,这个名称就是标签。
(3)子程序(subprogram):在数据库上建立好后可在其他程序中调用它们。
——过程
——函数
(4)触发器(trigger):当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
(5)程序包(package):存储在数据库中的一组子程序、变量定义。在包中的子程序可以被其他程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。
3.PL/SQL 变量
在PL/SQL程序中临时存储数据;
程序之间传递数据
(1)PL/SQL变量类型
①标量类型
BINARY_DOUBEL BINARY_FLOAT BINARY_INTEGER BEC BECIMAL FLOAT INT INTEGER NATURAL NATURALN NUMBER NUMERIC PLS_INTEGER POSITIVE REAL SIGNTYPE SMALLINT |
CHAR CHARACTER LONG LONG RAW NCHAR NVARCHAR2 RAW ROWID STRING UROWID VARCHAR VARCHAR2 |
BOOLEAN |
DATE |
②复合类型
RECORD
TABLE
VARRAY
③参考类型
REF CURSOR
REF object_type
④大对象类型
BFILE
BLOB
CLOB
NCLOB
(2)PL/SQL变量定义语法
identifier [CONSTRANT] datatype [NOT NULL] [:= | DEFAULT expr]
变量定义实例:
V_ename varchar2(20);
V_sal number(7,2);
V_balance binary_float;
V_hiredate date;
V_valid Boolean not null default false;
·定义常量和变量并赋值:
declare
v_ename VARCHAR2(10);
v_sal NUMBER(7,2);
c_empno NUMBER(4):=7788; //声明一个常量
begin
select ename,sal into v_ename,v_sal from emp where empno=c_empno;
dbms_output.put_line('Employees name is: '||v_ename);
dbms_output.put_line('Employees salary is: '||v_sal);
end;
·在执行部分给变量赋值:
SQL> declare
2 v_ename VARCHAR2(10);
3 v_sal NUMBER(7,2);
4 v_empno NUMBER(4);
5
6 begin
7 v_empno := 7788;
8
9 select ename,sal into v_ename,v_sal from emp where empno=v_empno;
10
11 dbms_output.put_line('Employees name is: '||v_ename);
12 dbms_output.put_line('Employees salary is: '||v_sal);
13
14 end;
(3)%TYPE 属性
变量用于存放列值时,为了保证合适的数据类型和长度,可以使用%TYPE属性进行定义
V_ename emp.ename%type;
(4)复合变量
①用于存放多个值的变量
②复合变量的类型:
—PL/SQL记录
每个PL/SQL记录保护多个成员;
类似于c语句中的结构体;
通过record类型处理一行多列的数据;
1.record:在一个变量中可以存储多个区域,每个区域可以是一个标量、记录或table (用于处理一行多列的信息)
案例:
SQL> declare
2 type emp_record is record //定义变量类型为record
3 ( v_ename emp.ename%type,
4 v_sal emp.sal%type,
5 v_deptno emp.deptno%type
6 );
7
8 emp_rcd emp_record ;
9
10 begin
11
12 select ename,sal,deptno into emp_rcd from emp where empno=#
13
14 dbms_output.put_line ('Employees name is: '||emp_rcd.v_ename);
15 dbms_output.put_line ('Employees salary is: '||emp_rcd.v_sal);
16 dbms_output.put_line ('Employees deparment number is: '||emp_rcd.v_deptno);
17 end;
18 /
Employees name is: SCOTT
Employees salary is: 9000
Employees deparment number is: 20
PL/SQL procedure successfully completed
2、通过%rowtype处理一行数据
SQL> declare
2 emp_rcd emp%rowtype ;
3
4 begin
5
6 select * into emp_rcd from emp where empno=#
7
8 dbms_output.put_line ('Employees name is: '||emp_rcd.ename);
9 dbms_output.put_line ('Employees salary is: '||emp_rcd.sal);
10 dbms_output.put_line ('Employees hiredate is: '||to_char
(emp_rcd.hiredate,'yyyy-mm-dd'));
11 dbms_output.put_line ('Employees deparment number is: '||emp_rcd.deptno);
12 end;
13 /
Employees name is: SCOTT
Employees salary is: 9000
Employees hiredate is: 1987-04-19
Employees deparment number is: 20
PL/SQL procedure successfully completed
—PL/SQL表
table: 相当于高级语言中的数组,但是需要注意的是在高级语言中数组的下标不能为负数,而pl/sql是可以为负数的,并且表元素的下标没有限制
语法:
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
Ename_table ename_table_type;
案例:
SQL> declare
2 type emp_tab is table of emp.ename%type //定义变量类型为table类型
3 index by binary_integer; //建立索引
4
5 emp_table emp_tab;
6
7 begin
8
9 select ename into emp_table(1) from emp where empno=7788;
10 select ename into emp_table(2) from emp where empno=7369;
11 select ename into emp_table(3) from emp where empno=7499;
12
13 dbms_output.put_line('Employees 7788 name is: '||emp_table(1));
14 dbms_output.put_line('Employees 7369 name is: '||emp_table(2));
15 dbms_output.put_line('Employees 7499 name is: '||emp_table(3));
16 end;
17 /
Employees 7788 name is: SCOTT
Employees 7369 name is: SMITH
Employees 7499 name is: ALLEN
PL/SQL procedure successfully completed
SQL>
SQL> declare
2 type emp_tab is table of emp.ename%type
3 index by binary_integer;
4
5 type emp_t is table of emp.sal%type
6 index by binary_integer;
7
8 emp_table emp_tab;
9 emp_t_sal emp_t;
10
11 begin
12
13 select ename into emp_table(1) from emp where empno=7788;
14 select ename into emp_table(2) from emp where empno=7369;
15 select ename into emp_table(3) from emp where empno=7499;
16
17 select sal into emp_t_sal(1) from emp where empno=7788;
18 select sal into emp_t_sal(2) from emp where empno=7369;
19 select sal into emp_t_sal(3) from emp where empno=7499;
20
21 dbms_output.put_line('Employees 7788 name is: '||emp_table(1));
22 dbms_output.put_line('Employees 7369 name is: '||emp_table(2));
23 dbms_output.put_line('Employees 7499 name is: '||emp_table(3));
24
25 dbms_output.put_line('Employees 7788 salary is: '||emp_t_sal(1));
26 dbms_output.put_line('Employees 7369 salary is: '||emp_t_sal(2));
27 dbms_output.put_line('Employees 7499 salary is: '||emp_t_sal(3));
28 end;
29 /
Employees 7788 name is: SCOTT
Employees 7369 name is: SMITH
Employees 7499 name is: ALLEN
Employees 7788 salary is: 9000
Employees 7369 salary is: 6800
Employees 7499 salary is: 7600
PL/SQL procedure successfully completed
—嵌套表
在table类型中嵌套record类型,可以处理多行多列数据。
案例:
SQL> declare
2 type emp_table_type is table of emp%rowtype
3 index by binary_integer;
4 emp_tab emp_table_type;
5
6 begin
7 select * into emp_tab(1) from emp where empno=7788;
8 select * into emp_tab(2) from emp where empno=7369;
9 dbms_output.put_line('7788 Ename is: '||emp_tab(1).ename );
10 dbms_output.put_line('7788 Salary is: '|| emp_tab(1).sal);
11 dbms_output.put_line('7788 Deparment ID is: '||emp_tab(1).deptno);
12 dbms_output.put_line('7369 Ename is: '||emp_tab(2).ename);
13 dbms_output.put_line('7369 Salary is: '|| emp_tab(2).sal);
14 dbms_output.put_line('7369 Deparment ID is: '||emp_tab(2).deptno);
15 end;
16 /
7788 Ename is: SCOTT
7788 Salary is: 9000
7788 Deparment ID is: 20
7369 Ename is: SMITH
7369 Salary is: 6800
7369 Deparment ID is: 20
PL/SQL procedure successfully completed
—VARRAY
数组:类似于嵌套表,但元素个数要指定上限。
TYPE VARRAY_NAME IS VARRY(SIZE) OF ELEMENT_TYPE [NOT NULL];
案例:
SQL> declare
2 type tab_varray_type is varray(4) of varchar2(1);
3 v_tab_varray tab_varray_type;
4 begin
5 v_tab_varray :=tab_varray_type('A','B','C','D');
6 dbms_output.put_line(v_tab_varray(1));
7 dbms_output.put_line(v_tab_varray(2));
8 dbms_output.put_line(v_tab_varray(3));
9 dbms_output.put_line(v_tab_varray(4));
10 dbms_output.put_line(v_tab_varray(1)||'-'||v_tab_varray(4));
11 end;
12 /
A
B
C
D
A-D
PL/SQL procedure successfully completed
—参照变量
是值用于存放数值指针的变量
参照变量的类型
游标变量(REF CURSOR)
对象类型变量(REF obj_type)
PL/SQL 代码标准化
①变量以v_开头 ②常量以c_开头 ③游标以_cursor结尾 ④异常以e_开头 ⑤表类型以_table_type结尾 ⑥表变量以_table结尾 ⑦记录类型以_record_type结尾 ⑧记录变量以_record结尾 |
①SQL关键字采用大写 ②PL/SQL关键字采用大写 ③数据类型采用大写 ④标识符和参数采用小写 ⑤数据库对象和列采用小写 |
代码缩进: ①同级代码应对齐 ②下一级代码要进行缩进 |
【PL/SQL】PL/SQL语言基础相关推荐
- 1.SQL数据定义语言(基础)
1.创建数据库 CREATE Database database_name; 习惯Sql语句中,保留的关键字否设置为大写,数据库.表.字段为小写. 2.创建数据表 创建数据表基本语法 CREATE T ...
- sql server 2008语言基础: 集合
--declare @t table(n int) --insert into @t values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9) --select * ...
- PL/SQL语言基础
PL/SQL语言基础 /********************************数据类型*************************************/ %rowtype (行对 ...
- KingbaseES PL/SQL 过程语言参考手册(3. PL/SQL语言基础)
3. PL/SQL语言基础¶ 本章节阐述PL/SQL语言的基本组成. 字符集 词法单元 声明 对标识符的引用 标识符的作用域和可见性 为变量赋值 表达式 错误报告函数 3.1. 字符集 任何要由PL/ ...
- PL/SQL -- 动态SQL
--==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...
- PL/SQL -- 动态SQL调用包中函数或过程
动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...
- t–sql pl–sql_SQL Server处理器性能指标–第4部分–处理器指标有助于更深入的调查和故障排除
t–sql pl–sql In the previous part of this series, we presented the processor metrics that indicate h ...
- t–sql pl–sql_SQL Server –在T-SQL中使用最低的度量单位
t–sql pl–sql A client recently discovered a discrepancy on one of our reports that showed an improve ...
- t–sql pl–sql_SQL日期时间–您应该知道的15个重要功能!
t–sql pl–sql Hey, folks! Hope you all are doing well. Today, in this article, we will be highlightin ...
- SQL/PL SQL
1 sql(数据定义语言) 和PL/Sql的区别: 答:SQL是结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干.由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过 ...
最新文章
- IPV6 ripng互联
- 跳槽,你心脚同步吗?
- Local模式下Spark程序只输出关键信息
- 如何使用OpenCppCoverage检查单元测试的行覆盖率
- 如何求解单边z变换_的单边Z变换。.ppt
- 口袋之旅html5超强账号,口袋之旅特攻排行榜 强大的绝对能力
- vmix安装无法连接远程服务器_Windows server 2012 云服务器建站教程 (1):远程连接桌面+IIS服务器安装...
- 中英文组织机构名过滤
- mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目
- 2016CCPC东北地区大学生程序设计竞赛题解
- 一张图学会python高清图-一张图带你学会Python,学习Python的非常简单,附教程
- Linux首次登陆设置root
- 26_多易教育之《yiee数据运营系统》数据治理-atlas介绍篇
- 目标实现,时间、知识管理体系
- Topic 18. 临床预测模型之缺失值插补方法
- 微信没有回车键怎么换行_微信打字怎么换行
- 【面试题】计算机网络 -- 常见面试题总结
- video.js视频高度自适应解决方法
- 开源 非开源_假期有14种惊人的开源礼物
- 在博客和Markdown和Python中自由添加emoji!包括博客标题和Python打印!
热门文章
- linxu改网络地址。
- PXE+Kickstart无人值守安装CentOS 7出现DHCP故障解决报告
- SpringMVC -- 梗概--源码--贰--RestFul收参(了解) @PathVariable
- 关于java mail 发邮件的问题总结(转)
- 绿色版Tomcat 启动 + 停止 + 随系统自动启动 - - 博客频道 - CSDN.NET
- 教学平台服务器安装环境说明
- 2008年12月信息处理技术员上午试卷 51CTO版参考答案
- 关于SharePoint解决方案开发模型的凌乱文章…
- 获取含有class为某个值的a标签或img标签
- Nginx常用命令介绍