首页
关于
友链
Search
1
wlop 4K 壁纸 4k8k 动态 壁纸
1,553 阅读
2
Nacos持久化MySQL问题-解决方案
982 阅读
3
Docker搭建Typecho博客
771 阅读
4
滑动时间窗口算法
766 阅读
5
ChatGPT注册 OpenAI's services are not available in your country 解决方法
734 阅读
生活
解决方案
JAVA基础
JVM
多线程
开源框架
数据库
前端
分布式
框架整合
中间件
容器部署
设计模式
数据结构与算法
安全
开发工具
百度网盘
天翼网盘
阿里网盘
登录
Search
标签搜索
java
javase
docker
java8
springboot
thread
spring
分布式
mysql
锁
linux
redis
源码
typecho
centos
git
map
RabbitMQ
lambda
stream
少年
累计撰写
189
篇文章
累计收到
26
条评论
首页
栏目
生活
解决方案
JAVA基础
JVM
多线程
开源框架
数据库
前端
分布式
框架整合
中间件
容器部署
设计模式
数据结构与算法
安全
开发工具
百度网盘
天翼网盘
阿里网盘
页面
关于
友链
搜索到
189
篇与
的结果
2023-03-02
docker部署kafka
Docker部署Kafka一、拉取镜像docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka二、启动zookpeerdocker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper三、启动kafkadocker run -d --name kafka \ -p 9092:9092 \ -e KAFKA_BROKER_ID=0 \ -e KAFKA_ZOOKEEPER_CONNECT=192.168.56.10:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.56.10:9092 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka注意修改自己ip地址四、测试1、进入kafka容器docker exec -it kafka bash2、进入kafak脚本目录cd /opt/kafka_2.13-2.8.1/bin注意修改自己kafka版本3、创建主题kafka-topics.sh --create --zookeeper 192.168.56.10:2181 --replication-factor 1 --partitions 1 --topic topic_1 这里创建了一个topic_1主题。4、添加消息生产者发送消息kafka-console-producer.sh --broker-list 192.168.56.10:9092 --topic topic_1此时进入发送消息界面:5、消费消息消费者消费消息kafka-console-consumer.sh --bootstrap-server 192.168.56.10:9092 --topic topic_1 --from-beginning测试进入消费消息窗口:
2023年03月02日
245 阅读
0 评论
0 点赞
2023-02-02
ChatGPT注册 OpenAI's services are not available in your country 解决方法
OpenAI's services are not available in your country.chatGpt注册,OpenAI's services are not available in your country.解决方法。1、chatGpt注册打开chatpgt官网https://chat.openai.com/auth/login,点击Sign up注册,跳转至注册页面。2、邮箱验证最好使用gmail、outlook海外邮箱,注册。打开邮箱链接,即可验证。3、重新登录提示设置用户姓名4、手机号验证使用国内手机号会提示“OpenAI's services are not available in your country.”5、OpenAI's services are not available in your country解决方案:5.1、使用公共接码号码,但是基本都被使用过了。5.2、使用虚拟外海号码。6、虚拟外海号码1、注册账号打开官网https://sms-activate.org/注册,最好使用海外邮箱Gmail、Outlook。2、账号充值切换成中文,选择“充值”。选择支付宝充值选择充值1美元即可,大约6.46人民币。3、获取号码根据需求选择需要使用的服务类型、选择号码国家。这里注册chatgpt,直接搜索OpenAI即可。选择要使用的国家号码,这里选择的印度。填写要使用的数量,然后点后面的购物车后,右边会显示号码和一会接收到的验证码。复制号码到chatGpt注册时,验证手机号的地方,一会就可以看到验证码了。后面就可以直接注册成功chatgpt了。
2023年02月02日
734 阅读
0 评论
4 点赞
2022-12-11
mysql-5.7.33-winx64.zip安装
mysql-5.7.33-winx64.zip安装一、解压到安装目录二、编写配置文件my.ini将编写好的配置文件放到mysql-5.7.33-winx64根目录下。配置文件如下:[mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql的安装目录 basedir = D:\\tools\mysql-5.7.33-winx64 # 设置mysql数据库的数据的存放目录 datadir = D:\\tools\mysql-5.7.33-winx64\data # 允许最大连接数 max_connections=20 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB注意:1、修改自己安装路径 2、使用管理员权限执行下面的安装命令三、执行安装脚本使用管理员权限打开cmd命令工具,进入D:\tools\mysql-5.7.33-winx64\bin目录。执行安装:1、初始化,生成data文件夹.(建议使用,不设置root密码)mysqld --initialize-insecure 或者 mysqld --initialize(不建议使用,生成一个随机的root密码)2、安装MySql服务mysqld -install3、启动服务net start mysql4、设置mysql密码使用空密码进入mysql数据库,设置密码。set password for root@localhost = password('helloworld');5、环境变量配置打开电脑环境变量配置系统环境,PATH环境变量下,新增bing目录D:\tools\mysql-5.7.33-winx64\bin
2022年12月11日
179 阅读
1 评论
2 点赞
2022-12-08
Oracle 存储过程和函数
Oracle 存储过程和函数函数一般是工具性的东西。存储过程一般是一些操作。一、Oracle 自定义函数语法:Create function 函数名称 return 返回值类型 as Begin ... End 函数名称;示例:统计t_book记录数create or replace function getbookCount return number as begin declare bookNum number; begin select count(*) into bookNum from t_book; return bookNum; end; end getbookCount;函数调用set serveroutput on begin dbms_output.put_line('t_book表有:' || getbookCount() || '条记录'); end;输出结果:带参数的函数示例:create or replace function getBookSum(table_name varchar2) return number as begin declare sumCount number; count_sql varchar2(200); begin count_sql:='select count(*) from ' || table_name; execute immediate count_sql into sumCount; return sumCount; end; end getBookSum;带参函数调用set serveroutput on begin dbms_output.put_line('表有:' || getBookSum('t_booktype') || '条记录'); end;输出结果:二、Oracle 存储过程语法:Create procedure 存储过程名称 as Begin ... End 存储过程名称; In 只进不出 Out 只出不进 In out 可进可出参数In 只进不出示例:向t_book中添加数据。create or replace procedure addBook(bookname in varchar2, booktypeId in number,price in number) as begin declare maxId number; begin select max(id) into maxId from t_book; insert into t_book(id,bookname,type_id,price) values(maxId+1, bookname,booktypeId,price); commit;--自动提交 end; end addBook;存储过程调用execute 存储过程名称(参数1,参数2.。。);示例1:execute addBook('代码简洁之道',2,66);查询t_book结果:示例2:如果存在就不添加,没有记录才添加。create or replace procedure addCheckBook(boookn in varchar2, booktypeId in number,price in number) as begin declare maxId number; n number; begin select count(*) into n from t_book where bookname=boookn; if (n>0) then return; end if; select max(id) into maxId from t_book; insert into t_book(id,bookname,type_id,price) values(maxId+1, boookn,booktypeId,price); commit; end; end addCheckBook;调用存储过程execute addCheckBook('代码简洁之道2',2,66);此时已经存在,不在向t_book中添加记录。Out 只出不进示例1:返回添加记录前和添加记录后的总条数create or replace procedure addCheckBookCount(boookn in varchar2, booktypeId in number,price in number, befern out number, aftern out number) as begin declare maxId number; n number; begin select count(*) into befern from t_book; select count(*) into n from t_book where bookname=boookn; if (n>0) then return; end if; select max(id) into maxId from t_book; insert into t_book(id,bookname,type_id,price) values(maxId+1, boookn,booktypeId,price); select count(*) into aftern from t_book; commit; end; end addCheckBookCount;执行存储过程:execute用于执行单据。这里调用存储过程,需要单独调用:declare befern number; aftern number; begin addCheckBookCount('代码简洁之道3',2,66,befern,aftern); dbms_output.put_line('新增前条数:' || befern || '新增后条数:' ||aftern); end;输出结果:三、存储过程Debug1、打开调试,右键 Add debug information2、test调试, Test,然后进入调试界面。3、调试界面,输入参数4、开始调试5、查看参数鼠标放到对应参数上,即可显示当前值。四、程序包引入的目的,是为了有效的管理函数和存储过程,当项目模块很多的时候,用程序包管理就很有效了。语法:Create or replace package 包名 as 变量名称1 数据类型1; 变量名称2 数据类型2; ... ... Function 函数名称1(参数列表) return 数据类型1; Function 函数名称2(参数列表) return 数据类型2; ... ... Procedure 存储过程名称1(参数列表); Procedure 存储过程名称2(参数列表); ... ... End 包名;
2022年12月08日
159 阅读
0 评论
2 点赞
2022-12-07
Oracle 触发器
Oracle 触发器具备某些条件,由数据库自动执行的一些DML 操作行为。一、语句触发器语句触发器针对整个表,作用整个表操作。一般用于权限判断之类的。常用行触发器。语法结构Create trigger 触发器名称 Before/after 触发动作 On 作用对象触发器谓词:INSERTING、UPDATING、DELETING示例1:向t_book插入数据之前判断,用户是否有权限执行查询操作。创建语句触发器:create trigger tr_book before insert on t_book begin if user!='hello' then raise_application_error(-20001,'权限不足'); end if; end;执行插入数据:insert into t_book values(6,'ooo',2,68,'男');提示结果:修改触发器:create or replace trigger tr_book before insert on t_book begin if user!='SCOTT' then raise_application_error(-20001,'权限不足'); end if; end;重新执行插入数据即可插入。insert into t_book values(6,'ooo',2,68,'男');查询结果:注意:多个可以用or连接示例:create or replace trigger tr_book before insert or update or delete on t_book begin if user!='hello' then raise_application_error(-20001,'权限不足'); end if; end; before insert or update or delete:插入、修改、删除之前判断是否有权限。进行插入、修改、删除操作:insert into t_book values(7,'occcc',2,88,'男'); delete from t_book where id=1; update t_book set price=89 where id=1;此时都提示:示例2:在对t_book增删改之后记录日志到t_book_log表中。编写行触发器:create or replace trigger tr_book_log after insert or update or delete on t_book begin if inserting then insert into t_book_log values(user, 'insert', sysdate); else if updating then insert into t_book_log values(user, 'upate', sysdate); else if deleting then insert into t_book_log values(user, 'delete', sysdate); end if; end if; end if; end;分别执行增删改操作:insert into t_book values(8,'866',2,88,'男'); delete from t_book where id=8; update t_book set price=88 where id=1;此时t_book_log表中已经有记录了。select * from t_book_log;查询结果:注意:判断增删改用的不是insert、delte、update,而是inserting、updating、deleting。二、行触发器行触发器针对行记录。一般用于记录操作日志。语法结构Create trigger 触发器名称 Before/after 触发动作 For each row On 作用对象只是语句触发器多了一个For each row示例1:当修改t_book增加一条数据时,t_booktype对应的类型名称就改为t_book中新增的书名作为类型名。为插入数据前t_book\t_booktype表数据:编写行触发器:create or replace trigger tr_bookandtype after insert on t_book for each row begin update t_booktype set booktypename=:new.bookname where id=:new.type_id; end;注意:触发器内置变量:old 表示旧行记录。:new 表示新插入行记录。执行插入操作:insert into t_book values(8,'新增sql秘籍',2,55,'男');重新查看2表数据:可以看到,新增数据行8后,对应的typeid=2的类型名称改为书名了。示例2:当删除t_book一条数据后,将t_booktype中对应类型名称,改为被删除t_book记录中书名。create or replace trigger tr_bookdeltype after delete on t_book for each row begin update t_booktype set booktypename=:old.bookname where id=:old.type_id; end;注意:记录被删除了,所以可以用内置对象old.字段,获取删除记录的字段信息。t_book、t_booktype表原始数据:删除操作:delete from t_book where id=7;查看删除后t_book、t_booktype表数据:t_book中id=7记录已被删除。t_booktype中typename=www了。注意:一般行触发器用的较多。三、触发器禁用和开启禁用触发器alter trigger 触发器名称 disable启用触发器alter trigger 触发器名称 enable四、删除触发器drop trigger 触发器名称;五、修改触发器修改和其它修改视图、触发器、存储过程一样。create or replace只需要加上or replace
2022年12月07日
223 阅读
0 评论
2 点赞
2022-12-06
Oracle 游标
一、游标使用游标,我们可以对具体操作数据,比如查询的结果,对行,列数据进行更加细致的处理。以及对其他DML操作进行判断等操作;类似一个数据集合。1、语法declare cursor 游标名称 is 查询的sql;示例:declare cursor cu_book is select bookname,price from t_book;注意:游标默认是关闭的。2、打开右边open 游标名;示例:open cu_book;3、关闭游标close 游标名;示例:close cu_book;4、游标循环fetch 游标名 into 临时值1,临时值2...;循环将游标中的字段保存到临时值中。5、判断游标是否还有记录游标名%found二、示例set serverout on; --定义游标哦 declare cursor cu_book is select bookname,price from t_book; b_name varchar(20); b_price number; begin open cu_book; --打开游标 fetch cu_book into b_name,b_price; --循环游标取值 while cu_book%found loop --如果游标里面还有值就循环处理其它逻辑 dbms_output.put_line('书名:' || b_name || '价格' || b_price); fetch cu_book into b_name,b_price; end loop; close cu_book; end;输出结果:三、注意事项1、定义的游标默认是关闭的。2、while条件注意跳出。3、注意关闭游标。4、loop要有对应的end loop四、显示游标1、显示游标上面定义的临时变量的类型必须和游标里面查询表的字段类型一样,如果表的字段类型改了,定义的临时变量就会报错,类型不一样。因此就出现了显示游标。定义: 临时变量名 表明.字段名%type;上面一中示例改进成显示游标:set serverout on; --定义游标哦 declare cursor cu_book is select bookname,price from t_book; b_name t_book.bookname%type; b_price t_book.price%type; begin open cu_book; --打开游标 fetch cu_book into b_name,b_price; --循环游标取值 while cu_book%found loop --如果游标里面还有值就循环处理其它逻辑 dbms_output.put_line('书名:' || b_name || '价格' || b_price); fetch cu_book into b_name,b_price; end loop; close cu_book; end;输出结果:2、字段类型表示表中字段数据类型。%type3、行类型表示表中一行数据类型。%rowtype示例:set serverout on; --定义游标哦 declare cursor cu_book is select * from t_book; book t_book%rowtype; -- 行类型 begin open cu_book; --打开游标 fetch cu_book into book; --循环游标取值 while cu_book%found loop --如果游标里面还有值就循环处理其它逻辑 dbms_output.put_line('书名:' || book.bookname || '价格' || book.price); fetch cu_book into book; end loop; close cu_book; end;注意:1、游标数据变成select * 查询全部了。2、fetch循环游标时,是将游标里面记录复制到定义的book行类型变量里面了。3、取值时,是用行类型变量.字段名取值。输出结果:五、隐式游标不用显示定义游标,但是显示的功能更强大。1、DML 执行过程中为真,结束后为假SQL%ISOPEN 布尔型DML 执行过程中为真,结束后为假示例:begin if sql%isopen then dbms_output.put_line('游标打开的'); else dbms_output.put_line('游标未打开'); end if; end;输出结果:2、DML 语句成功执行的数据行数SQL%ROWCOUNT 整型代表DML 语句成功执行的数据行数示例:declare b_count number; begin select count(*) into b_count from t_book; dbms_output.put_line('游标捕获行数:'|| sql%rowcount); end;输出结果:只成功执行了一次DML查询操作。示例2:begin update t_book set bookname='xxxx' where id=11111; if sql%rowcount=1 then dbms_output.put_line('执行修改成功'); else dbms_output.put_line('未执行成功'); end if; end;输出结果:未成功,因为没有id=11111的记录。修改id=1,重新执行;begin update t_book set bookname='xxxx' where id=1; if sql%rowcount=1 then dbms_output.put_line('执行修改成功'); else dbms_output.put_line('未执行成功'); end if; end;修改成功,因为有id=1的记录,成功执行修改了的。3、插入、删除、更新或单行查询操作成功SQL%FOUND 布尔型值为TRUE 代表插入、删除、更新或单行查询操作成功4、与SQL%FOUND 属性返回值相反SQL%NOTFOUND 布尔型与SQL%FOUND 属性返回值相反六、动态游标1、定义强类型动态游标declare type 类名 is ref cursor return 表明%rowtype;2、定义一个动态游标对象游标对象 类名;示例:查询表中是否有"jvm并发"的书,如果有就输出改记录信息,没有则查询全部记录,并输出。--定义一个booktype类似一个类 declare type booktype is ref cursor return t_book%rowtype; --定义一个动态游标对象 cu_book booktype; --返回行数 b_count number; --定义一个行类型变量 b_rowdata t_book%rowtype; begin select count(*) into b_count from t_book where bookname='jvm并发1'; --如果没有查到JVM并发这本书,就查询全部记录,保存到动态游标中。 if b_count=0 then open cu_book for select * from t_book; --注意打开游标 else open cu_book for select * from t_book where bookname='jvm并发'; end if; --循环游标将每条记录,保存到行变量中。 因为cu_book动态游标里面可能一条数据或全部的记录。 fetch cu_book into b_rowdata; --判断游标是否还有数据,有就循环输出行变量中字段数据 while cu_book%found loop dbms_output.put_line('书名:'||b_rowdata.bookname || '价格:' || b_rowdata.price); --还有数据就循环将游标数据保存到行变量中 fetch cu_book into b_rowdata; end loop; close cu_book; end;当bookname='jvm并发1'时,不存在该记录,因此查询全部记录信息。输出结果:当bookname='jvm并发'时,存在该记录,因此输出记录信息。3、定义弱类型动态游标弱类型比强类型强大。弱类型动态游标定义,只是少了返回类型的定义,没有了返回值。declare type 游标类型 is ref cursor;需求:查询t_book中是否有书名为“jvm并发”的记录,有就输出t_book所有记录数据,没有则输出t_booktype表所有记录数据。原始表数据:代码:--定义弱类型动态游标 declare type notknowtype is ref cursor; --定义一个动态游标对象 notknow notknowtype; --用于统计是否存在记录 b_count number; cu_book t_book%rowtype; cu_booktype t_Booktype%Rowtype; begin select count(*) into b_count from t_book where bookname='jvm并发'; if b_count >0 then --不存在 open notknow for select * from t_book; --查询所有t_book数据到游标 --将游标对象循环赋值到t_book行数据中 fetch notknow into cu_book; while notknow%found --如果游标对象中有数据,则循环输出全部记录信息 loop dbms_output.put_line('书ID:' || cu_book.id || '书名:' || cu_book.bookname || '价格:' || cu_book.price); fetch notknow into cu_book;--继续循环一下条数据 end loop; close notknow; else open notknow for select * from t_booktype; fetch notknow into cu_booktype; while notknow%found loop dbms_output.put_line('t_booktype id:' || cu_booktype.id || 't_booktype name:' || cu_booktype.booktypename); fetch notknow into cu_booktype; end loop; close notknow; end if; end;输出结果:书ID:3书名:jvm并发价格:66 书ID:4书名:c++价格:99 书ID:5书名:C#价格:51 书ID:1书名:xxxx价格:55 书ID:2书名:go秘籍价格:78修改条件中书名为不存在书名,重新执行:--定义弱类型动态游标 declare type notknowtype is ref cursor; --定义一个动态游标对象 notknow notknowtype; --用于统计是否存在记录 b_count number; cu_book t_book%rowtype; cu_booktype t_Booktype%Rowtype; begin select count(*) into b_count from t_book where bookname='jvm并发111'; if b_count >0 then --不存在 open notknow for select * from t_book; --查询所有t_book数据到游标 --将游标对象循环赋值到t_book行数据中 fetch notknow into cu_book; while notknow%found --如果游标对象中有数据,则循环输出全部记录信息 loop dbms_output.put_line('书ID:' || cu_book.id || '书名:' || cu_book.bookname || '价格:' || cu_book.price); fetch notknow into cu_book;--继续循环一下条数据 end loop; close notknow; else open notknow for select * from t_booktype; fetch notknow into cu_booktype; while notknow%found loop dbms_output.put_line('t_booktype id:' || cu_booktype.id || 't_booktype name:' || cu_booktype.booktypename); fetch notknow into cu_booktype; end loop; close notknow; end if; end;输出结果:t_booktype id:2t_booktype name:go t_booktype id:1t_booktype name:java history注意:成对的结束,最后的分号,关闭游标。七、查看游标1、查看系统游标数(最大游标数)select value from v$parameter where name = 'open_cursors';2、查看当前打开的游标数目select count(*) from v$open_cursor;3、查看游标使用情况select o.sid, osuser, machine,o.sql_id,o.sql_text,o.cursor_type, count(*) num_curs from v$open_cursor o, v$session s where user_name = '用户名' and o.sid = s.sid group by o.sid, osuser, machine,o.sql_id,o.sql_text,o.cursor_type order by num_curs desc;4、修改Oracle最大游标数alter system set open_cursors=2000 scope=both;5、各用户的打开游标总数SELECT A.USER_NAME, COUNT(*) FROM V$OPEN_CURSOR A GROUP BY A.USER_NAME;6、查找数据库各用户各个终端的缓存游标数SELECT AA.USERNAME, AA.MACHINE, SUM(AA.VALUE) FROM ( SELECT A.VALUE, S.MACHINE, S.USERNAME FROM V$SESSTAT A, V$STATNAME B, V$SESSION S WHERE A.STATISTIC# = B.STATISTIC# AND S.SID = A.SID AND B.NAME = 'session cursor cache count' ) AA GROUP BY AA.USERNAME, AA.MACHINE ORDER BY AA.USERNAME, AA.MACHINE;7、查找数据库各用户各个终端的打开游标数SELECT AA.USERNAME, AA.MACHINE, SUM(AA.VALUE) FROM ( SELECT A.VALUE, S.MACHINE, S.USERNAME FROM V$SESSTAT A, V$STATNAME B, V$SESSION S WHERE A.STATISTIC# = B.STATISTIC# AND S.SID = A.SID AND B.NAME = 'opened cursors current' ) AA GROUP BY AA.USERNAME, AA.MACHINE ORDER BY AA.USERNAME, AA.MACHINE;
2022年12月06日
169 阅读
0 评论
3 点赞
2022-12-05
Oracle控制语句
一、Oracle控制语句1、编写语句--写了才会输出 set serverout on; --开始语句 begin --这里面开始写语句块 dbms_output.put_line('Hello'); --注意" ; "不要完了 --控制语句结束 end; --在对话框执行时,需要输入/2、执行语句3、定义变量-只定义变量 declare 变量名 数据类型; --定义变量并赋值 declare 变量名 数据类型:赋值;示例:--写了才会输出 set serverout on; --定义变量price并赋值,注意不是在语句块里面定义 declare price number:=100; --开始语句 begin --这里面开始写语句块 dbms_output.put_line('Hello'||price); --注意" ; "不要完了 --控制语句结束 end; --在对话框执行时,需要输入/注意:可以一次定义多个变量,不用每次都写declare。示例:set serverout on; --定义多个变量 declare price number:=100; productName varchar(20):='notebook'; begin -- 凭借符号|| dbms_output.put_line(price || productName); end;4、赋值定义变量并赋值--定义变量price并赋值100,注意不是在语句块里面定义 declare price number:=100;5、查询结果赋值into:将查询结果赋值给定义的变量select 查询字段1,查询字段2 into 赋值给定义的变量1,赋值给定义的变量1 from t_book where id=bs_id;示例:set serverout on; declare count_books number; begin select count(*) into count_books from t_book; dbms_output.put_line(count_books); end;定义多个变量查询结果赋值:直接有都好隔开。select id,price into new_id,max_price from t_book where id=bs_id;6、拼接拼接符号||set serverout on; begin -- 凭借符号|| dbms_output.put_line('Hello' || 'word'); end;二、控制语句注意:都是写在语句块里面。1、普通-if条件语句 if 条件 then 条件成立逻辑 else 不成立逻辑 end if;注意:end if;示例:set serverout on; declare count_books number; begin select count(*) into count_books from t_book; dbms_output.put_line(count_books); if count_books > 2 then dbms_output.put_line('总记录数大于2'); else dbms_output.put_line('总记录数不大于2'); end if; end;输出结果:2、复杂-else-if示例:set serverout on; declare count_books number; begin select count(*) into count_books from t_book; dbms_output.put_line(count_books); if count_books = 1 then dbms_output.put_line('总记录数等于1'); else if count_books >2 then dbms_output.put_line('总记录数大于2'); else dbms_output.put_line('总记录数为0'); end if; end if; end;注意: 有多少个if,就必须要有多少个end if。三、流程控制1、case when then case 判断值 when 判断值等与值1 then 1满足时成立时逻辑; when 判断值等与值2 then 1满足时成立时逻辑; when 判断值等与值3 then 1满足时成立时逻辑; else 都不满足时逻辑; end case;注意:不要忘记end case;示例:set serverout on; declare count_books number; begin select count(*) into count_books from t_book; dbms_output.put_line('总记录数=' || count_books); case count_books when 1 then dbms_output.put_line('有1条记录'); when 2 then dbms_output.put_line('有2条记录'); when 2 then dbms_output.put_line('有3条记录'); else dbms_output.put_line('都不满足条件'); end case; end;四、循环1、无条件循环-loop loop 跳出循环控制,不然一直循环; 要操作的逻辑; end loop;示例:查询表中从id为2的书的价格,当大于id大于4时,跳出无线循环。原始表数据:set serverout on; declare bs_id number:=2; max_price number; new_id number; begin loop --跳出无线循环的条件,exit后面必须要有分号。if必须要用endif if(bs_id >4) then exit; end if; select id,price into new_id,max_price from t_book where id=bs_id; dbms_output.put_line('书名ID为:'|| new_id || '的书价格为:' || max_price); bs_id:=bs_id+1; end loop; end;注意:1、必须要有跳出无线循环的条件(开关)2、exit跳出语句后面必须要有分号。3、if必须要用end if。4、loop 必须要用end loop5、注意条件要增加如上的 bs_id:=bs_id+1;输出结果:2、while循环格式:while 条件 满足条件执行逻辑。示例:输出ID冲2开始,小于4的书籍信息。原始表数据:编写sql:set serverout on; declare bs_id number:=2; b_price number; book_Name varchar(20); begin while (bs_id) < 4 loop select bookName,price into book_Name,b_price from t_book where id=bs_id; dbms_output.put_line('ID=' || bs_id || '书名:' || book_Name || '价格:' || b_price); bs_id:=bs_id+1; end loop; end;注意:循环条件,不然会导致死循环注意:while与loop的区别是,loop需要我们手动写exit;跳出循环语句,而while通过while条件来控制循环。3、for循环格式:for 循环参数 in 循环值 loop 其它操作逻辑; end loop;代码示例:输出id从2到4的书籍信息。set serverout on; declare b_price number; book_Name varchar(20); begin for bs_id in 2..4 loop select bookName,price into book_Name,b_price from t_book where id=bs_id; dbms_output.put_line('ID=' || bs_id || '书名:' || book_Name || '价格:' || b_price); end loop; end;注意:for后面的参数值从多少到多少是2个.输出结果:
2022年12月05日
147 阅读
0 评论
2 点赞
2022-12-02
Oracle 权限、视图、约束
Oracle 权限、视图、约束一、数据库权限1、查看用户所属角色select * from user_role_privs;2、查询角色权限CONNECT:仅连接权限select * from dba_sys_privs where grantee='CONNECT'查看RESOURCE权限:select * from dba_sys_privs where grantee='RESOURCE'DBA角色权限查看select * from dba_sys_privs where grantee='DBA'3、用户授权例如:授予scoot拥有dba的权限grant dba to scott;二、视图1、创建视图Create view 视图名称as 查询语句 create view v_emp1 as select ename,job from emp;2、修改视图create or replace view 始图名称 as 新的查询数据; create or replace view vemp as select empno,ename,job from EMP t;注意与创建视图的不同:多了一个or replace3、删除视图drop view 视图名称; drop view vemp2;4、使用视图select * from 视图; select * from vemp;就当作是一张虚拟的表使用。5、修改视图数据注意:修改视图数据,实际是修改实际表的数据,不是视图的数据。例如修改上面视图数据:update vemp set ename='xxxx' where job='CLERK' and empno='7369'修改后:最后实际修改的是,视图中查询数据表的实际数据。上面视图实际修改的是EMP表的数据:select * from EMP;注意:修改视图数据时,实际是修改实际表的数据,不是视图的数据。6、视图添加数据注意:向视图数据添加数据,实际是向实际表中添加数据和普通表添加数据一样,视图只是在向实际的表添加数据 insert into vemp values('1111','bbbbb','teacher');查看添加视图数据,实际是向实际表中添加了数据。select * from vemp;查看实际表中数据:select * from EMP;7、删除视图中数据和普通删除表数据一样,实际是删除的实际表中数据。delete from vemp where empno=1111总结:对视图中数据的CRUD实际是对真实表的数据操作,实际开发中一般都会将视图设置为只读,防止误操作。8、只读视图Create view 视图名称as 查询语句 with read only;当向视图添加、删除、修改数据时,都会提示“无法对只读视图执行dml操作”。三、约束1、主键约束(Primary)用来标识唯一一条记录的。非空,和其它表的外键有关系,其它表的外键关联该表的主键,起到约束作用。一般用作条件查询、条件修改、条件删除等操作。id设置为主键。查询一条数据:insert into t_bookType values(1,'java history');查看数据:select * from t_bookType;查看建外键sql语句:查看sql:这里就能看到建表、建主键的sql语句了:2、外键约束(Foreign)起到约束作用。新建表:创建外键:注意:另一张表t_bookType的主键id不能为空,否则建外键时会报错id不能为空。查看建外键sql语句和上面一样:约束作用:查看t_bookType数据:向t_book添加数据时:添加一条不存在的主键数据时,就会提示“违反完整约束条件”因此起到了,约束添加的外键只能是另一张表里面存在的主键。3、唯一性约束(Unique)约束某些字段值作为唯一标识,不能重复添加相同数据。添加方式查看sql脚本同上:没加约束前,可以添加相同bookTypeName的记录,加了约束后会提示报错"违反唯一约束条件"4、检查约束(针对所有记录,上面1、2、3都是正对一条记录)给某个字段添加,写入值的条件。t_book增加价格price字段:查询t_book:如果以后向每次添加数据时,检查price价格返回是否在50-100之间,就可以使用检查约束。添加检查约束sql:添加数据价格在范围内不报错,超出范围会提示报错“范围检查约束条件”5、默认值约束其实就是添加数据时,某些字段没有设置时,给字段设置默认值。t_book增加作者性别字段:添加一条数据:insert into T_BOOK(id,BOOKNAME,TYPE_ID,price) values(3,'jvm并发',1,66);新加数据sex性别为空,不符合实际逻辑,怎么会没有性别,因此想设置默认值。添加默认值约束:重新添加一条数据:此时就有默认值了。删除上面添加没有sex性别的记录,重新加添;insert into T_BOOK(id,BOOKNAME,TYPE_ID,price) values(3,'jvm并发',1,66);现在就有值了。添加默认值约束SQL:6、非空约束设置字段值不能为空勾选:允许为空,不勾选:不允许为空。查询一条件数据,价格不添加:添加数据值,为添加price的值,由于设置了非空约束,不能为空,所以报错“无法将null插入”
2022年12月02日
176 阅读
0 评论
2 点赞
2022-11-29
Docker安装ShowDoc ssl https nginx配置
Docker安装ShowDoc ssl https nginx配置一、docker安装showdoc1、拉取镜像# 中国大陆镜像安装命令(安装后记得执行docker tag命令以进行重命名)docker pull registry.cn-shenzhen.aliyuncs.com/star7th/showdoc docker tag registry.cn-shenzhen.aliyuncs.com/star7th/showdoc:latest star7th/showdoc:latest 2、创建showdoc数据目录mkdir -p /mydata/showdoc/showdoc_data/html chmod -R 777 /mydata/showdoc/showdoc_data3、启动容器docker run -d --name showdoc --user=root --privileged=true -p 4999:80 \ -v /mydata/showdoc/html:/var/www/html/ star7th/showdoc4、设置随容器启动docker update --restart=always showdoc此时旧可以通过IP+port访问了,注意,端口放行,云服务器白名单开启。二、showdoc配置https、ssl、nginx配置nginx https、ssl配置如下:server { listen 443 ssl; server_name doc.yanxizhu.com; client_max_body_size 1000m; ssl on; ssl_certificate /etc/nginx/conf.d/key/doc.yanxizhu.com_bundle.crt; ssl_certificate_key /etc/nginx/conf.d/key/doc.yanxizhu.com.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location ^~ / { proxy_pass http://自己云服务器ip:4999/; proxy_redirect off; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header http_user_agent $http_user_agent; } } server { listen 80; server_name doc.yanxizhu.com; rewrite ^(.*) https://doc.yanxizhu.com$1 permanent; }注意:修改自己域名和对应端口。此时就可以通过域名https://doc.yanxizhu.com/访问了。
2022年11月29日
234 阅读
0 评论
2 点赞
1
2
3
4
...
21