学习大数据DAY16 PLSQL基础语法5
目录
异常
自定义异常的格式
raise_application_error
处理异常
预定义异常
SQLcode和SQLerrm
非预定义异常
作业
触发器
触发器基本概念
DML触发器
DML触发器使用
instead of 触发器
管理触发器
作业2
函数、过程和包
函数
过程
参数
1. in 参数
2.out 参数
3. in out 参数
函数和过程的区别
过程优点
过程缺点
作业3
遗忘点复习
后面预告
异常
在PL/SQL中系统错误都由程序异常统一对待。一个异常一般属于以下情况:
●系统错误(内存溢出,索引重复)
●用户动作导致的错误
●应用程序向用户发出的警告
异常分成三大类:预定义异常、非预定义异常、自定义异常
处理方法分为:直接抛出异常、内部块处理异常、游标处理异常
预定义异常:由PL/SQL定义的异常。由于它们已在standard包中预定义了,因此,这些预定义异常可以直接在程序中使用,而不必再定义部分声明。
非预定义异常:用于处理预定义异常所不能处理的Oracle错误。
自定义异常:用户自定义的异常,需要在定义部分声明后才能在可执行部分使用。用户自定义异常对应的错误不一定是Oracle错误,例如它可能是一个数据错误。
三种异常中,预定义与非预定义异常都与Oracle错误有关,并且由Oracle隐含自动抛出,而自定义异常与Oracle错误没有任何关联,由开发人员为特定情况所定义的异常,需要显式抛出(raise)。
PL/SQL使用一个异常处理框架在跟踪并对错误进行响应。异常分为系统异常和程序员自定义异常。系统异常通常都有一个名称。自定义异常则使用exception_init指令给oracle指定名称,或使用raise_application_error 给这个错误指定错误编号和描述。
自定义异常的格式
声明异常
声明异常的格式:
异常名称 exception;
抛出异常
声明异常后在程序中抛出异常。
RAISE 异常名;
RAISE 包名.异常名称;
RAISE;
第一种是抛出当前块异常,第二种是抛出当前包异常,这种方式能够实现在包外进行异常的抛出。第三种不需要异常名称,用于在异常中抛出异常,实现异常传播的目的。
raise_application_error
该过程用于自定义错误信息,仅限数据库端子程序使用(过程、函数、包、触发器),不能在匿名块或客户端子程序中。
格式:
raise_application_error(error_number,mesage[,[true|false]]);
其中error_number定义错误号,必须是-20000到-20999之间的负整数;message指定错误信息,不长于2048字节; 第三个为可选参数,true则错误会被放在先前错误的堆栈中,false则替换先前所有错误,默认为false。
使用RAISE_APPLICATION_ERROR 抛出异常的好处在于可以给异常加上一段错误消息。
处理异常
当有异常抛出,当前代码块会终止执行,并跳转到异常处理单元,在异常处理单元
exception处理异常。
when 异常名称 [or 异常名称] then 处理语句;
when others then 处理语句;
预定义异常
Oracle根据程序可能报错的情况定义的一类异常,常见的Oracle预定义异常如下:
SQLcode和SQLerrm
sqlCode:是数据库操作的返回码。
sqlerrm:是数返回指定错误代码的错误信息。
在一个内在的异常中,SQLCODE返回Oracle错误的序号,而SQLERRM返回的是相应的错误消息,错误消息首先显示的是错误代码。SQLCODE返回的是负数,除非Oracle的错误为“ORA-01403:NO DATA FOUND”(译:ORA-01403:未找到数据),当Oracle错误为“ORA-01403:NO DATA FOUND”时,其对应的SQLCODE为+100。对于用户自定义的异常,SQLCODE返回的是+1,而SQLERRM返回的是User-Defined Exception。
sqlcode和sqlerrm是不能直接在sql语句中使用,必须先将其赋给变量后,才能在sql语句中使用
--预定义异常
declare
v_empno number;
begin
SELECT EMPNO INTO V_EMPNO from emp ;
exception
when TOO_MANY_ROWS then
dbms_output.put_line(sqlerrm||'-sql语句返回结果多余一行'||sqlcode);
end;
--多个异常
declare
v_empno number;
begin
SELECT EMPNO INTO V_EMPNO from emp where empno=2;
exception
when no_data_found then
dbms_output.put_line(sqlerrm ||'-啥也没有'||sqlcode);
when TOO_MANY_ROWS then
dbms_output.put_line(sqlerrm||'-sql语句返回结果多余一行'||sqlcode);
when others then
dbms_output.put_line(sqlerrm||'---------'||sqlcode);
end;
非预定义异常
非预定义异常用于处理与21个预定义异常无关的Oracle错误。 由于预定义异常只是与一部分Oracle错误相连的异常,所以如果要处理没有与预定义异常对应的Oracle错误时,则需要为这些Oracle错误声明相应的非预定义异常。
注意,通过exception_init,一个自定义异常只能和一个Oracle错误相连,在异常处理语句中, sqlcode和sqlerrm将返回这个Oracle错误的代码和消息文本,而不是返回用户自定义消息。
--非预定义异常
declare
errorsql exception ;
pragma exception_init(errorsql,-2291);
begin
update emp set deptno= 55 where empno=7499;
exception
when errorsql then
dbms_output.put_line(sqlerrm||'输入的部门编号有误,查无此部门'||sqlcode);
end;
--自定义异常
declare
v_sal number:=&输入工资;
lowersal exception ;--声明一个异常名称
begin
if v_sal <2000 then
raise lowersal ;--抛出异常
else update emp set sal =v_sal where empno=&员工编号;
end if;
exception
when lowersal then --处理异常
dbms_output.put_line('你给的工资太低了 ,社保局要调查你的');
end;
作业
第一题乱写的,第二题抄的课件,第三题自己认真写的。
--1.练习预定义异常,多个异常和其他异常declarev_empno number;beginSELECT EMPNO INTO V_EMPNO from emp ;exceptionwhen others thendbms_output.put_line('杂鱼~代码都不会写的杂鱼~'); end;--2.写一个触发员工表主键的非预定义异常declareerrorsql exception ;pragma exception_init(errorsql,-2291);beginupdate emp set deptno= 55 where empno=7499;exceptionwhen errorsql thendbms_output.put_line(sqlerrm||'输入的部门编号有误,查无此部门'||sqlcode);end;--3.输入员工编号和要修改的工资,如果工资低于3000则抛出自定义异常declarev_empno emp.empno%type:=&输入员工编号;v_sal emp.sal%type:=&输入要修改的工资;RowSal exception;beginif v_sal<3000 thenraise RowSal;elseupdate emp set sal=v_sal where empno=v_empno;end if;exceptionwhen RowSal thendbms_output.put_line('工资太低了,员工要活不下去啦!'); end;
触发器
触发器使用场景:
●对表的修改进行验证
●数据库的自我维护
●通过不同方式对数据库活动进行规范
触发器触发场景:
●dml语句触发
●ddl语句触发
●数据库事件触发(如登录、退出、启动和关闭)
●instead of 触发(针对视图操作)
●挂起触发(语句运行中遇到空间问题挂起后触发)
触发器基本概念
before触发器:在触发场景执行前执行触发器语句
after触发器:在触发场景执行后执行触发器语句
语句级别触发器:触发场景以语句为单位进行触发(一个语句只触发一次)
行级别触发器:触发场景以记录为单位进行触发(每影响一行记录触发一次)
伪记录new:触发场景触发后记录的值
伪记录old:触发场景触发前记录的值
when语句:通过判断条件执行触发器
DML触发器
dml触发器格式:
create or replace trigger 触发器名称
{before|after} --指明触发器实在语句执行前或之后进行处理
{insert|delete|update|update of 列名表} on 表名--指明触发器是在哪种DML语句中触发
[for each row]--指明语句会在处理每行记录是激活触发器,默认是只为整个语句激活一次
[when .....] --一个when语句来指明触发逻辑,避免一些错误执行
[declare]
触发器中禁用commit 、rollback。整个when语句需要用括号包裹,并且只能使用内置函
数,自定义函数无法引用,when语句只能用于行级别触发器,语句级无法使用when语
句。对于insert 语句,不存在 old伪记录;对于delete语句,不存在new伪记录。
DML触发器使用
DML触发器使用规范:
1. 触发器不接受参数。
2. 一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。
3. 在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。--索引--约束--序列--
4. 触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。
5. 在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。--隐式事务
6. 触发器中不能包含事务控制语句(TCL)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。
7. 在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。
8. 在触发器主体中不能申明任何clob和blob变量。新值new和旧值old也不能向表中的任何long和blob列。
9. 不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。
instead of 触发器
针对视图操作的触发器
instead of insert
instead of update
instead of delete
create or replace trigger test_emp_trigger
instead of insert on view_emp
for each row
begin
insert into emp values(:new.empno,:new.enmame,:new.job,:new.mgr,:new.hiredate,:new.sal,:new.comm,:new.deptno);
insert into dept values(:new.deptno,:new.dname,:new.loc);
end;
管理触发器
禁用触发器
alter trigger 触发器名称 disable;
激活触发器
alter trigger 触发器名称 enable;
删除触发器
drop trigger 触发器名称;
create or replace trigger dml_emp_trigger
before
update or delete or insert on emp
for each row
begin
if updating then
dbms_output.put_line('更新了一条记录,更新内容为: 员工编号'
||:new.empno||'员工姓名'||:new.ename||'员工职位'||:new.job);
elsif deleting then
dbms_output.put_line('删除了一条记录,删除内容为: 员工编号'
||:old.empno||'员工姓名'||:old.ename||'员工职位'||:old.job);
elsif inserting then
dbms_output.put_line('插入了一条记录,插入内容为: 员工编号'
||:new.empno||'员工姓名'||:new.ename||'员工职位'||:new.job);
end if;
end;
select * from emp;
insert into emp values('9899','test','sale',9999,sysdate,3333,444,10);
update emp set sal=990 where empno=9899;
delete from emp where empno=9899;
--添加到emplog日志表中
create table emplog
(
id number(8),
time date,
type varchar2(6),
empno number(4)
)
create sequence seq_emplog_1
start with 1000
seq_emplog_1.nextval
create or replace trigger dml_emp_trigger
before
update or delete or insert on emp
for each row
begin
if updating then
dbms_output.put_line('更新了一条记录,更新内容为: 员工编号'
||:new.empno||'员工姓名'||:new.ename||'员工职位'||:new.job);
insert into emplog values(seq_emplog_1.nextval,sysdate,'update',:new.empno);
elsif deleting then
dbms_output.put_line('删除了一条记录,删除内容为: 员工编号'
||:old.empno||'员工姓名'||:old.ename||'员工职位'||:old.job);
insert into emplog values(seq_emplog_1.nextval,sysdate,'delete',:old.empno);
elsif inserting then
dbms_output.put_line('插入了一条记录,插入内容为: 员工编号'
||:new.empno||'员工姓名'||:new.ename||'员工职位'||:new.job);
insert into emplog values(seq_emplog_1.nextval,sysdate,'add',:new.empno);
end if;
end;
insert into emp values('5555','test','sale',9999,sysdate,3333,444,10);
update emp set sal=990 where empno=5555;
delete from emp where empno=5555;
select * from emplog ;
作业2
第二题乱写的,可无视。
--1、创建触发器对emp表进行增删改操作create or replace trigger t_empbeforeinsert or update or delete on empfor each rowbeginif inserting thendbms_output.put_line('有人偷偷插入数据');elsif updating thendbms_output.put_line('有人偷偷修改数据'); elsif deleting thendbms_output.put_line('有人偷偷删除数据'); end;--2、把上面的记录添加到表emplog中create or replace trigger t_empbeforeinsert or update or delete on emplogfor each rowbeginif inserting thendbms_output.put_line('有人偷偷插入数据');elsif updating thendbms_output.put_line('有人偷偷修改数据'); elsif deleting thendbms_output.put_line('有人偷偷删除数据'); end;--3、查看oracle自带日志 (系统表:v$sql)select * from v$sql;
函数、过程和包
函数
所谓函数是通过 return语句而不是 out 或in out 参数返回数据的模块。和过程的调用不同的是,前者可以作为一个可执行语句单独存在,而函数只能作为一个可执行语句的一部分,如表达式中的元素或声明时赋值。
函数格式:
create or replace function 函数名称[参数,参数,参数....]
return 返回数据类型
is
--计算两个数的和
create or replace function getSum(n1 in number,n2 in number)
return number
is
he number(4);
begin
he:=n1+n2;
return he;
end;
select getSum(3,5)from dual;
select getSum(3,5),upper('ttt') from dual;
--根据输入日期输出星期几
create or replace function f_day(da in varchar2)
return varchar2
is
d date :=to_date(da,'yyyymmdd');
begin
return to_char(d,'day');
end;
select f_day('20220518') from dual;
过程
所谓过程就是执行一个或多个动作的块。由于在PL/SQL中对于过程的是一个单独的可执
行语句,一个PL/SQL代码中可以只有一个过程调用语句。
过程的格式:
create or replace procedure 过程名称 (参数,参数,参数)
is
可以有0个或多个返回值,通过out参数来返回结果
过程的调用:
call 过程名();
或
declare
begin
过程名();
end;
示例:
--无输入参数无输出参数
create or replace procedure p1
is
begin
dbms_output.put_line('我的第一个过程');
end;
call p1();
declare
begin
dbms_output.put_line('ttt');
p1();
end;
参数
存储过程作用:执行效率和SQL 代码封装
1. in 参数
用于接收参数,在子程序内部,不能进行修改。默认的参数模式:in
-- 声明存储过程
create or replace procedure pro_in(p_num in number)
is
begin
dbms_output.put_line(p_num);
-- p_num:=10;-- 添加此行编译报错,in 参数不能赋值
end ;
-- 调用
declare
test number:=1;
begin
pro_in(test);
dbms_output.put_line(test);
end;
结果: 输出 两个 1
2.out 参数
输出模式的参数,用于输出值,会忽略传入的值。在子程序内部可以对其进行修改。
调用时 参数需要使用变量.
-- 声明存储过程
create or replace procedure pro_out(p_num out number)
is
begin
dbms_output.put_line(p_num);
p_num:=10;
end;
-- 调用
declare
test number:=1;
begin
pro_out(test);
dbms_output.put_line(test);
end;
结果: 忽略输入的值,输出一个 空,和一个 10
3. in out 参数
能接收传入的实参值;在子程序内部可以修改,可以输出
调用时 参数需要使用变量.
-- 声明存储过程
create or replace procedure pro_in_out(p_num in out number)
is
begin
dbms_output.put_line(p_num);
p_num:=10;
end ;
-- 调用
declare
test number:=1;
begin
pro_in_out(test);
dbms_output.put_line(test);
end;
结果: 输出一个 1 和 一个 10
--输入empno返回ename
create or replace procedure getName(eno in number,name1 out varchar2)
is
n number(4);
begin
n:=9;
dbms_output.put_line(n);
select ename into name1 from emp where empno=eno;
end;
declare
name1 varchar2(10);
begin
getName(7499,name1);
dbms_output.put_line(name1);
end;
--三个输入参数和两个输出参数 返回两个值
create or replace procedure
p2(n1 in number,n2 in number,he out number,ji in out number)
is
begin
dbms_output.put_line(he);
dbms_output.put_line(ji);
he:=n1+n2;
ji:=n1*n2;
dbms_output.put_line(he);
dbms_output.put_line(ji);
end;
declare
he number(4);
ji number(4):=0;
begin
p2(3,5,he,ji);
select getSum(3,6) into he from dual;
dbms_output.put_line(he);
dbms_output.put_line(ji);
p1();
end;
--改造猴子吃桃代码1
create or replace procedure taozi
is
tao number(4):=1;
begin
for i in reverse 1..9
loop
tao:=(tao+1)*2;
end loop;
dbms_output.put_line(tao);
end;
call taozi();
--改造猴子吃桃代码2
create or replace procedure chitao1(tao in out number)
is
begin
for i in reverse 1..9
loop
tao:=(tao+1)*2;
end loop;
end;
declare
tao number(4):=1;
begin
chitao1(tao);
dbms_output.put_line(tao);
end;
函数和过程的区别
1、返回值的区别
函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有
2、调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用.
函数:一般情况下是用来计算并返回一个计算结果;
存储过程: 一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等)
过程优点
1、存储过程可以一次编译多次使用。 存储过程只在创建时进行编译,之后的使用都不需要重新编译,这就提升了 SQL 的执行效率。
2、可以减少开发工作量。将代码封装成模块,实际上是编程的核心思想之一,这样可以把复杂的问题拆解成不同的模块,然后模块之间可以重复使用,在减少开发工作量的同时,还能保证代码的结构清晰。
3、存储过程的安全性强。我们在设定存储过程的时候可以设置对用户的使用权限,这样就和视图一样具有较强的安全性。
4、可以减少网络传输量。因为代码封装到存储过程中,每次使用只需要调用存储过程即可,这样就减少了网络传输量。
5、良好的封装性。在进行相对复杂的数据库操作时,原本需要使用一条一条的 SQL 语句,可能要连接多次数据库才能完成的操作,现在变成了一次存储过程,只需要连接一次即可
过程缺点
基于上面这些优点,不少大公司都要求大型项目使用存储过程,比如微软、IBM 等公司。但是国内的阿里并不推荐开发人员使用存储过程,这是为什么呢?
存储过程虽然有诸如上面的好处,但缺点也是很明显的。
1、可移植性差。存储过程不能跨数据库移植,比如在 MySQL、Oracle 和 SQL Server 里编写的存储过程,在换成其他数据库时都需要重新编写。
2、调试困难。只有少数 DBMS 支持存储过程的调试。对于复杂的存储过程来说,开发和维护都不容易。虽然也有一些第三方工具可以对存储过程进行调试,但要收费。
3、存储过程的版本管理很困难。比如数据表索引发生变化了,可能会导致存储过程失效。我们在开发软件的时候往往需要进行版本管理,但是存储过程本身没有版本控制,版本迭代更新的时候很麻烦。
4、它不适合高并发的场景。高并发的场景需要减少数据库的压力,有时数据库会采用分库分表的方式,而且对可扩展性要求很高,在这种情况下,存储过程会变得难以维护,增加数据库的压力,显然就不适用了。
作业3
--1、函数输入一个日期,返回当前日期是星期几create or replace function selectday(daytime in varchar2)return varchar2isdd varchar2(10);begindd:=to_char(to_date(daytime,'yyyymmdd'),'day');return dd;end;declaredaytime varchar2(10):='&输入一个日期';n varchar2(10);beginn :=selectday(daytime);dbms_output.put_line(n); end;--2、函数实现输入一个字符串,返回一个倒序的字符串,改写上机练习4.5create or replace function reversestr(n in varchar2)return varchar2ism varchar2(100);beginfor i in reverse 1..length(n)loopm:=m||substr(n,i,1);end loop;return m;end;--3、写一个过程,输入员工编号,返回员工的工资和姓名create or replace procedure esn(v_empno in out number)istype names is record(ename emp.ename%type,sal emp.sal%type);v names;beginselect ename,sal into v from emp where empno=v_empno;dbms_output.put_line(v.ename||' '||v.sal); end;declarev_empno emp.empno%type:=&输入员工编号;beginesn(v_empno);end;/*4、写一个过程,输入一个部门编号,返回该部门工资最高的员工的员工编号,不考虑并列,用row_number开窗*/create or replace procedure des(v_deptno in out number)isv_empno emp.empno%type;beginselect empno into v_empno from(select row_number()over(partition by deptno order by sal desc) r,empno,deptno from emp) where r=1 and deptno=v_deptno;dbms_output.put_line(v_empno); end;declarev_deptno emp.deptno%type:=&输入部门编号;begindes(v_deptno);end;--5、把上面两个过程配合使用实现输入部门编号显示该部门的最高工资和人员姓名create or replace procedure des_and_esn(v_deptno in out number)isv_empno emp.empno%type;beginselect empno into v_empno from(select row_number()over(partition by deptno order by sal desc) r,empno,deptno from emp) where r=1 and deptno=v_deptno;esn(v_empno);end;declarev_deptno emp.deptno%type:=&输入部门编号;begindes_and_esn(v_deptno);end;select empno,ename from emp;--验证用
遗忘点复习
Substr(字符串,n,m) 第n位开始截取,第m位结束。
例:
Substr(‘aaaabbbccc’,-3,2) from dual 返回cc.
Substr(‘aaaabbbccc’,1,3) from dual 返回3个a.
要多敲代码,刷题的同时不要脱离理论的学习。
后面预告
相关文章:

