--pl/sql3
DECLARE
-- 最基本的pl/sql 代码块
-- student;
s student%ROWTYPE;
BEGIN
select *
into s --返回的是一个单独的实例
from student
where sno='s001';
--开始
--在一个表里面有一个输出函数v
DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sage); --换行打印
END;
/
--异常
DECLARE
a number(10,0);
BEGIN
a:=100/0;
DBMS_OUTPUT.PUT_LINE('a='||a); --换行打印
END;
/
--有错误 : 除数不能位0
--如果我想正常运行 遇到除数为0 的时候我自动的处理和告警
-- 内置的异常处理
DECLARE
a number(10,0);
BEGIN
select id into a from sss;
a:=100/0;
DBMS_OUTPUT.PUT_LINE('a='||a); --换行打印
--可以添加异常
EXCEPTION --异常处理
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('当前遇到除数为0的异常,此处执行的是异常告警'); --换行打印
END;
/
--自定义的异常处理
DECLARE
a number(10,0);
b number(10.0);
b_is_zero exception;
BEGIN
b:=0;
if b <= 0 THEN
-- 做出异常告警
RAISE b_is_zero;
END if;
a:=100/b;
DBMS_OUTPUT.PUT_LINE('a='||a); --换行打印
--可以添加异常
EXCEPTION --异常处理
WHEN b_is_zero THEN
DBMS_OUTPUT.PUT_LINE('当前的b=0'); --换行打印
-- ROLLBACK;
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('当前遇到除数为0的异常,此处执行的是异常告警'); --换行打印
END;
/
DECLARE
a number(10,0);
b number(10.0);
b_is_zero exception;
test_exc exception;
BEGIN
b:=-1;
a:=20;
if (a*b)<= 0 THEN
-- 做出异常告警
RAISE test_exc;
END if;
DBMS_OUTPUT.PUT_LINE('a='||a); --换行打印
--可以添加异常
EXCEPTION --异常处理
WHEN test_exc THEN
DBMS_OUTPUT.PUT_LINE('当前ab的乘积是负数');
WHEN b_is_zero THEN
DBMS_OUTPUT.PUT_LINE('当前的b=0'); --换行打印
-- ROLLBACK;
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('当前遇到除数为0的异常,此处执行的是异常告警'); --换行打印
END;
/
--函数
create table --创建表
/*
y=f(x)
y: 返回值
x: 参数
*/
-- function
create or replace function test(v_s_no in varchar2)
return varchar2 is
DECLARE
-- 最基本的pl/sql 代码块
-- student;
s student%ROWTYPE;
string varchar2(1000);
BEGIN
select *
into s --返回的是一个单独的实例
from student
where sno=v_s_no;
--开始
--在一个表里面有一个输出函数v
-- DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
-- DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
-- DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
-- DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sage); --换行打印
string:='{
"sites": [
{ "学生姓名:":"'
||s.sname||
'" },
{ "学生性别:":"'
||s.ssex||
'" },
{ "学生年龄:":"
'||s.sage||'
" },
{ "学生学号:":"
'||s.sage||'
" }
]
}';
return string;
END;
/
--
create or replace function functionname( * )
return returnname
/*
or replace : 如果函数存在 就直接覆盖
*/
create or replace function function1(q in number , f in number)
return number
is
BEGIN
if q>10 THEN
return (q*f);
else
return(100);
end if;
END;
/
-- 根据sage 算出学生的出生年份
create or replace function n_sage(sage in number)
return number
is
BEGIN
return (2020-sage);
END;
/
-- 使用函数
select * from student;
select SNO,SNAME,SAGE,SSEX,n_sage(SAGE) from student;
-- 删除函数
drop function functionname;
drop function to_json;
create or replace function to_json(v_sno in varchar2)
return varchar2
is
-- 最基本的pl/sql 代码块
-- student;
s student%ROWTYPE;
string varchar2(1000);
BEGIN
select *
into s --返回的是一个单独的实例
from student
where sno=v_sno;
--开始
--在一个表里面有一个输出函数v
DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sno); --换行打印
string:='{"student": [
{ "学生姓名:":"'||s.sname||'" },
{ "学生性别:":"'||s.ssex||'" },
{ "学生年龄:":"'||s.sage||'" },
{ "学生学号:":"'||s.sno||'" }
]
}';
return string;
END;
/
/*
create : 创建
or replace :如果遇到同名函数删除原来的函数重新创建
function : 函数的关键字
to_json(v_sno in varchar2): 函数名(形参名称 in 形参的类型)
return varchar2 : 返回值 返回值类型
is
-- 最基本的pl/sql 代码块
-- student;
s student%ROWTYPE; : 创建了一共student的变量s
string varchar2(1000); : 创建了一共长度为1000 类型为vachar 的变量 string
BEGIN : 开始
select *
into s --返回的是一个单独的实例
from student
where sno=v_sno;
--开始
-- 执行的函数
--where sno=v_sno; : sno 是表的学号 v_sno 是传进来的学生学号
--在一个表里面有一个输出函数v
-- DBMS_OUTPUT.PUT_LINE('学生姓名:'||s.sname); --换行打印
-- DBMS_OUTPUT.PUT_LINE('学生性别:'||s.ssex); --换行打印
-- DBMS_OUTPUT.PUT_LINE('学生年龄:'||s.sage); --换行打印
-- DBMS_OUTPUT.PUT_LINE('学生学号:'||s.sno); --换行打印
string:='{"student": [
{ "学生姓名:":"'||s.sname||'" },
{ "学生性别:":"'||s.ssex||'" },
{ "学生年龄:":"'||s.sage||'" },
{ "学生学号:":"'||s.sno||'" }
]
}';
-- 拼接字符串变成 josn格式数据
return string;
--返回值
END;
/
*/
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE( to_json('s001'));
end;
/