数据库系统管理与应用.ppt

上传人:牧羊曲112 文档编号:6578668 上传时间:2023-11-14 格式:PPT 页数:96 大小:743.50KB
返回 下载 相关 举报
数据库系统管理与应用.ppt_第1页
第1页 / 共96页
数据库系统管理与应用.ppt_第2页
第2页 / 共96页
数据库系统管理与应用.ppt_第3页
第3页 / 共96页
数据库系统管理与应用.ppt_第4页
第4页 / 共96页
数据库系统管理与应用.ppt_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《数据库系统管理与应用.ppt》由会员分享,可在线阅读,更多相关《数据库系统管理与应用.ppt(96页珍藏版)》请在三一办公上搜索。

1、数据库系统管理与应用,大连民族学院计算机学院,何丽君,课程名称:数据库系统管理与应用教材:Oracle 10g 数据库管理 应用与开发标准教程 马晓玉等 清华大学出版社参考书:Oracle 10g 入门与提高 王彬 清华大学出版社Oracle 10g DBA 宝典 路川 电子工业出版社总学时:64学时(理论40学时+上机24学时)任课教师:何丽君办公地点:2-446(网络工程教研室)E-mail:,不旷课、不迟到、不早退(无故旷课1次扣平时分2分,迟到或早退1次扣平时分1分),累计旷课(迟到三次计一次旷课)达三次以上者,取消考试资格。认真听课,认真复习,认真完成实验报告和作业(缺1次作业扣平时

2、分2分,雷同作业或报告都按缺交计,缺交报告或实验检查缺席实验成绩按0分计)尽量靠前坐上课时将手机等通讯工具关闭,课程要求:,为什么选择学习Oracle,Oracle数据库环境已成为世界上最流行的数据库平台之一1977年成立于美国加州,是一个小型的关系数据库公司1979年推出ORACLE2是首批商用的RDBMS1986年的ORACLE5是世界上第一个开放型分布式数据库产品1988年的ORACLE6具有OLTP的能力1992年ORACLE7适用于大型OLTP及C/S应用1997年ORACLE8i支持数据仓库、Web应用2001年在ORACLE8i的基础上推出ORACLE9i2004年发布了ORAC

3、LE10g2007年7月新发布ORACLE11g,第一章 Oracle关系数据库,1.1 Oracle 10g的安装(教材1.6)1.2 创建数据库(教材1.7)1.3 数据库的启动与关闭(教材1.8)1.4 Oracle 默认用户(教材1.9)1.5 在SQL*Plus中使用函数(教材3.5)1.6 SQL*Plus命令(教材4.4),1.1 Oracle 10g的安装(教材1.6),安装过程Oracle 数据库的网络服务配置,Oracle Net 服务器端 基本配置 目标,了解监听程序如何响应传入的连接使用 Oracle Net Manager 配置监听程序使用“监听程序控制实用程序”(L

4、istener Control Utility,lsnrctl)控制监听程序,监听程序进程,listener.ora,监听程序,客户机,服务器,tnsnames.ora,sqlnet.ora,sqlnet.ora,连接方法,客户机向服务器发出连接请求时,监听程序执行下列操作之一:衍生一个服务器进程并将连接传送给该进程或由其继承将连接传送给 Oracle Shared Server 配置中的调度程序将连接重定向到调度程序或服务器进程,衍生、继承和直接传送连接,重定向会话,端口,监听程序,客户机,服务器,端口,服务器或调度程序进程,1,2,3,4,5,6,服务配置和注册,可以通过两种方式配置监听程