学习大数据DAY16 PLSQL基础语法5
目录 异常 自定义异常的格式 raise_application_error 处理异常 预定义异常 SQLcode和SQLerrm 非预定义异常 作业 触发器 触发器基本概念 DML触发器 DML触发器使用 instead of 触发器 管理触发器 作业2 函数、过程和包 函数 过程 参数 1. in 参数 2.out 参…...

LabVIEW心电信号自动测试系统
开发了一种基于LabVIEW的心电信号自动测试系统,通过LabVIEW开发的上位机软件,实现对心电信号的实时采集、分析和自动化测试。系统包括心电信号采集模块、信号处理模块和自动化测试模块,能够高效、准确地完成心电信号的测量与分析。 硬件系统…...

最值得推荐的10款Windows软件!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频播放量破百万https://aitools.jurilu.com/1.音乐播放器——Dopamine Dopamine是一款音乐播放器,设计简洁美观。它支持多种音频格式,包括wav、mp3、ogg…...

游戏视频是后期配音好还是边录边配 游戏视频怎么剪辑制作才能火 视频剪辑免费软件
游戏视频后期配音是先配还是先剪?游戏视频后期配音没有统一的准则,可以先配,也可以后配,主要是根据内容而定。游戏视频剪辑在游戏玩家中十分流行,那么,游戏视频怎么剪辑制作?下面让我们以具体的…...

