当前位置: 首页 > 编程日记 > 正文

Oracle job procedure 存储过程定时任务

Oracle job procedure 存储过程定时任务

oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。

一、查询系统中的job,可以查询视图

--相关视图
select * from dba_jobs;
select * from all_jobs;
select * from user_jobs;
-- 查询字段描述
/*
字段(列)          类型                 描述
JOB                NUMBER          任务的唯一标示号
LOG_USER           VARCHAR2(30)    提交任务的用户
PRIV_USER          VARCHAR2(30)    赋予任务权限的用户
SCHEMA_USER        VARCHAR2(30)    对任务作语法分析的用户模式
LAST_DATE          DATE            最后一次成功运行任务的时间
LAST_SEC           VARCHAR2(8)     如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATE          DATE            正在运行任务的开始时间,如果没有运行任务则为null
THIS_SEC           VARCHAR2(8)     如HH24:MM:SS格式的this_date日期的小时,分钟和秒
NEXT_DATE          DATE            下一次定时运行任务的时间
NEXT_SEC           VARCHAR2(8)     如HH24:MM:SS格式的next_date日期的小时,分钟和秒
TOTAL_TIME         NUMBER          该任务运行所需要的总时间,单位为秒
BROKEN             VARCHAR2(1)     标志参数,Y标示任务中断,以后不会运行
INTERVAL           VARCHAR2(200)   用于计算下一运行时间的表达式
FAILURES           NUMBER     任务运行连续没有成功的次数
WHAT               VARCHAR2(2000)  执行任务的PL/SQL块
CURRENT_SESSION_LABEL RAW          MLSLABEL 该任务的信任Oracle会话符
CLEARANCE_HI          RAW MLSLABEL     该任务可信任的Oracle最大间隙
CLEARANCE_LO          RAW              MLSLABEL 该任务可信任的Oracle最小间隙
NLS_ENV               VARCHAR2(2000)   任务运行的NLS会话设置
MISC_ENV              RAW(32)          任务运行的其他一些会话参数 
*/
-- 正在运行job
select * from dba_jobs_running;
其中最重要的字段就是job 这个值就是我们操作job的id号,what 操作存储过程的名称,next_date 执行的时间,interval执行间隔

二、执行间隔interval 运行频率

描述                              INTERVAL参数值 
每天午夜12点                 TRUNC(SYSDATE + 1) 
每天早上8点30分             TRUNC(SYSDATE + 1) +8*60+30/(24*60) 
每星期二中午12点            NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24 
每个月第一天的午夜12点        TRUNC(LAST_DAY(SYSDATE ) + 1) 
每个季度最后一天的晚上11点     TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24 
每星期六和日早上6点10分        TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) +6×60+10/24×60)每秒钟执行次Interval => sysdate + 1/(24 * 60 * 60)如果改成sysdate + 10/(24 * 60 * 60)就是10秒钟执行次每分钟执行 
Interval => TRUNC(sysdate,'mi') + 1/ (24*60)如果改成TRUNC(sysdate,'mi') + 10/ (24*60) 就是每10分钟执行次每天定时执行 
例如:每天的凌晨1点执行 
Interval => TRUNC(sysdate) + 1 +1/ (24)每周定时执行 
例如:每周一凌晨1点执行 
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24每月定时执行 
例如:每月1日凌晨1点执行 
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24每季度定时执行 
例如每季度的第一天凌晨1点执行 
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24每半年定时执行 
例如:每年7月1日和1月1日凌晨1点 
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24每年定时执行 
例如:每年1月1日凌晨1点执行 
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

三、创建job方法