5、序:静态服务配置 用于 Oracle8 及更早版本需要配置 listener.ora 对 Oracle Enterprise Manager 和其它服务是必需的,静态服务注册:listener.ora 文件,安装 Oracle 软件时,会为初始数据库创建具有下列缺省设置的 listener.ora 文件:监听程序名 LISTENER端口 1521协议 TCP/IP 和 IPCSID 名 缺省例程主机名 缺省主机名,静态服务注册:listener.ora 文件,1.LISTENER=2.(ADDRESS_LIST=3.(ADDRESS=(PROTOCOL=TCP)(Host=dlnu-hlj02

6、)(Port=1521)4.SID_LIST_LISTENER=5.(SID_LIST=6.(SID_DESC=7.(ORACLE_HOME=/home/oracle)(GLOBAL_DBNAME=)9.(SID_NAME=ORCL),静态服务注册:创建监听程序,配置服务,事件记录与跟踪,“监听程序控制实用程序”(Listener Control Utility,LSNRCTL),“监听程序控制实用程序”(Listener Control Utility)命令可从命令行或 LSNRCTL 提示符下发出。UNIX 命令行语法:提示符语法:控制非缺省监听程序,$lsnrctl,LSNRCTL,LS

7、NRCTL set current_listener listener02,LSNRCTL 命令,使用以下命令控制监听程序:START listener_nameSTOP listener_name,LSNRCTL SET 和 SHOW 修改符,使用 SET 命令更改监听程序参数:使用 SHOW 命令显示参数的值:,LSNRCTL SET trc_level ADMIN,LSNRCTL SHOW trc_directory,命名方法配置 目标,描述主机命名与本地服务名称解析之间的区别使用 Oracle Net Configuration Assistant 配置:主机命名方法本地命名方法网络服

8、务名 排除简单连接出现的故障,命名方法概览,客户机应用程序在试图连接数据库服务时,需要借助命名方法将连接标识符解析为连接描述符。Oracle Net 提供了五种命名方法:主机命名本地命名目录命名Oracle Names 外部命名,主机命名,在下列情况下,客户机可使用主机名来连接服务器:使用 Oracle Net Services Client 软件连接 Oracle 数据库服务使用 TCP/IP 协议建立客户机与服务器的连接主机名通过 DNS 或本地的/etc/hosts 文件等 IP 地址转换机制来解析不使用“连接管理器”(Connection Manager)或安全选项等高级功能,主机命名

9、:客户端,sqlnet.ora,names.directory_path=(HOSTNAME),服务器,listener.ora,客户机,TCP/IP,主机命名:服务器端,客户机,sqlnet.ora,listener.ora,服务器,SID_LIST_LISTENER=(SID_LIST=(SID_DESC=()(ORACLE_HOME=/u03/ora9i/rel12)(SID_NAME=TEST),1521,TCP/IP,主机命名示例,listener.ora 文件从客户机连接,SID_LIST_LISTENER=(SID_LIST=(SID_DESC=()(ORACLE_HOME=/u

10、03/ora9i/rel12)(SID_NAME=TEST),sqlplus,命名方法配置,本地命名,listener.ora,服务器,客户机,tnsnames.ora,sqlnet.ora,生成的文件:tnsnames.ora,#TNSNAMES.ORA Network Configuration#File:/u03/ora9i/rel12/network/admin/tnsnames.ora#Generated by Oracle configuration tools.MY_SERVICE.US.ORACLE.COM=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS

11、=(PROTOCOL=TCP)(HOST=)(PORT=1521)(CONNECT_DATA=(SERVICE_NAME=),生成的文件:sqlnet.ora,#SQLNET.ORA Network Configuration File:/u03/ora9i/rel12/network/admin/sqlnet.ora#Generated by Oracle configuration tools.NAMES.DEFAULT_DOMAIN=NAMES.DIRECTORY_PATH=(TNSNAMES,HOSTNAME)SQLNET.EXPIRE_TIME=0,sqlplus system/ab

12、c123MY_SERVICESQL*Plus:Release 9.0.1.0.0-Production on Thu Nov 15 13:46:24 2001(c)Copyright 2001 Oracle Corporation.All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.0.1.0.0-ProductionJServer Release 9.0.1.0.0-ProductionSQL,排除客户端故障,下面是在客户端出现问题时显示的错误代码:,ORA-12154“TNS:无法解析服务名”ORA-

13、12198“TNS:找不到指向目标的路径”ORA-12203“TNS:无法连接目标”ORA-12533“TNS:ADDRESS 参数非法”ORA-12541“TNS:没有监听程序”,第一章 Oracle关系数据库,1.1 Oracle 10g的安装(教材1.6)1.2 创建数据库(教材1.7)1.3 数据库的启动与关闭(教材1.8)1.4 Oracle 默认用户(教材1.9)1.5 在SQL*Plus中使用函数(教材3.5)1.6 SQL*Plus命令(教材4.4),第一章 Oracle关系数据库,1.1 Oracle 10g的安装(教材1.6)1.2 创建数据库(教材1.7)1.3 数据库的

14、启动与关闭(教材1.8)1.4 Oracle 默认用户(教材1.9)1.5 在SQL*Plus中使用函数(教材3.5)1.6 SQL*Plus命令(教材4.4),第一章 Oracle关系数据库,1.1 Oracle 10g的安装(教材1.6)1.2 创建数据库(教材1.7)1.3 数据库的启动与关闭(教材1.8)1.4 Oracle 默认用户(教材1.9)1.5 在SQL*Plus中使用函数(教材3.5)1.6 SQL*Plus命令(教材4.4),ORACLE中预定义的用户,SYSSYSTEM SCOTT DEMO,用户名,第一章 Oracle关系数据库,1.1 Oracle 10g的安装(教

15、材1.6)1.2 创建数据库(教材1.7)1.3 数据库的启动与关闭(教材1.8)1.4 Oracle 默认用户(教材1.9)1.5 在SQL*Plus中使用函数(教材3.5)1.6 SQL*Plus命令(教材4.4),转换,字符,数值,日期,通用,函数,字符函数,字符函数,LOWERUPPERINITCAP,CONCATSUBSTRLENGTHINSTRLPADTRIM,大小写转换,字符处理,函数,结果,大小写转换函数,转化字符串的大小写,LOWER(SQL Course)UPPER(SQL Course)INITCAP(SQL Course),sql courseSQL COURSESql

16、 Course,使用大小写转换函数,显示Blake的雇员编号、姓名和部门编号。,SQL SELECTempno,ename,deptno 2 FROMemp 3 WHEREename=blake;no rows selected,EMPNO ENAME DEPTNO-7698 BLAKE 30,SQL SELECTempno,ename,deptno 2 FROMemp 3 WHERE ename=UPPER(blake);,CONCAT(Good,String)SUBSTR(String,1,3)LENGTH(String)INSTR(String,r)LPAD(sal,10,*)TRIM(

17、S FROM SSMITH),GoodStringStr63*5000MITH,函数,结果,字符处理函数,字符处理函数,使用字符处理函数,SQL SELECT ename,CONCAT(ename,job),LENGTH(ename),2 INSTR(ename,A)3 FROM emp 4 WHERE,SUBSTR(job,1,5)=SALES;,ENAME CONCAT(ENAME,JOB)LENGTH(ENAME)INSTR(ENAME,A)-MARTIN MARTINSALESMAN 6 2ALLEN ALLENSALESMAN 5 1TURNER TURNERSALESMAN 6 0

18、WARD WARDSALESMAN 4 2,数值函数,ROUND:四舍五入到指定的小数位ROUND(45.926,2)45.93TRUNC:截取到指定的小数位TRUNC(45.926,2)45.92MOD:取余数MOD(1600,300)100,使用 ROUND 函数,SQL SELECT ROUND(45.923,2),ROUND(45.923,0),2 ROUND(45.923,-1)3 FROM DUAL;,ROUND(45.923,2)ROUND(45.923,0)ROUND(45.923,-1)-45.92 46 50,SQL SELECT TRUNC(45.923,2),TRUNC

19、(45.923),2 TRUNC(45.923,-1)3 FROM DUAL;,TRUNC(45.923,2)TRUNC(45.923)TRUNC(45.923,-1)-45.92 45 40,使用 TRUNC函数,使用 MOD 函数,计算工作为salsman的雇员的薪水和佣金相除后的剩余。,SQL SELECTename,sal,comm,MOD(sal,comm)2 FROMemp 3 WHEREjob=SALESMAN;,ENAME SAL COMM MOD(SAL,COMM)-MARTIN 1250 1400 1250ALLEN 1600 300 100TURNER 1500 0 15

20、00WARD 1250 500 250,日期的处理,Oracle是以一种内部的数值形式存储日期的,即:世纪、年、月、日、小时、分、秒。默认的日期形式是:DD-MON-RR.SYSDATE 是一个可以返回日期和时间的函数DUAL是一个虚拟表用于查看SYSDATE.,日期的运算,对一个日期型数据加上或减去一个数可以得到一个新的日期型数据。两个日期型数据相减得到这两个日期的间隔数。如要以小时相加则必须用小时数除以24得到的数据进行相加。,对日期使用算术运算符,SQL SELECT ename,(SYSDATE-hiredate)/7 WEEKS 2 FROM emp 3 WHERE deptno=1

21、0;,ENAME WEEKS-KING 830.93709CLARK 853.93709MILLER 821.36566,RR 日期格式,当前年份1995199520012001,指定的日期27-OCT-9527-OCT-1727-OCT-1727-OCT-95,RR 格式1995201720171995,YY 格式1995191720172095,如果当前年份的两位数是:,049,049,5099,5099,返回的日期是当前世纪的日期,返回的日期是下一个世纪的日期,返回的日期是上一个世纪的日期,返回的日期是当前世纪的日期,如果指定两位数年份是:,日期函数,两个日期之间间隔多少个月,MONTH

22、S_BETWEEN,ADD_MONTHS,NEXT_DAY,LAST_DAY,ROUND,TRUNC,向一个日期数据加一定的月份,某个指定日期之后的某天,返回某月的最后一天,对日期进行四舍五入,对日期进行截取,函数,描述,MONTHS_BETWEEN(01-SEP-95,11-JAN-94),使用日期函数,ADD_MONTHS(11-JAN-94,6),NEXT_DAY(01-SEP-95,FRIDAY),LAST_DAY(01-SEP-95),19.6774194,11-JUL-94,08-SEP-95,30-SEP-95,使用日期函数,转换函数,隐式数据类型转换,显式数据类型转换,数据类型

23、转换,隐式转换,赋值语句中,Oracle服务器自动完成以下转换:,VARCHAR2 or CHAR,从,到,VARCHAR2 or CHAR,NUMBER,DATE,NUMBER,DATE,VARCHAR2,VARCHAR2,隐式转换,在表达式中,Oracle服务器自动完成以下转换:,VARCHAR2 or CHAR,从,到,VARCHAR2 or CHAR,NUMBER,DATE,显式转换,NUMBER,CHARACTER,TO_CHAR,显式转换,NUMBER,CHARACTER,TO_CHAR,显式转换,NUMBER,CHARACTER,TO_CHAR,TO_CHAR 用于日期型,日期格

24、式模型:必须用单引号引起来并且是大小写敏感的可以包含任何有效的日期元素可以用fm来消除前导空格或零使用逗号与日期型数据分隔开,TO_CHAR(date,fmt),YYYY,日期格式模型的元素,YEAR,MM,MONTH,DY,DAY,完整的年份数字表示,年份的英文表示,用两位数字来表示月份,用3个英文字符所写来表示星期几,星期几完整的英文表示,月份的英文表示,日期格式模型的元素,用时间元素格式化日期的时间部分通过使用双引号可以添加字符串使用数字下标可以拼写数字号码,TO_CHAR 用于日期型,SQL SELECTename,2 TO_CHAR(hiredate,fmDD Month YYYY)

25、HIREDATE 3 FROM emp;,ENAME HIREDATE-KING 17 November 1981BLAKE 1 May 1981CLARK 9 June 1981JONES 2 April 1981MARTIN 28 September 1981ALLEN 20 February 1981.14 rows selected.,TO_CHAR 用于数值型,通过在TO_CHAR中使用以下形式可以把数值型数据转化成变长的字符串:,TO_CHAR(number,fmt),9,0,$,L,.,一位数字,显示前导零,显示美元符号,显示本地货币号,显示小数点,显示千位符,TO_CHAR 用

26、于数值型,SQL SELECTTO_CHAR(sal,$99,999)SALARY 2 FROMemp 3 WHEREename=SCOTT;,SALARY-$3,000,TO_NUMBER 和 TO_DATE 函数,使用TO_NUMBER将一个字符串转换成数值型数据。,TO_NUMBER(char,fmt),使用TO_DATE将一个字符串转换成日期型数据。,TO_DATE(char,fmt),NVL 函数,将NULL转换为一个实际的值数据类型可以是date、character、number。数据类型必须匹配 NVL(comm,0)NVL(hiredate,01-JAN-97)NVL(job,

27、No Job Yet),SQL SELECT ename,sal,comm,(sal*12)+NVL(comm,0)2 FROM emp;,使用 NVL 函数,ENAME SAL COMM(SAL*12)+NVL(COMM,0)-KING 5000 60000BLAKE 2850 34200CLARK 2450 29400JONES 2975 35700MARTIN 1250 1400 16400ALLEN 1600 300 19500.14 rows selected.,函数的嵌套,单行函数可以嵌套于任何层。嵌套的函数是从最里层向最外层的顺序计算的。,F3(F2(F1(col,arg1),a

28、rg2),arg3),Step 1=Result 1,Step 2=Result 2,Step 3=Result 3,函数的嵌套,SQL SELECTename,2 NVL(TO_CHAR(mgr),No Manager)3 FROMemp 4 WHEREmgr IS NULL;,ENAME NVL(TO_CHAR(MGR),NOMANAGER)-KING No Manager,第一章 Oracle关系数据库,1.1 Oracle 10g的安装(教材1.6)1.2 创建数据库(教材1.7)1.3 数据库的启动与关闭(教材1.8)1.4 Oracle 默认用户(教材1.9)1.5 在SQL*Pl

29、us中使用函数(教材3.5)1.6 SQL*Plus命令(教材4.4),定制 SQL*Plus 环境,使用 SET 命令设置当前环境变量使用SHOW 命令显示当前环境变量,SQL SET ECHO ON,SQL SHOW ECHOecho ON,SET system_variable value,Login.sql文件保存了每次会话的标准环境设置及其他SQL*Plus命令,常用的SET命令变量列表,ARRAYSIZE 20|nCOLSEP _|textFEEDBACK 6|n|OFF|ONHEADING OFF|ONLINESIZE 80|n LONG 80|nPAGESIZE 24|nPAU

30、SE OFF|ON|textTERMOUT OFF|ON,将定制的环境保存在 login.sql文件中,login.sql 文件保存了标准的环境设置及其他 SQL*Plus命令,这些都在登录SQL*Plus时自动加载可以修改 login.sql 保存其它额外的设置命令,SQL*Plus 格式化命令,COLUMN column option TTITLE text|OFF|ONBTITLE text|OFF|ONBREAK ON report_element,COLUMN 命令,控制列的显示其中,option有以下可选项;CLEAR:清除所有列的显示格式FORMAT format:使用格式模型改

31、变列的显示HEADING text:设置列标题 JUSTIFY align:调整列标题的位置居左、居中还是居右,COLUMN column|alias option,使用 COLUMN 命令,创建列标题,显示列ENAME的当前设置,清除列ENAME的当前设置,COLUMN ename HEADING Employee|Name FORMAT A15COLUMN sal JUSTIFY LEFT FORMAT$99,990.00COLUMN mgr FORMAT 999999999 NULL No manager,COLUMN ename,COLUMN ename CLEAR,COLUMN 格式

32、模型,结果N/A123401234$1234 L1234 1234.001,234,举例N/A999999 099999$9999 L99999999.999,999,元素An90$L.,描述设置显示宽度为 n个字符每个9表是一位数字,不显示前导零表示前导零美元符号本地货币符号小数点的位置千位分割符,使用 BREAK 命令,命令格式为:BREAK on column|alias|row skip n|dup|page on.on report其中:page 表示遇到断点时产生新的一页skip n 表示遇到断点时跳跃n行duplicate 显示重复值并且断点可以作用于:列、行、页、报表。清除所有

33、BREAK设置使用CLEAR 命令:CLEAR BREAK,BREAK 命令用于去掉重复的行以及断点处跳过指定的行数。,使用 TTITLE 和 BTITLE 命令,显示标题和脚注,TTITLE text|OFF|ON,SQL TTITLE Salary|Report,设置报表标题,设置报表脚注,SQL BTITLE Confidential,交互式报表,我想立即运行一个视图,.工资=?部门=?.姓名=?.,User,可以采用在命令文件或单一的SQL语句中嵌入替代变量的方式实现。,替代变量,使用SQL*Plus替代变量临时存储数据&DEFINE 命令:创建变量并声明一个值ACCEPT 命令:读取

34、用户输入的一行 并保存成变量。在 SQL语句之间传递值动态地改变标题和脚注从文件而不是人为输入获得输入的值。,使用&替代变量,当运行一个报表时,用户希望能动态地限制返回的数据,SQL*Plus通过用户变量的方式提供了这种灵活性。在SQL语句中使用&来识别每一个变量而不需要定义变量的值。,使用&替代变量,使用变量前缀&提示用户需要输入一个值,SQL SELECTempno,ename,sal,deptno 2 FROMemp 3 WHEREempno=,Enter value for employee_num:7369 EMPNO ENAME SAL DEPTNO-7369 SMITH 800

35、20,SET VERIFY 命令,先后显示SQL*Plus用值替换替代变量前后的命令文本,SQL SET VERIFY ONSQL SELECTempno,ename,sal,deptno 2 FROMemp 3 WHEREempno=,Enter value for employee_num:7369old 3:WHERE empno=&employee_numnew 3:WHERE empno=7369.,字符和日期的替代变量,使用单引号将日期和字符型的替代变量扩起来,SQL SELECT ename,deptno,sal*12 2 FROM emp 3 WHERE job=,Enter

36、value for job_title:ANALYSTENAME DEPTNO SAL*12-SCOTT 20 36000FORD 20 36000,在运行时指定列、表达式及文本,使用替代变量可以补充:WHERE条件ORDER BY 子句列表达式表名完整的 SELECT 语句,替代变量几乎可以使用在SQL语句的任何地方。,在运行时指定列、表达式及文本,SQL SELECTempno,ename,job,Enter value for column_name:salEnter value for condition:sal=3000Enter value for order_column:ena

37、me EMPNO ENAME JOB SAL-7902 FORD ANALYST 3000 7839 KING PRESIDENT 5000 7788 SCOTT ANALYST 3000,使用&,如果您想再次使用同一变量而不再重新输入,则可以使用&,SQL SELECTempno,ename,job,Enter value for column_name:deptno EMPNO ENAME JOB DEPTNO-7839 KING PRESIDENT 10 7782 CLARK MANAGER 10 7934 MILLER CLERK 10.14 rows selected.,定义用户变量

38、,您可以使用以下两个 SQL*Plus命令中的一个预先定义用户变量:DEFINE:创建一个字符型用户变量ACCEPT:读取用户输入并将其保存在变量中如果在使用DEFINE时需要要到一个空格,则必须将该空格包括在单引号之内,ACCEPT 命令,创建一个在接受用户输入时的专用提示。明确地定义一个NUMBER 或 DATE 类型变量。考虑到安全因素可以隐藏用户输入。,ACCEPT variable datatype FORMAT format PROMPT text HIDE,ACCEPT 命令,其中:Variable 存储值的变量名称,如果该变量不 存在,则由SQL*Plus创建该变量。Datat

39、ype 数据可以是NUMBER、CHAR或DATEFORMAT format 指定格式模型。PROMPT text 用户输入前提示信息文本HIDE 隐藏用户输入,例如作为口令注意:在ACCEPT命令中所使用的替代变量名不能使用&作为前缀,但是引用该变量时需要在其前面加&.,使用 ACCEPT 命令,ACCEPT dept PROMPT Provide the department name:SELECT*FROM deptWHERE dname=UPPER(&dept)/,Provide the department name:Sales DEPTNO DNAME LOC-30 SALES C

40、HICAGO,DEFINE 和UNDEFINE 命令,变量会一直保持直到您:使用 UNDEFINE 命令清除它退出SQL*Plus您可以使用DEFINE命令来验证你所定义的变量如果要在每次会话都定义同一变量,可以修改 login.sql文件在文件中写入定义该变量的脚本,这样每次启动SQL*Plus时,都能自动定义该变量,使用 DEFINE 命令,创建一个变量来保存部门名称,DEFINE DEPTNAME=sales(CHAR),就象使用其它变量一样使用该变量,SQL DEFINE deptname=salesSQL DEFINE deptname,SQL SELECT*2 FROM dept 3 WHERE dname=UPPER(,创建并运行一个脚本文件,创建脚本文件的步骤:1.创建 SQL SELECT 语句.2.将该 SELECT语句保存到脚本文件3.从编辑器中调用该文件4.在SELECT语句前增加格式化命令5.验证SELECT后的终结符6.在SELECT语句之后清除格式化命令7.保存脚本文件.8.输入“START 文件名”运行脚本,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号