一、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. 1.SQL数据定义语言(基础)

    1.创建数据库 CREATE Database database_name; 习惯Sql语句中,保留的关键字否设置为大写,数据库.表.字段为小写. 2.创建数据表 创建数据表基本语法 CREATE T ...

  2. sql server 2008语言基础: 集合

    --declare @t table(n int) --insert into @t values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9) --select * ...

  3. PL/SQL语言基础

    PL/SQL语言基础 /********************************数据类型*************************************/ %rowtype  (行对 ...

  4. KingbaseES PL/SQL 过程语言参考手册(3. PL/SQL语言基础)

    3. PL/SQL语言基础¶ 本章节阐述PL/SQL语言的基本组成. 字符集 词法单元 声明 对标识符的引用 标识符的作用域和可见性 为变量赋值 表达式 错误报告函数 3.1. 字符集 任何要由PL/ ...

  5. PL/SQL -- 动态SQL

    --==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...

  6. PL/SQL -- 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

  10. SQL/PL SQL

    1 sql(数据定义语言) 和PL/Sql的区别: 答:SQL是结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干.由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过 ...

最新文章

  1. IPV6 ripng互联
  2. 跳槽,你心脚同步吗?
  3. Local模式下Spark程序只输出关键信息
  4. 如何使用OpenCppCoverage检查单元测试的行覆盖率
  5. 如何求解单边z变换_的单边Z变换。.ppt
  6. 口袋之旅html5超强账号,口袋之旅特攻排行榜 强大的绝对能力
  7. vmix安装无法连接远程服务器_Windows server 2012 云服务器建站教程 (1):远程连接桌面+IIS服务器安装...
  8. 中英文组织机构名过滤
  9. mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目
  10. 2016CCPC东北地区大学生程序设计竞赛题解
  11. 一张图学会python高清图-一张图带你学会Python,学习Python的非常简单,附教程
  12. Linux首次登陆设置root
  13. 26_多易教育之《yiee数据运营系统》数据治理-atlas介绍篇
  14. 目标实现,时间、知识管理体系
  15. Topic 18. 临床预测模型之缺失值插补方法
  16. 微信没有回车键怎么换行_微信打字怎么换行
  17. 【面试题】计算机网络 -- 常见面试题总结
  18. video.js视频高度自适应解决方法
  19. 开源 非开源_假期有14种惊人的开源礼物
  20. 在博客和Markdown和Python中自由添加emoji!包括博客标题和Python打印!

热门文章

  1. linxu改网络地址。
  2. PXE+Kickstart无人值守安装CentOS 7出现DHCP故障解决报告
  3. SpringMVC -- 梗概--源码--贰--RestFul收参(了解) @PathVariable
  4. 关于java mail 发邮件的问题总结(转)
  5. 绿色版Tomcat 启动 + 停止 + 随系统自动启动 - - 博客频道 - CSDN.NET
  6. 教学平台服务器安装环境说明
  7. 2008年12月信息处理技术员上午试卷 51CTO版参考答案
  8. 关于SharePoint解决方案开发模型的凌乱文章…
  9. 获取含有class为某个值的a标签或img标签
  10. Nginx常用命令介绍