创建job, 
基本语法:declarevariable job number;
beginsys.dbms_job.submit(job => :job,what => 'prc_name;',next_date => to_date('22-11-2013 09:09:41', 'dd-mm-yyyy hh24:mi:ss'),interval => 'sysdate+1/86400');--每天86400秒钟,即一秒钟运行prc_name过程一次commit;
end;
使用dbms_job.submit方法过程,这个过程有五个参数:job、what、next_date、interval与no_parse。dbms_job.submit( 
job       OUT binary_ineger, 
What      IN  varchar2, 
next_date IN  date, 
interval  IN  varchar2, 
no_parse  IN  booean:=FALSE)job参数是输出参数,由submit()过程返回的binary_ineger,这个值用来唯一标识一个工作。一般定义一个变量接收,可以去user_jobs视图查询job值。 
what参数是将被执行的PL/SQL代码块,存储过程名称等。 
next_date参数指识何时将运行这个工作。 
interval参数何时这个工作将被重执行。 
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——true,默认值false。指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。

四、其他job相关的存储过程

在dbms_job这个package中还有其他的过程:broken、change、interval、isubmit、next_date、remove、run、submit、user_export、what;

大致介绍下这些过程:

1、broken()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。这个过程有三个参数:job 、broken与next_date。 
procedure broken ( job IN binary_integer, broken IN boolean, next_date IN date := SYSDATE 
) 
job参数是工作号,它在问题中唯一标识工作。 
broken参数指示此工作是否将标记为破——true说明此工作将标记为破,而false说明此工作将标记为未破。 
next_date参数指示在什么时候此工作将再次运行。此参数缺省值为当前日期和时间。job如果由于某种原因未能成功执行,oracle将重试16次后,还未能成功执行,将被标记为broken,重新启动状态为broken的job,有如下两种方式; 
a、利用dbms_job.run()立即执行该job 
begin dbms_job.run(:job) --该job为submit过程提交时返回的job number或是去dba_jobs去查找对应job的编号 
end;b、利用dbms_job.broken()重新将broken标记为false 
begin dbms_job.broken (:job, false, next_date) 
end;2、change()过程用来改变指定job的设置。 
这个过程有四个参数:job、what 、next_date、interval。 
procedure change ( job IN binary_integer, what IN varchar2, next_date IN date, interval IN varchar2 
) 
此job参数是一个整数值,它唯一标识此工作。 
what参数是由此job运行的一块PL/SQL代码块。 
next_date参数指示何时此job将被执行。 
interval参数指示一个job重执行的频度。3、interval()过程用来显式地设置重复执行一个job之间的时间间隔数。 
这个过程有两个参数:job、interval。 
procedure interval( job IN binary_integer, interval IN varchar2 
) 
job参数标识一个特定的工作。 
interval参数指示一个工作重执行的频度。4、isubmit()过程用来用特定的job号提交一个job。 
这个过程有五个参数:job、what、next_date、interval、no_parse。 
procedure isubmit ( job IN binary_ineger, what IN varchar2, next_date IN date, interval IN varchar2, no_parse IN booean := FALSE 
) 
这个过程与submit()过程的唯一区别在于此job参数作为IN型参数传递且包括一个由开发者提供的job号。如果提供的job号已被使用,将产生一个错误。5、next_date()过程用来显式地设定一个job的执行时间。这个过程接收两个参数:job、next_date。 
procedure next_date( job IN binary_ineger, next_date IN date 
) 
job标识一个已存在的工作。 
next_date参数指示了此job应被执行的日期、时间。6、remove()过程来删除一个已计划运行的job。这个过程接收一个参数: 
procedure remove(job IN binary_ineger); 
job参数唯一地标识一个工作这个参数的值是由为此工作调用submit()过程返回的job参数的值,已正在运行的job不能删除。7、run()过程用来立即执行一个指定的job。这个过程只接收一个参数: 
procedure run(job IN binary_ineger) 
job参数标识将被立即执行的工作。8、使用submit()过程,job被正常地计划。上面以讲述9、user_export()过程返回一个命令,此命令用来安排一个存在的job以便此job能重新提交。此程序有两个参数:job、my_call。 
procedure user_export( job IN binary_ineger, my_call IN OUT varchar2 
) 
job参数标识一个安排了的工作。 
my_call参数包含在它的当前状态重新提交此job所需要的正文。10、what()过程应许在job执行时重新设置此正在运行的命令。这个过程接收两个参数:job、what。 
procedure what ( job IN binary_ineger, what IN OUT varchar2 
) 
job参数标识一个存在的工作。 
what参数指示将被执行的新的PL/SQL代码。实现的功能:每隔一分钟自动向getSysDate表中插入当前的系统时间。

