PL/SQL程序设计基本知识(一)

PL/SQL编程

PL/SQL是面向过程语言和SQL语言的结合,PL/SQL在SQL语言中扩充了面向过程语言的程序结构,例如数据类型和变量,分支、循环等程序控制结构,过程和函数等。

标识符、常量、变量

(1)标识符
标识符是用户自己定义的符号串,用于命名常量、变量、游标(游标这个东西后面会提到)、子程序和包(…)等。
标识符必须遵守PL/SQL标识符命名规则,内容如下:
●标识符必须由字母开头。
●标识符可以包含字母、数字、下划线、KaTeX parse error: Expected 'EOF', got '#' at position 2: 、#̲。 ●标识符长度不能超过30…、# 或_;
●变量长度不超过30个字符;
●变量名中不能有空格。
同样我觉得扫一眼就ok,不用专门记忆,如果程序在命名时出错在来对照看一下。

运算符和表达式

8.3.1 表达式
表达式分为:赋值、数字、关系、逻辑4种表达式。
1.赋值表达式
赋值表达式是由":="连接起来的表达式。
举个例子:
vvvv:=200;
vvvv是一个变量。
2.数值表达式
数值表达式是由(数值类型的变量、常量、函数)或者(表达式由算数运算符连接而成。)
举个例子:
6*(vvvv+2)-5
3.关系表达式
关系表达式是由关系运算符连接起来的表达式。关系表达式举例如下:
vvvv<500
4.逻辑表达式
逻辑表达式是由逻辑运算符连接起来的表达式。
逻辑表达式举例如下
(vvvv>=150)AND(vvvv<500)

PL/SQL基本结构和控制语句

PL/SQL的基本逻辑结构包括顺序结构、条件结构和循环结构。PL/SQL主要通过条件语句和循环语句来控制程序执行的逻辑顺序,这被称为控制结构,控制结构是程序设计语言的核心。控制语句通过对程序流程的组织和控制,提高编程语言的处理能力,满足程序设计的需要,PL/SQL提供的控制语句:

解密的 SQL server 标量值函数 sql语句标识符_SQL


PL/SQL程序块:

PL/SQL是一种结构化程序设计语言,PL/SQL程序块是程序种最基本的结构。一个PL/SQL程序块可以分为三个部分:声明部分、执行部分和异常处理部分。声明部分由DECLARE关键字开始,包含变量和常量的数据类型和初始值。由关键字BEGIN开始的执行部分,放所有可执行语句。异常处理部分由EXCEPTION关键字开始,处理异常和错误,这一部分是可选的。程序块最终由关键字END 结束,PL/SQL块的基本结构如下所示:

DECLARE

balalblalba…

BEGIN

执行执行执行…

EXCEPTION

异常处理部分

END

简单的PL/SQL程序:计算8和9的乘积:

SET SERVEROUTPUT ON;

DECLARE

m NUMBER:=8;

BEGIN

m:=m*9;

DBMS_OUTPUT.PUT_LINE(‘乘积为:’||TO_CHAR(m));

其中||为字符连接符号

END;

这个语句就是采用PL/SQL程序块计算8和9的乘积。

语句SET SERVEROUTPUT ON的功能是打开Oracle自带的输出方法DBMS_OUTPUT,ON为打开,OFF为关闭。打开SET SERVEROUTPUT ON 后,可用DBMS_OUTPUT方法输出信息。

将SQL语言查询结果存入变量

PL/SQL不是普通的程序语言,而是面向过程语言和SQL语言的结合,可使用SELECT-INTO语句将SQL语言查询结果存入变量。

来一个例子:

将学生数存入变量v_count,将学号为184003学生姓名和性别分别存入变量v_name和v_sex。

DECLARE

v_count NUMBER;

v_name student.sname%TYPE;(这句的意思是,v_name与student表的sname属性数据类型一致。)

v_sex student.ssex%TYPE;(同样,v_sex的类型和student表的ssex属性数据类型一致。)

BEGIN

SELECT COUNT(*) INTO V_COUNT

FROM student;

SELECT sname,ssex INTO v_name,v_sex

FROM student

WHERE sno=‘184003’;

DBMS_OUTPUT.PUT_LINE(‘学生数为:’||v_count);

DBMS_OUTPUT.PUT_LINE(‘184003学生姓名为:’||v_name);

DBMS_OUTPUT.PUT_LINE(‘184003学生性别为:’ || v_sex);

END;

结果如下(Oracle 12c中)

解密的 SQL server 标量值函数 sql语句标识符_SQL_02


**总结一下:**首先DECLARE所需的变量,然后在BEGIN 和END 中间写出所求操作。

条件结构

IF-THEN结构

