Oracle_函数_触发器_游标_存储过程_视图 ---PL/SQL语言部分 --PL.SQL基本格式: --declare --声明部分--一切变量和常量在此声明 --begin -- --主体,执行语句 --end; declare i number(3); begin --给变量赋值 i:=1; dbms_output.put_line(i的值是:||i); end;
Oracle_函数_触发器_游标_存储过程_视图
---PL/SQL语言部分 --PL.SQL基本格式: --declare --声明部分--一切变量和常量在此声明 --begin -- --主体,执行语句 --end; declare i number(3); begin --给变量赋值 i:=1; dbms_output.put_line('i的值是:'||i); end; --声明常量 declare i constant varchar2(20):='我是摩纳哥鞑子'; begin dbms_output.put_line(i); end; select * from scott.emp; --删除一条记录 declare eno varchar2(5); begin eno:=7369; delete scott.emp where empno=eno; end; --新增一条记录 declare eno varchar2(5):=110; ena varchar2(20):='周星星'; ejob varchar2(30):='影帝'; mgr number(4):=7369; hir date:='3-1月-2011'; sals number(10):=10000; com number(20):=100; dep number:=10; begin insert into scott.emp values(eno,ena,ejob,mgr,hir,sals,com,dep); end; --查询数据 declare eno number(3); ena varchar2(10); begin eno:=110; select ename into ena from scott.emp where empno=eno; dbms_output.put_line('ena的值是:'||ena); end; --显示所有的记录 declare eno varchar2(5):=110; ena varchar2(20); ejob varchar2(30); mgr number(10); hir date; sals number(10); com number(20); dep number(10); begin select empno,ename,job,mgr,hiredate,sal,comm,deptno into eno,ena,ejob,mgr,hir,sals,com,dep from scott.emp where empno=eno; dbms_output.put_line(eno||','||ena||','||ejob||','||mgr||','||hir||','||sals||','||com||','||dep); end; --使用一行简化我们的查询操作 --%rowtype,返回行的数据类型 declare emps scott.emp% rowtype; begin select * into emps from scott.emp where empno=110; dbms_output.put_line(emps.ename||','||emps.job); end; --%type declare enames scott.emp.ename% type; begin select ename into enames from scott.emp where empno=110; dbms_output.put_line(enames); end; --条件控制语言 --if--then--else --if--then--else if--else if --else-- --有多少个if就给多少end if 结束 declare i number:=2; begin if(i>4) then dbms_output.put_line('逻辑正确'); else dbms_output.put_line('逻辑不正确'); endif; end; --查询scott.emp 表中的数据,如果工资低于3000就加2000 --如果低于4000就只加500 --如果高于5000就扣除200 declare emp number(5):=110; esal number(10); begin select sal into esal from scott.emp where empno=emp; if(esal update scott.emp set sal=sal+2000; else if(esal>5000) then update scott.emp set sal=sal-200; end if; end if; select sal into esal from scott.emp where empno=emp; dbms_output.put_line(esal); end; --case declare i number(2):=1; begin case i when1 then dbms_output.put_line('i的值是1'); when 2 then dbms_output.put_line('i的值是2'); when 3 then dbms_output.put_line('i的值是3'); else dbms_output.put_line('没有匹配的值'); end case; end; --循环语句 --loop,for.while --简单的loop循环 declare i number(2):=1; begin loop if(i>10) then exit; --终止程序 end if; dbms_output.put_line(i); i:=i+1; end loop; end; --for循环 declare j number(2):=10; begin for i in1..j loop --for循环,不需要声明此处的变量i,范围采用".." dbms_output.put_line(i); end loop; end; --while 循环 declare k number(2):=1; begin while (k dbms_output.put_line(k); k:=k+1; end loop; end; --异常的处理 --预定义异常 --用户自定义异常 declare invalied EXCEPTION; categroy varchar2(10); begin categroy :='tt'; if categroy not in('沈水','林下','石小孟') then raise invalied; else dbms_output.put_line('你是:'||categroy); end if; exception when invalied then dbms_output.put_line('你输入的不匹配'); end; declare j number(2):=10; begin for i in1..j loop --for循环,不需要声明此处的变量i,范围采用".." dbms_output.put_line(i); end loop; end; /* * ** *** **** ***** */
declare begin for i in0..5 loop for j in0..i loop dbms_output.put('*'); end loop; dbms_output.new_line; end loop; end; select * from scott.emp |
存储过程
--存储过程 create or replace procedure test_pro as begin declare i number(3):=1; begin dbms_output.put_line(i); end; end; execute test_pro;--在sqlplus里执行 --在sql里执行存储过程 begin test_pro; end; --带参数的存储过程 create or replace procedure get_par(i innumber) as begin dbms_output.put_line(i); end; begin get_par(2012); end; --根据学生id查询某学生名 create or replace procedure get_stu(stu_id innumber) is stuname varchar2(28); begin select s_name into stuname from student where s_id =stu_id; dbms_output.put_line(stuname); exception when no_data_found then dbms_output.put_line('查无此人'); end; begin get_stu(1); end; --带有输入输出参数的存储过程 --根据学生id来查询学生姓名 create or replace procedure get_stu(stu_id in number,stuname in out varchar2) as begin select username into stuname from user_tb where userid =stu_id; dbms_output.put_line(stuname); exception when no_data_found then dbms_output.put_line('查无此人'); end; declare stuname varchar2(30); begin get_stu(1,stuname); end; ******************************************************* --模拟登录与注册 create table usertb( userid number primary key, username varchar2(30), userpwd varchar2(30) ) create or replace procedure login_pros(uname in out varchar2,pwd in out varchar2,islogin in out boolean) as begin select username,userpwd into uname,pwd from usertb where username=uname and userpwd=pwd; islogin:=true; exception when no_data_found then dbms_output.put_line('用户没有注册'); islogin:=false; end; --执行登录的存储过程 declare uname varchar2(30):='李冰冰'; pwd varchar2(30):='abc'; islogin boolean; begin login_pros(uname,pwd,islogin); if(islogin) then dbms_output.put_line('登录成功,'||'登录的用户是'||uname); else dbms_output.put_line('登录失败'||'请重新注册'); end if; end; --注册 create or replace procedure regist_pros(uname in out varchar2,pwd in out varchar2,userid in number,isregist out boolean) as begin insert into usertb values(userid,uname,pwd); isregist:=true; dbms_output.put_line('注册成功'||'注册用户是:'||uname); exception when no_data_found then dbms_output.put_line('您输入的用户信息是否正确'); isregist:=false; end; --注册的存储过程的调用 declare uname varchar2(30):='李冰冰'; pwd varchar2(30):='abc'; userid number(10):=3; isregist boolean; begin regist_pros(uname,pwd,userid,isregist); if(isregist) then dbms_output.put_line('注册的用户是:'||uname); else dbms_output.put_line('是否重新注册'); end if; end; |
视图
--视图 create view emp_view as select * from usertb; --删除视图中的字段,会影响到住表中的数据 delete from emp_view where userid=2; --对视图进行更新 update emp_view set username='李斯' where userid=2; |
触发器
--触发器 --触发器对select不起作用 create or replace trigger delete_tir after delete on scott.emp begin dbms_output.put_line('删除一条语句'); end; alter trigger delete_tir disable; delete from scott.emp where empno=110; create or replace trigger update_tri before update on scott.emp begin dbms_output.put_line('更新一条语句'); end; update scott.emp set sal=9000 where empno=7499; --对scott.emp表进行插入数据的时候,也同时将此数据插入到 create table emptest( eno number(20) primary key, enames varchar2(30), jobs varchar2(30), mgrs number(10), hiretime date, sals number(10), comms number(10), dept_no number(10) ) --在删除之前执行,在删除之前打印即将删除学生的信息 --删除之前执行用":old",更新之前执行用":new"; create or replace trigger stu_delete_prinStu before deleteon tb_stu for each row begin dbms_output.put_line('即将删除的学生学号是:'||:old.stu_no); dbms_output.put_line('即将删除的学生姓名是:'||:old.stu_name); end; delete from tb_stu where stu_no=6; create or replace trigger new_tri before insert on scott.emp for each row begin insert into emptest values(:new.empno,:new.ename,:new.job,:new.mgr,:new.hiredate,:new.sal,:new.comm,:new.deptno); end; insert into scott.emp values(11,'OFFICELADY','SALE',7698,'1-5月-2011',29000,3000,20); --对表进行删除操作后的记录 create or replace trigger old_tri after delete on scott.emp for each row begin dbms_output.put_line('删除的用户是:'||:old.ename); end; delete from scott.emp where empno=11; --before和after --行级触发器,语句级触发器 (for each row) --行级触发器对DML语句影响每一行的操作,例如update语句,有多少条语句,触发器就会被执行多少次 --语句级触发器对我们的DML语句只执行一次操作,例如insert语句,即使有多条,触发器只被执行一次 --before表示在语句执行之前出发 --after表示在语句执行之后进行出发 --实际看到的效果没有什么区别 --禁用触发器,启用触发器 alter trigger new_tri disable; alter trigger old_tri enable; --禁用一个表中所有触发器 alter table tb_stu disable all triggers; --删除触发器 drop trigger new_tri; select * from scott.emp; select * from lu.emptest |
函数
--定义一个函数实现加法运算 create or replace function myAdd(num1 number,num2 number) return number--在规则说明中需要return --只能够返回一个值(和声明的返回类型匹配) --需要return关键字来返回值 --函数不能单独的被调用,只能作为sql代码的一部分来执行 as num3 number; begin num3:=num1+num2; return num3; end; --调用函数:函数不能单独的被调用,需要作为sql一部分来调用 declare n number; begin n:=myAdd(12,34); dbms_output.put_line(n); end; --定义一个函数,查询emp 将所有的信息打印到output --并且计算出所有员工的工资总和,返回工资总和 --函数和存储过程一样,在定义的时候如果没有参数就不需要"()" create or replace function getMsg return number as cursor emp_msg is select * from scott.emp; totalSal number; begin for e in emp_msg loop dbms_output.put_line(e.ename||'-'||e.sal); end loop; select sum(sal) into totalSal from scott.emp; return totalSal; end; --调用函数 select getMsg() from dual; |
包
--定义一个包的说明部分 (类似接口) create or replace package my_package is procedure myProc; function myAdd(m number,n number)return number; end my_package; --定义一个人包的主题部分(类似程序体DAO) create or replace package body my_package is procedure myProc is cursor emp_msg isselect * from scott.emp; begin for e in emp_msg loop dbms_output.put_line(e.ename); endloop; end; function myAdd(m number,n number) return number as num number; begin num:=n+m; return num; end; end my_package; call my_package.myProc(); select my_package.myAdd(1,2) 结果 from dual; |

MySQL和SQLite的主要区别在于设计理念和使用场景:1.MySQL适用于大型应用和企业级解决方案,支持高性能和高并发;2.SQLite适合移动应用和桌面软件,轻量级且易于嵌入。

MySQL中的索引是数据库表中一列或多列的有序结构,用于加速数据检索。1)索引通过减少扫描数据量提升查询速度。2)B-Tree索引利用平衡树结构,适合范围查询和排序。3)创建索引使用CREATEINDEX语句,如CREATEINDEXidx_customer_idONorders(customer_id)。4)复合索引可优化多列查询,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。5)使用EXPLAIN分析查询计划,避