五、示例

/* 每10秒钟执行一次 插入一条时间 */-- 创建table
create table tab_time(current_time timestamp       
);-- 创建存储过程
create or replace procedure pro_job_print
asbegin--dbms_output.put_line('系统时间:' || to_char(sysdate, 'dd-mm-yyyy hh24:mi:ss'));insert into tab_time values(sysdate);end;-- 调用过程测试   
beginpro_job_print;   
end;--select 24 * 60 * 60 from dual;   -- 创建job
declare      job1 number;
begindbms_job.submit(job1, 'pro_job_print;', sysdate, 'sysdate+10/86400');--每10插入一条记录
end;--相关视图
select * from dba_jobs;
select * from all_jobs;
select * from user_jobs;
-- 正在运行job
select * from dba_jobs_running;-- 运行job
begindbms_job.run(26);--和select * from user_jobs; 中的job值对应,看what对应的过程
end; -- 查询是否插入数据
select to_char(current_time, 'dd-mm-yyyy hh24:mi:ss') current_time from tab_time order by current_time;-- 删除一个job
begindbms_job.remove(26);--和select * from user_jobs; 中的job值对应,看what对应的过程
end;      

六、关于设置job任务数量和控制并发

初始化相关参数job_queue_processes 
alter system set job_queue_processes = 39 scope = spfile;//最大值不能超过1000; 
job_queue_interval = 10; //调度作业刷新频率秒为单位job_queue_process 表示oracle能够并发的job的数量,sqlplus中可以通过语句 
show parameter job_queue_process; 来查看oracle中job_queue_process的值。select * from v$parameter;select name, description from v$bgprocess;当job_queue_process值为0时表示全部停止oracle的job,可以通过语句 
alter system set job_queue_processes = 10; 
来调整启动oracle的job。如果将job_queue_processes 的值设置为1的话,那就是串行运行,即快速切换执行一个job任务。

七、job不运行的大概原因

(1)、上面讲解了job的参数:与job相关的参数一个是job_queue_processes,这个是运行job时候所起的进程数,当然系统里面job大于这个数值后,就会有排队等候的,最小值是0,表示不运行job,最大值是1000,在OS上对应的进程时SNPn,9i以后OS上管理job的进程叫CJQn。可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。 
select * from v$bgprocess,这个paddr不为空的snp/cjq进程就是目前空闲的进程,有的表示正在工作的进程。 
另外一个是job_queue_interval,范围在1--3600之间,单位是秒,这个是唤醒JOB的process,因为每次snp运行完他就休息了,需要定期唤醒他,这个值不能太小,太小会影响数据库的性能。

先确定上面这两个参数设置是否正确,特别是第一个参数,设置为0了,所有job就不会自动运行了。(2)、使用下面的SQL查看job的的broken,last_date和next_date,last_date是指最近一次job运行成功的结束时间,next_date是根据设置的频率计算的下次执行时间,根据这个信息就可以判断job上次是否正常,还可以判断下次的时间对不对,SQL如下: 
select * from dba_jobs; 
有时候我们发现他的next_date是4000年1月1日,说明job要不就是在running,要不就是状态是break(broken=Y),如果发现job的broken值为Y,找用户了解一下,确定该job是否可以broken,如果不能broken,那就把broken值修改成N,修改再使用上面的SQL查看就发现它的last_date已经变了,job即可正常运行,修改broken状态的SQL如下:begin DBMS_JOB.BROKEN(<JOB_ID>, FALSE); 
end;(3)、使用下面的SQL查询是否job还在running 
select * from dba_jobs_running; 
如果发现job已经Run了很久了还没有结束,就要查原因了。一般的job running时会锁定相关的相关的资源,可以查看一下v$access和v$locked_object这两个view。如果发现其他进程锁定了与job相关的object,包括package/function/procedure/table等资源,那么就要把其他进程删除,有必要的话,把job的进程也删除,再重新执行看看结果。(4)、如果上面都正常,但是job还不run,怎么办?那我们要考虑把job进程重启一次,防止是SNP进程死了造成job不跑,指令如下: 
alter system set job_queue_processes = 0; --关闭job进程,等待5--10秒钟 
alter system set job_quene_processes = 5; --恢复原来的值