如果田间表达式为TRUE,则执行语句块中的操作。来个例子:
查询总学分大于和等于50分的学生人数。
DECLARE
p_no NUMBER(2);
BEGIN
SELECT COUNT(*) INTO p_no
FROM student
WHERE tc>=50;
IF p_no<>0 THEN
DBMS_OUTPUT.PUT_LINE(‘总学分>=50的人数为:’|| TO_CHAR(p_no));
END IF
END;

运行结果:

解密的 SQL server 标量值函数 sql语句标识符_程序块_03


这里要注意 单引号的格式是英文格式下的,我在运行时出错了找了好一会才发现输入成了中文模式下的单引号。

IF-THEN-ELSE结构

上例子:

如果“高等数学”课程的平均成绩大于80分,则显示“高等数学平均成绩高于80分”,否则显示“高等数学平均成绩低于80分”。

DECLARE

G_AVG NUMBER(4,2);

BEGIN

SELECT AVG(grade) INTO g_avg

FROM student a,course b,score c

WHERE a.sno=c.sno

AND b.cno=c.cno

AND b.cname=‘高等数学’;

IF g_avg>80 THEN

DBMS_OUTPUT.PUT_LINE(‘高等数学平均成绩高于80’);

ELSE

DBMS_OUTPUT.PUT_LINE(‘高等数学平均成绩低于80’);

END IF;

END;

运行结果:

解密的 SQL server 标量值函数 sql语句标识符_数据库_04

CASE语句

CASE语句描述了多分支语句结构,是逻辑结构变得更为简单和有效,它包括简单CASE语句和搜索CASE语句。

1.简单CASE语句

简单CASE语句设定一个变量的值,然后顺序比较WHEN关键字后给定值,如果遇到第一个相等的给定值,则执行THEN关键字后的赋值语句,并结束CASE语句。

上例子:

将教师职称转变为职称类型

DECLARE

t_title CHAR(18);

t_op VARCHAR2(8);

BEGIN

SELECT title INTO t_title

FROM teacher

WHERE tname=‘李志远’;

CASE t_title

WHEN’教授’ THEN t_op:=‘高级职称’;

WHEN’副教授’THEN t_op=‘高级职称’;

WHEN ‘讲师’ THEN t_op=‘中级职称’;

WHEN’助教’THEN t_op=‘初级职称’;

ELSE t_op:=‘Nothing’;

END CASE;

DBMS_OUTPUT.PUT_LINE(‘李志远的职称是:’||t_op);

END;

解密的 SQL server 标量值函数 sql语句标识符_程序块_05

2.搜索CASE语句
  搜索CASE语句在WHEN关键字后设置布尔表达式,选择第一个为TRUE的布尔表达式,执行THEN关键字后的语句,并结束CASE语句。
  例子:
  将学生成绩转变为成绩等级。
  DECLARE
  v_grade NUMBER;
  v_result VARCHAR2(16);
  BEGIN
   SELECT AVG(grade) INTO v_grade
     FROM score 
     WHERE sno='184001';
     CASE
       WHEN v_grade>=90 AND v_grade<=100 THEN v _result:='优秀';
       WHEN v_grade>=80 AND v_grade<90 THEN v_result:='良好';
       WHEN v_grade>=70 AND v_grade<80 THEN v_result:='中等';
       WHEN V_grade>=60 and v_grade <70 THEN v_result:='及格';
       WHEN v_grade >=0 and v_grade<60 THEN v_result:='不及格';
       ELSE v_result:='Nothing';
       END CASE;
       DBMS_OUTPUT.PUT_LINE('学号为184001的平均成绩:'||v_result);
       END;
       总结:创建v_grade变量用select语句先把v_grade得到具体的值,然后上CASE语句给v_result赋值。最后输出想要的结果。
  

总结:一种是CASE后面加个变量,然后各种case情况匹配。一种是CASE后面没有变量,每个语句是布尔值。
循环结构
1.WHILE-LOOP-END循环
例子:计算1~100的奇数和。
SET SERVEROUTPUT ON;
DECLARE
v_n NUMBER:=1;
v_s NUMBER:=0;
BEGIN
WHILE v_n<=100
LOOP
IF MOD(v_n,2)<>0 THEN
v_s:=v_s+v_n;
END IF;
v_n:=v_n+1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(‘1~100的奇数和为:’||v_s);
END;
计算10的阶乘
DECLARE
v_n NUMBER;
v_s NUMBER:=1;
BEGIN
FOR v_n IN 1…10
LOOP
v_s:=v_s*v_n;
END LOOP;
DBMS_OUTPUT.PUT_LINE(‘10!=’||v_s);
END;

解密的 SQL server 标量值函数 sql语句标识符_数据库_06