数据库Oracle与Mysql语法对比:变量赋值

时间:2022-10-18 14:52:21

Oracle

PL/SQL程序的基本单元是块(BLOCK),块就是实现一定功能的逻辑模块。一个PL/SQL 程序由一个或多个块组成。块有固定的结构,也可以嵌套。一个块可以包括三个部分,每个部分由一个关键字标识。
块中各部分的作用解释如下:
(1) DECLARE:声明部分标志。
(2) BEGIN:可执行部分标志。
(3) EXCEPTION:异常处理部分标志。
(4) END;:程序结束标志。
在以下的训练中,将使用函数 DBMS_OUTPUT.PUT_LINE 显示输出结果。 DBMS_OUTPUT 是 Oracle 提供的包,该包有如下三个用于输出的函数,用于显示 PL/SQL
程序模块的输出信息。
第一种形式:
DBMS_OUTPUT.PUT(字符串表达式);
用于输出字符串,但不换行,括号中的参数是要输出的字符串表达式。
第二种形式:
DBMS_OUTPUT.PUT_LINE(字符串表达式);
用于输出一行字符串信息,并换行,括号中的参数是要输出的字符串表达式。
第三种形式:
DBMS_OUTPUT.NEW_LINE;
用来输出一个换行,没有参数。
调用函数时,在包名后面用一个点“.”和函数名分隔,表示隶属关系。

 SET SERVEROUTPUT ON  
DECLARE --声明部分标识
v_job VARCHAR2(9);
v_count BINARY_INTEGER DEFAULT 0;
v_total_sal NUMBER(9,2) := 0;
c_tax_rate CONSTANT NUMBER(3,2) := 8.25;
v_valid BOOLEAN NOT NULL := TRUE;
BEGIN
v_job:='MANAGER'; --在程序中赋值
DBMS_OUTPUT.PUT_LINE(v_job); --输出变量 v_job 的值
DBMS_OUTPUT.PUT_LINE(v_count); --输出变量 v_count 的值
DBMS_OUTPUT.PUT_LINE(v_date); --输出变量 v_date 的值
DBMS_OUTPUT.PUT_LINE(c_tax_rate); --输出变量 c_tax_rate 的值
END; 执行结果:

Mysql

把查询结果赋值到变量,大部分情况下使用游标来完成,但是如果明确知道查询结果只有一行(例如统计记录的数量,某个字段求和等),其实可以使用set或into的方式来实现赋值。示例代码:

drop table if exists test_tbl;
create table test_tbl (name varchar(20), status int(2));
insert into test_tbl values('abc', 1),('edf', 2),('xyz', 3);

drop procedure IF EXISTS pro_test_3;
delimiter //
create procedure pro_test_3()
begin
-- 方式 1
DECLARE cnt INT DEFAULT 0;

select count(*) into cnt from test_tbl;
select cnt;

-- 方式 2
set @cnt = (select count(*) from test_tbl);
select @cnt;

-- 方式 3
select count(*) into @cnt1 from test_tbl;
select @cnt1;

-- 多个列的情况下似乎只能用 into 方式
select max(status), avg(status) into @max, @avg from test_tbl;
select @max, @avg;
end
//
delimiter ;


call pro_test_3();

例:

求斐波那契数列的和S并输出。S=F(0)+F(1)+F(2)…+F(k),其中F(0)=0,F(1)=1,…F(n)=F(n-1)+F(n-2)(n>=2),k是emp表中工资(sal)小于3000的雇员总数(用查询语言得到)。

DELIMITER $$  
drop procedure if exists Fibonacci$$
CREATE PROCEDURE Fibonacci()
BEGIN
DECLARE i INT DEFAULT 2;

declare f int default 0;
declare a int default 0;
declare b int default 1;
declare s int default 0;
declare k int default 0;
select count(empno) into k
from emp
where sal <3000;
select k;
WHILE i <= k DO
set f = a+b;
set a = b;
set b = f;
set s =s + f;
set i =i + 1 ;
END WHILE;
SELECT k,s+1 AS result;
END$$
call Fibonacci();