(5)、Oracle的BUG:Oracle9i里面有一个BUG,当计数器到497天时,刚好达到它的最大值,再计数就会变成-1,继续计数就变成0了,然后计数器将不再跑了。如果碰到这种情况就得重启数据库,但是其他的Oracle7345和Oracle8i的数据库没有发现这个问题。(6)、数据库上的检查基本上就这多,如果job运行还有问题,那需要看一下是否是程序本身的问题,比如处理的资料量大,或者网络速度慢等造成运行时过长,那就需要具体情况具体分析了。我们可以通过下面的SQL手工执行一下job看看: begin dbms_job.run(<job>_ID) 
end; 
如果发现job执行不正常,就要结合程序具体分析一下。

相关文章:

Hadoop运行模式 之 伪分布式运行模式

什么是伪分布式模式&#xff1f;它与本地运行模式以及完全分布式模式有什么区别&#xff1f; 伪分布式的配置信息&#xff0c;完全是按照完全分布式的模式去搭建的&#xff0c;但是它只有一台服务器&#xff0c;可以用于学习和测试&#xff0c;真正的开发中不可以使用。 目录…

【C++】【一】结构体数组

demo7:函数份文件编写 swap.h #include <iostream> using namespace std;//函数的声明 void swap(int a, int b); swap.cpp #include "swap.h"//函数的定义 void swap(int a, int b) {int temp a;a b;b temp;cout << "a " << a …

Message、Handler、Message Queue、Looper之间的关系

2019独角兽企业重金招聘Python工程师标准>>> 在单线程模型下&#xff0c;为了解决线程通信问题&#xff0c;Android设计了一个通信机制。Message Queue(消息队列)&#xff0c; 线程间的通信可以通过Message Queue、Handler和Looper进行信息交换。下面将对它们进行逐…

在linux中只将“桌面”修改成“Desktop”而系统仍然使用中文

在安装好centos系统以后&#xff0c;它的Desktop&#xff0c;Downloads等文件夹都是中文的&#xff0c;桌面&#xff0c;下载等&#xff0c;这样在使用cd命令时特别不方便 解决方法一&#xff1a;下载一个中文输入法&#xff0c;安装 解决方法二&#xff1a; 修改il8n文件&a…

Zabbix 3.0 从入门到精通(zabbix使用详解)

第1章 zabbix监控 1.1 为什么要监控 在需要的时刻&#xff0c;提前提醒我们服务器出问题了 当出问题之后&#xff0c;可以找到问题的根源 网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性&#xff08;也称为可用性&#xff0c;英文描述为HA&#xff0c;High Avail…

MacBook如何用Parallels Desktop安装windows7/8

虽然MacBook真的很好用&#xff0c;不过在天朝的国情下&#xff0c;有很多软件还是仅支持IE和windows系统下才有。所以有必要为自己的MacBook装一个windows版本的系统&#xff0c;之前试过用Boot Camp来建立分区和安装win7&#xff0c;之后自己又用Parallels Desktop安装过win8…

在IDEA 中为Maven 配置阿里云镜像源

打开IntelliJ IDEA->Settings ->Build, Execution, Deployment -> Build Tools > Maven 注意要勾选上override 自己创建一个settings.xml文件&#xff0c; 内容如下 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http:/…

【匹配算法】渐进一致采样 PROSAC(PROgressive SAmple Consensus)

方法简介 渐进一致采样法1 (PROSAC) 是对经典的 RANSAC2 中采样的一种优化。相比经典的 RANSAC 方法均匀地从整个集合中采样&#xff0c;PROSAC 方法是从不断增大的最佳对应点集合中进行采样的。所以这种方法可以节省计算量&#xff0c;提高运行速度。 论文&#xff1a;https:…