配置 Node.js 内存限制
配置 Node.js 内存限制 Node.js 应用程序通常需要配置堆内存的大小以优化性能和避免内存溢出问题。你可以通过命令行参数、环境变量或系统属性来设置 Node.js 的内存限制。下面将分别介绍在 Windows、Linux 和 macOS 系统下的配置方法。 Windows 系统 1. 命令行参数方式 在…...

ORA-12518: TNS: 监听程序无法分发客户机连接
ORA-12518: TNS: 监听程序无法分发客户机连接 OracleService 服务停止了,启动就好了...

2.5 计算机网络
声明:文章参考的《系统架构设计师教程(第二版)》,如有侵权,本人将立即修改和删除。 利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,并依靠网络软件以及通信协议实现…...

同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器
同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器 同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清…...

「ETL趋势」分区支持PostgreSQL、Greenplum、Gauss200, 定时任务支持Kettle
FineDataLink作为一款市场上的顶尖ETL工具,集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具,进行了新的维护迭代。本文把FDL4.1.9最新功能作了介绍,方便大家对比:(产品更新详情:…...

vue 前端项目调用后端接口记录
axios中不同的类型的请求附带数据使用的关键字 请求类型关键字示例GETparamsaxios({ method: get, url: example.com, params: { key: value } })POSTdataaxios({ method: post, url: example.com, data: { key: value } })PUTdataaxios({ method: put, url: example.com, dat…...

4.10、matlab生成脉冲序列:pulstran()函数
1、matlab生成脉冲序列简介 MATLAB生成脉冲序列通常涉及到使用MATLAB中的函数或编程来创建具有特定时间间隔和幅度的脉冲信号。脉冲序列通常用于数字信号处理、通信系统测试等应用中。 生成脉冲序列可以采用以下方法之一: 使用MATLAB中的函数,例如square()函数生成方波信号…...

【JAVA poi-tl-ext 富文本转word】
富文本转word 环境使用poi-tl-ext的原因富文本转word代码 环境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已经包…...

uniapp 小程序注册全局弹窗组件(无需引入,无需写标签)
由于uniapp没有开放根节点,所以一般情况下通过app.components注册,在需要的页面直接写组件标签,但是如果每个页面都需要的话,再每个都加的话会非常的麻烦 网上的思路都不咋地: 1.通过写一个透明弹窗页面来实现&#…...

python 语法学习 day 7
错题反思 1.九九乘法表 第一次提交的答案是:先把所有输入值放在列表里面 EOF,输入后产生异常-->>捕获异常,结束输入 3. 题意:统计单词的种类以及数量(忽略大小写),最终以降序输出(出现次数相同的单词根据单词的…...

【高中数学/幂函数】比较a=2^0.3,b=3^0.2,c=7^0.1的大小
【问题】 比较a2^0.3,b3^0.2,c7^0.1的大小 【解答】 a2^0.32^3/10(2^3)^1/108^1/10 b3^0.23^2/10(3^2)^1/109^1/10 c7^0.17^1/10 由于yx^1/10在x正半轴是增函数,底数大的得数就大。 因为9>8>7,所以b>a>c 【图像】 在图像上绘出曲线yx^1/10&…...

双向带头循环链表
一、概念 何为双向:此链表每一个节点的指针域由两部分组成,一个指针指向下一个节点,另一个指针指向上一个节点,并且两头的节点也是如此,头节点的下一个节点是尾节点,尾节点的上一个节点是头节点;…...

探索TASKCTL和 DataStage 的ETL任务调度协同
在复杂多变的企业环境中,高效、准确的数据处理是支撑业务决策与运营的核心。本文将深入探讨任务调度平台TASKCTL与ETL工具DataStage的深度融合,通过详尽的代码示例、结合细节以及实际案例的具体描述,展示这两个工具如何携手打造企业数据处理生…...

Facebook软体机器人与机器人框架:创新社交互动的未来
随着人工智能技术的不断进步,Facebook正通过软体机器人和先进的机器人框架,重新定义社交互动的未来。这些创新不仅提升了用户体验,也为开发者提供了强大的工具来构建下一代社交应用。 一、Facebook软体机器人:智能化的社交伙伴 …...

掌握音视频转换的艺术:用FFmpeg解锁多媒体的无限可能
在数字时代,音视频内容无处不在,从在线课程、娱乐视频到专业会议,它们都是信息传播的关键载体。然而,随着多媒体格式的不断演进,我们常常会遇到格式不兼容的问题,这成为了享受或处理这些内容的一大障碍。幸…...

C基础day9
一、思维导图 二、课后练习 1> 使用递归实现 求 n 的 k 次方 #include<myhead.h>int Pow(int n,int k) {if(k 0 ) //递归出口{return 1;}else{return n*Pow(n,k-1); //递归主体} }int main(int argc, const char *argv[]) {int n0,k0;printf("请输入n和k:&…...

32. 小批量梯度下降法(Mini-batch Gradient Descent)
在深度学习模型的训练过程中,梯度下降法是最常用的优化算法之一。我们前面介绍了批量梯度下降法(Batch Gradient Descent)和随机梯度下降法(Stochastic Gradient Descent),两者各有优缺点。为了在计算速度和…...

MySQL第八次作业
一、备份与恢复作业: 创库,建表: CREATE DATABASE booksDB; use booksDB; CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL ); CREATE TABLE authors …...

【合集】临时邮箱网站 临时邮箱API(持续更新)
众所周知,在注册一些账户时,比较常见的验证方式就是邮箱,但是在进行一些小众和不知名网站注册时,邮箱的泄露可能预示着不休止的邮件推送。尤其是当我们只是想临时使用邮箱这种情况,第二种,批量注册账号的情…...

职场新人感受
互联网职场感受 阶段介绍 24届6月底毕业生,之前从未实习过。 岗位是后端开发(JAVA),目前已经上班三周(前两周看文档和做了半个简单需求,第三周脱产新人培训)。 职场体验 职场和想象中的工作…...

Window 下Mamba 环境安装踩坑问题汇总及解决方法 (无需绕过selective_scan_cuda)
导航 Mamba 及 Vim 安装问题参看本人之前博客:Mamba 环境安装踩坑问题汇总及解决方法Linux 下Vmamba 安装教程参看本人之前博客:Vmamba 安装教程(无需更改base环境中的cuda版本)Windows 下 VMamba的安装参看本人之前博客…...

前端项目本地的node_modules直接上传到服务器上无法直接使用(node-sasa模块报错)
跑 jekins任务的服务器不能连接外网下载依赖包,就将本地下载的 node_modules直接上传到服务器上,但是运行时node-sass模块报错了ERROR in Missing binding /root/component/node_modules/node-sass/vendor/linux-x64-48/binding.node >> 报错信息类…...

Hadoop3:动态扩容之新增一台机器的初始化工作
一、需求描述 给Hadoop集群动态扩容一个节点 那么,这个节点是全新的,我们需要做哪些准备工作,才能将它融入集群了? 二、初始化配置 1、修改IP和hostname vim /etc/sysconfig/network-scripts/ifcfg-ens33 vim /etc/hostname2、…...

【正点原子i.MX93开发板试用连载体验】录音小程序采集语料
本文最早发表于电子发烧友论坛:【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 接下来就是要尝试训练中文提示词。首先要进行语料采集,这是一…...

【EasyExcel】动态替换表头内容并应用样式
1.定义实体类 import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ContentStyle; import com.alibaba.excel.metadata.BorderStyleEnum; import com.alibaba.excel.metadata.VerticalAlignmentEnum; import com.alibaba.excel.metadata.…...

RocketMQ实现分布式事务
RocketMQ的分布式事务消息功能,在普通消息基础上,支持二阶段的提交。将二阶段提交和本地事务绑定,实现全局提交结果的一致性。 1、生产者将消息发送至RocketMQ服务端。 2、RocketMQ服务端将消息持久化成功之后,向生产者返回Ack确…...