在MySQL中使用事务可以确保数据一致性。1)通过STARTTRANSACTION开始事务,执行SQL操作后用COMMIT提交或ROLLBACK回滚。2)使用SAVEPOINT可以设置保存点,允许部分回滚。3)性能优化建议包括缩短事务时间、避免大规模查询和合理使用隔离级别。

选择PostgreSQL而非MySQL的场景包括:1)需要复杂查询和高级SQL功能,2)要求严格的数据完整性和ACID遵从性,3)需要高级空间功能,4)处理大数据集时需要高性能。PostgreSQL在这些方面表现出色,适合需要复杂数据处理和高数据完整性的项目。

MySQL数据库的安全可以通过以下措施实现:1.用户权限管理:通过CREATEUSER和GRANT命令严格控制访问权限。2.加密传输:配置SSL/TLS确保数据传输安全。3.数据库备份和恢复:使用mysqldump或mysqlpump定期备份数据。4.高级安全策略:使用防火墙限制访问,并启用审计日志记录操作。5.性能优化与最佳实践:通过索引和查询优化以及定期维护兼顾安全和性能。

如何有效监控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。1.使用mysqladmin查看连接数。2.用SHOWGLOBALSTATUS查看查询数。3.PMM提供详细性能数据和图形化界面。4.MySQLEnterpriseMonitor提供丰富的监控功能和报警机制。

MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显着差异,选择时需考虑项目规模和未来扩展性。

在需要高可用性、高级安全性和良好集成性的企业级应用场景下,应选择SQLServer而不是MySQL。1)SQLServer提供企业级功能,如高可用性和高级安全性。2)它与微软生态系统如VisualStudio和PowerBI紧密集成。3)SQLServer在性能优化方面表现出色,支持内存优化表和列存储索引。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),