pl/sql(三)

--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;
/
每个人都是在努力的路上,别因为别人的误解而放弃,,术业有专攻,如是而已。
原文地址:https://www.cnblogs.com/16699qq/p/13153514.html