阿里巴巴开源的 Blink 实时计算框架真香

Blink 开源了有一段时间了&#xff0c;竟然没发现有人写相关的博客&#xff0c;其实我已经在我的知识星球里开始写了&#xff0c;今天来看看 Blink 为什么香&#xff1f; 我们先看看 Blink 黑色版本&#xff1a; 对比下 Flink 版本你就知道黑色版本多好看了。 你上传 jar 包的时…

【地图API】收货地址详解2

上次讲解的方法是&#xff1a; 在地图中心点添加一个标注&#xff0c;每次拖动地图就获取地图中心点&#xff0c;再把标注的位置设置为地图中心点。可参考教程&#xff1a;http://www.cnblogs.com/milkmap/p/6126424.html 可能有开发者觉得&#xff0c;这个算法会有“延时”&am…

MATLAB【十三】————仿真函数记录以及matlab变成小结

part one&#xff1a;matlab 编程小结。 1.char 与string的区别&#xff0c;char使用的单引号 ‘’ &#xff0c;string使用的是双引号“”。 2.一般标题中的输出一定要通过 num2str 处理&#xff0c;画图具体的图像细节参考&#xff1a;https://blog.csdn.net/Darlingqiang/ar…

IDEA HDFS客户端准备

在此之前&#xff1a;先进行在IDEA 中为Maven 配置阿里云镜像源 1、将资料包中的压缩包解压到一个没有中文的目录下 2、配置HADOOP_HOME环境变量 3、配置Path环境变量 4、创建一个Maven工程HDFSClientDemo 5、在pom.xml中添加依赖 <dependencies><dependency><g…

12 Java面向对象之多态

JavaSE 基础之十二12 Java面向对象之多态 ① 多态的概念及分类 多态的概念&#xff1a;对象的多种表现形式和能力多态的分类  1. 静态多态&#xff1a;在编译期间&#xff0c;程序就能决定调用哪个方法。方法的重载就表现出了静态多态。  2. 动态多态&#xff1a;在程序运行…

MATLAB【十四】————遍历三层文件夹操作

文件夹遍历 clear; clc; close all;%% crop the im into 256*256 num 0; %% num1 内缩3个像素 num 2 内缩6个像素 load(qualitydata1.mat) load(qualitydata2.mat)[data1_m,data1_n] size(qualitydata1); [data2_m,data2_n] size(qualitydata2);%% read image_name …

LoadRunner监控Linux

有的linux机器上安装rpc后会保存如下&#xff1a; test -z "/usr/local/sbin" || mkdir -p -- . "/usr/local/sbin"/bin/install -c rpc.rstatd /usr/local/sbin/rpc.rstatd make[2]: Nothing to be done for install-data-am. make[2]: Leaving directory…

scala while循环中断

Scala内置控制结构特地去掉了break和continue&#xff0c;是为了更好的适应函数化编程&#xff0c;推荐使用函数式的风格解决break和contine的功能&#xff0c;而不是一个关键字。 如何实现continue的效果 Scala内置控制结构特地也去掉了continue&#xff0c;是为了更好的适应…

05-04-查看补丁更新报告

《系统工程师实战培训》 -05-部署补丁管理服务器 -04-查看补丁更新报告 作者&#xff1a;学 无 止 境QQ交流群&#xff1a;454544014///安装报表工具&#xff08;在100-Admin01上面安装如下工具&#xff0c;方便查看WSUS更新补丁报告!&#xff09;Microsoft System CLR Types f…

ISP【三】———— raw读取、不同格式图片差异

part zero: 如何处理.raw格式数据&#xff0c;读取和转化 matlab读取raw图 &#xff08;mark读取图片尺寸和位数均可设置&#xff0c;图片尺寸M,N&#xff0c;图片数据类型8bit,16bit改成uint16&#xff09; clear; clc; close all; % % rotpath imread(D:\matlab\ncc_ive…

深度学习 - 相关名词概念

2019独角兽企业重金招聘Python工程师标准>>> Neural Network 神经网络 Weights 权重 Bias 偏移 Activation Function 激活函数, 用于调整每个神经的输出, 有如下几个常用的函数种类 ReLU Sigmoid Optimizer 优化器 Adam Input Layer, Hidden Layer, Output Layer 输…

HDFS的API操作

准备工作&#xff1a;IDEA > HDFS客户端准备 目录 文件上传 文件下载 文件夹删除 修改文件名称 查看文件详情 文件和文件夹的判断 完整代码 文件上传 注意conf.set("dfs.replication","2");的位置&#xff0c;位置不一样&#xff0c;设置的副本…

微信小程序-锚点定位+内容滑动控制导航选中

之前两篇文章分别介绍了锚点定位和滑动内容影响导航选中&#xff0c;这里我们就结合起来&#xff0c;实现这两个功能&#xff01; 思路不再多说&#xff0c;直接上干货&#xff01; WXML <view class"navigateBox"><view class"title"><ima…

MATLAB【十四】————调用深度库生成exe,批量运行三层文件夹下图片,保存结果

运行路径&#xff1a;D:\matlab\cmd_batch_processing 文件夹架构&#xff1a; clear; clc; close all;%% crop the im into 256*256oriDataPath D:\matlab\cmd_batch_processing\data\; targetPathOri D:\matlab\cmd_batch_processing\result\;report_path D:\matlab\cm…

JDK1.8学习

2019独角兽企业重金招聘Python工程师标准>>> List<OrderGoodsDetail> olist BeanMapper.mapList(list,OrderGoodsDetail.class);List<String> list2 Arrays.asList("123", "45634", "7892", "abch", "s…

HDFS的数据流

目录 HDFS写数据流程 剖析文件写入 网络拓扑-节点距离计算 机架感知&#xff08;副本存储节点选择&#xff09; Hadoop2.7.2 副本节点选择 HDFS读数据流程 HDFS写数据流程 剖析文件写入 1&#xff09;客户端通过Distributed FileSystem模块向NameNode请求上传文件&#x…

Js----闭包

1、闭包的概念&#xff1a;(我找了很多&#xff0c;看大家的理解) A:闭包是指可以包含自由&#xff08;未绑定到特定对象&#xff09;变量的代码块&#xff1b; 这些变量不是在这个代码块内或者任何全局上下文中定义的&#xff0c;而是在定义代码块的环境中定义&#xff08;局部…

【C++】【四】企业链表

// 企业链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // 链表改进版 企业常用#include <iostream> #include<stdlib.h>//链表小节点 不包含数据域 typedef struct linknode {struct linknode* next; }linknode; //链表节点 数据指…

GoldenGate的Logdump工具使用简介

Logdump工具是GoldenGate提供的一个用于查询、分析、过滤、查看和保存存储在trail文件或extract文件中的数据的工具。1、启动Logdump工具[oraclerhel6 ~]$ cd /ogg [oraclerhel6 ogg]$ ./logdumpOracle GoldenGate Log File Dump Utility for Oracle Version 12.2.0.1.1 OGGCOR…

scala惰性函数

惰性计算&#xff08;尽可能延迟表达式求值&#xff09;是许多函数式编程语言的特性。惰性集合在需要时提供其元素&#xff0c;无需预先计算它们&#xff0c;这带来了一些好处。首先&#xff0c;您可以将耗时的计算推迟到绝对需要的时候。其次&#xff0c;您可以创造无限个集合…

计算机组成原理-第3章-3.1

|--总线&#xff1a;本质上就是一组连线&#xff0c;通路 |--发展过程&#xff1a; 分散连接时代&#xff1a; 运算器为中心 ↓ 存储器为中心 ↓ 中断&#xff0c;DMA的出现修正 ↓ 依旧无法解决效率问题 总线连接时代&#xff1a; 以CPU为核心&#xff0c;双总线&#xff1a;M…

【C++】【三】单向链表

// 单向链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include<stdlib.h>typedef struct LINKNODE {void* data;struct LINKNODE* next; }linknode;typedef struct LINKLIST {LINKNODE* head;int size; }lin…