Oracle XE版安装与用户操作
作者:互联网
文章目录
安装
安装Oracle数据库
1)OracleXE112_Win64.zip 数据库服务管理平台
2)plsqldeveloper_x64.rar 第三方客户端
Oracle是一家软件公司。这家1977成立于加利福尼亚的软件公司是世界上第一个推出关系型数据管理系统(RDBMS)的公司。
现在,他们的RDBMS被广泛应用于各种操作环境:Windows NT、基于UNIX系统的小型机、IBM大型机以及一些专用硬件操作系统平台。事实上,Oracle已经成为世界上最大的RDBMS供应商,并且是世界上最主要的信息处理软件供应商。
Orace11g与Oracle 11g XE区别:
Oracle Database 11g Express 是 Oracle 数据库的免费版本,支持标准版的大部分功能,占用内存小,很不错。值得推荐。
- 11g XE 提供 Windows 和 Linux 版本。
- 做为免费的 Oracle 数据库版本,XE 的限制是:
- 最大数据库大小为 11 GB
- 可使用的最大内存是 1G
- 一台机器上只能安装一个 XE 实例
- XE 只能使用单 CPU,无法在多CPU上进行分布处理
安装注意事项
- 不能存储到中文目录下
- 记住密码
Oracle 服务
Oracle中的服务
oracle是基于服务数据库系统,只有启动服务后才能使用Oracle数据库
- OracleJobSchedulerXE : 是一个外部调度任务服务,负责Oracle中的调度任务。它只有在10.1版之后才可用。一般来说是没用的。
- OracleMTSRecoveryService : 当Oracle参与Microsoft Transaction Server的分布式事务时,该事务负责解决有疑问的事务。
- OracleServiceXE : 是ORCL库的服务,它负责Oracle和数据库启动的基础。只有在服务启动时,Oracle数据库才能正常启动。
- OracleXEClrAgent : 在Windows平台上,Oracle提供CLR集成。由于CLR操作是使用extproc进程运行的,因此通常在单个会话中使用专用(单线程)extproc来完成。这可能不是处理CLR调用的最佳方式。ClrAgent提供了一种多线程机制,因此单个extproc进程可以服务于多个CLR调用。
- OracleXETNSListener : 此服务负责侦听传入的连接并将成功的连接传递给数据库引擎。请注意,如果此服务关闭,您将无法远程连接到数据库。现有连接不会受到影响。
启动和停止服务
启动OracleServiceXE和OracleXETNSListener就可以正常使用Oracle数据库了。
- 控制台下启动和停止Oracle服务器命令
net start OracleServiceXE
net stop OracleServiceXE
- 服务面板中鼠标右键可停止和启动服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udiZ6rhv-1634730510516)(https://i.loli.net/2021/10/18/sfWUHzIhgJ2CQnE.png)]
Oracle客户端
sqlplus客户端
Oracle安装后,自带了一个控制台的客户端,叫sqlplus,有了这个客户端,在你维护服务器时至少有可用的客户端了,虽然不好用,但比没有强。
使用sqlplus需要两步
- 第一步:启动客户端
在控制台中输入sqlplus /nolog 启动客户端,注意此时只是启动了客户端,还没有登录到Oracle。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLt2oHor-1634730510517)(https://i.loli.net/2021/10/17/aI7cvYzr4yW8Owe.png)]
-
第二步:登录到Oracle
在客户端输入conn system/manager as sysdba;登录到oracle
- conn是连接oracle的命令
- system是oracle的管理员账户
- manager是system账户的默认密码,连接本机时可以用任意密码,不信你试试
- as是关键字,固定写法
- sysdba是登录的身份,表示系统数据库管理员,该身份具有最高权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JY3mtduY-1634730510520)(https://i.loli.net/2021/10/17/N2anpQcm9gWIBvZ.png)]
-
在sqlplus中练习几个常见的命令
-
select * from all_users; -- 查看所有用户 select * from dba_roles; -- 查看所有角色
plsqldeveloper客户端
plsqldeveloper是可视化界面。
- 在Command windows窗口练习几个常见的命令,与sqlplus客户端对比一下吧
select * from all_users; --查看所有用户 select * from dba_roles; --查看所有角色
- plsqldeveloper的SQL缓存
- plsqldeveloper总是默认缓存最后一条sql语句
- 使用
ed
命令打开缓存【可以编辑】 - 使用 / 执行缓存中的命令
- 小贴士:Oracle的命令以分号(;)结尾,代表命令完毕并执行,系统同时会把该命令保存在缓存中,缓存中只保存最近执行过的命令,如果重新执行缓存中的命令,直接使用左斜杠符号(/)。如果命令不以分号结尾,该命令只是写入缓存保存起来,但并不执行。
Oracle中的权限
系统权限是指执行特定类型的SQL命令的权力,用于控制用户执行的一个或一类数据库操作
系统权限 作用 CREATE SESSION 连接到数据库 CREATE TABLE 建表 CREATE TABLESPACE 建立表空间 CREATE VIEW 建立视图 CREATE SEQUENCE 建立序列 CREATE USER 建立用户
Oracle中的角色
什么是角色(role)
如果多个用户需要相同的多个权限,那么为每个用户分别赋予多个权限是繁琐的。为此可以将多个权限组合为一个角色,将角色赋予多个用户,就使得每个用户都有了相同的权限。
角色是一组相关权限的集合,使用角色最主要的目的是简化权限管理。
三个标准角色
connect role(连接角色)
- –临时用户,特指不需要建表的用户,通常只赋予他们connect role.
- –connect是使用oracle简单权限,这种权限只对其他用户的表有访问权限,包括select/insert/update和delete等。
- –拥有connect role 的用户还能够创建表、视图、序列(sequence)、簇(cluster)、同义词(synonym)、回话(session)和其他 数据的链(link)
resource role(资源角色)
- -更可靠和正式的数据库用户可以授予resource role。
- –resource提供给用户另外的权限以创建他们自己的表、序列、过程(procedure)、触发器(trigger)、索引(index)和簇(cluster)。
dba role(数据库管理员角色)
- –dba role拥有所有的系统权限
- –包括无限制的空间限额和给其他用户授予各种权限的能力。system由dba用户拥有
ql/sql developer 客户端连接三种身份或者说角色
sysoper
即数据库操作员,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制。
sysdba
即数据库管理员,权限包括:打开数据库服务器、关闭数据库服务器、备份数据库、恢复数据库、日志归档、会话限制、管理功能、创建数据库。sys用户必须用sysdba身份才能登录,system用户可以用普通身份登录。
normal
即普通用户,权限只有查询某些数据表的数据。默认的身份是normal用户。
Oracle中的用户
MySql和Oracle
- Oracle:一个项目对应一个用户【一般一个数据库里面有很多用户 用户下面有很多表】
- MySql:一个项目对应一个数据库
虽然一个Oracle数据库服务器中可以安装多个数据库,但是一个数据库需要占用非常大的内存空间,因此一般一个服务器只安装一个数据库。每一个数据库可以有很多用户,不同的用户拥有自己的数据库对象(比如:数据库表),一个用户如果访问其他用户的数据库对象,必须由对方用户授予一定的权限。不同的用户创建的表,只能被当前用户访问。因此在Oracle开发中,不同的应用程序只需使用不同的用户访问即可。
sysdba角色的用户
- 用户:sys,密码:change_on_install
- 用户:system,密码:manager
推荐使用system用户
思考:如果一个公司的数据库账户的密码丢失了,怎么办?
答:登录本机可以任意密码,然后修改用户密码【本机上可以输入任意密码去登录数据库,但是远程不可以】
normal角色的用户scott
同时Oracle为程序测试提供了一个普通用户scott,XE版本默认没有附带scott用户,可自行导入scott用户到oracle中
前提条件:使用system用户登录
导入scott用户
第一步:找到scott.sql脚本
在oracle
安装路径下找到scott.sql
脚本文件,该文件位于oracle\product\11.2.0\server\rdbms\admin
目录下
第二步:使用@导入scott脚本
@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\scott.sql
第三步:重置密码和登录状态
alter user scott identified by tiger;
alter user scott account unlock;
用户:scott,密码:tiger
该用户下包含四张表,用于学习使用。
- 部门表:dept
desc dept; --查看dept表结构
№ | 名称 | 类型 | 描述 |
---|---|---|---|
1 | DEPTNO | NUMBER(2) | 表示部门编号,由两位数字所组成 |
2 | DNAME | VARCHAR2(14) | 部门名称,最多由14个字符所组成 |
3 | LOC | VARCHAR2(13) | 部门所在的位置 |
select * from dept;
- 雇员表:emp
desc emp; --查看emp表结构
№ | 名称 | 类型 | 描述 |
---|---|---|---|
1 | EMPNO | NUMBER(4) | 雇员的编号,由四位数字所组成 |
2 | ENAME | VARCHAR2(10) | 雇员的姓名,由10位字符所组成 |
3 | JOB | VARCHAR2(9) | 雇员的职位 |
4 | MGR | NUMBER(4) | 雇员对应的领导编号,领导也是雇员 |
5 | HIREDATE | DATE | 雇员的雇佣日期 |
6 | SAL | NUMBER(7,2) | 基本工资,其中有两位小数,五倍整数,一共是七位 |
7 | COMM | NUMBER(7,2) | 奖金,佣金 |
8 | DEPTNO | NUMBER(2) | 雇员所在的部门编号 |
select * from emp;
- 工资等级表:salgrade
desc salgrade; --查看salgrade表结构
№ | 名称 | 类型 | 描述 |
---|---|---|---|
1 | GRADE | NUMBER | 工资的等级 |
2 | LOSAL | NUMBER | 此等级的最低工资 |
3 | HISAL | NUMBER | 此等级的最高工资 |
select * from salgrade;
- 工资表:bonus
desc bonus; --查看bonus表结构
№ | 名称 | 类型 | 描述 |
---|---|---|---|
1 | ENAME | VARCHAR2(10) | 雇员姓名 |
2 | JOB | VARCHAR2(9) | 雇员职位 |
3 | SAL | NUMBER | 雇员的工资 |
4 | COMM | NUMBER | 雇员的奖金 |
select * from bonus;
自定义用户
在开发项目时,需要为项目创建用户
创建用户
-
语法:
CREATE USER 用户名 IDENTIFIED BY 密码(口令) [ACCOUNT LOCK/UNLOCK]
-
CREATE USER GPB IDENTIFIED BY 123 ACCOUNT LOCK; -- 账户不能数字什么的开头
加锁/解锁用户
-
语法:
ALTER USER 用户名 ACCOUNT LOCK/UNLOCK;
-
ALTER USER GPB ACCOUNT UNLOCK;
修改密码
-
语法:
ALTER USER 用户名 IDENTIFIED BY 新密码(新口令);
-
ALTER USER GPB IDENTIFIED BY 123456;
删除用户
-
语法:
DROP USER 用户名
-
DROP USER GPB;
用户的角色
尽管用户成功创建,但是还不能正常的登录Oracle数据库系统,因为该用户还没有任何权限。如果用户能够正常登录,至少需要CREATE SESSION系统权限。一般情况下,一个普通的用户(如scott),拥有CONNECT和RESOURCE两个角色即可进行常规的数据库开发工作。
授予权限
语法:GRANT角色|权限 TO 用户(角色)
GRANT CONNECT TO TOM;
GRANT RESOURCE TO TOM;
赋予TOM
用户Connect
角色和Resource
角色后,jerry用户就可以正常开发工作了。
回收权限
REVOKE 角色|权限 FROM 用户(角色)
REVOKE CONNECT FROM TOM;
REVOKE RESOURCE FROM TOM;
-- 写一起
GRANT CONNECT, RESOURCE,DBA TO TOM;
REVOKE DBA FROM TOM;
授权其他用户访问表
语法:grant 权限 on 表 to 用户
eg:scott用户的dept表授权给kaifamiao
用户
grant all on dept to kaifamiao;
eg:kaifamiao
用户查看scott用户的dept表
select * from scott.dept;
提示:必须写用户.表名,例如本例中的scott.dept;
请输入用户名: SYSTEM
输入口令:
连接到:
Oracle Database 11g Express Edition Release
SQL> grant all on kaifamiao.infos to scott;
授权成功。
SQL> exit;
从 Oracle Database 11g Express Edition Relea
D:\Tool\cmder>sqlplus
SQL*Plus: Release 11.2.0.2.0 Production on
Copyright (c) 1982, 2014, Oracle. All righ
请输入用户名: scott
输入口令:
连接到:
Oracle Database 11g Express Edition Release
SQL> select * from infos;
select * from infos
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> select * from scott.infos;
select * from scott.infos
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> select * from kaifamiao.infos;
未选定行
SQL>
命令小结
-- 查看数据库的版本
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
-- 单行注释
/**
多行注释
*/
-- 创建用户
语法:CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK]
eg: CREATE USER LZY IDENTIFIED BY 123 ACCOUNT UNLOCK;
-- 赋于用户数据库角色(CONNECT角色|RESOURCE角色|DBA角色)
语法:GRANT 角色|权限 TO 用户
eg: GRANT CONNECT, RESOURCE, DBA TO LZY;
-- 回收权限的语法
语法:REVOKE 角色|权限 FROM 用户
eg: REVOKE DBA FROM LZY;
-- 修改密码
语法:ALTER USER 用户名 IDENTIFIED BY 新密码
eg: ALTER USER LZY IDENTIFIED BY 456;
-- 修改用户处于锁定(非锁定)状态
eg: ALTER USER LZY ACCOUNT LOCK;
-- dual虚拟表(dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情。)
SELECT SYSDATE,SYSTIMESTAMP FROM dual; -- 获得系统时间
SELECT SYS_CONTEXT('USERENV','TERMINAL') FROM dual;-- 获得主机名
select * from all_tables where owner='SCOTT';-- TEST为用户名,用户名必须是大写。
-- 查看当前登录的用户的表:
select table_name from user_tables;
Oracle数据类型
部分常用数据类型
类型 | 含义 |
---|---|
CHAR(length) | 存储固定长度的字符串。参数length指定了长度,如果存储的字符串长度小于length,用空格填充。默认长度是1,最长不超过2000字节。 |
VARCHAR2(length) | 存储可变长度的字符串。length指定了该字符串的最大长度。默认长度是1,最长不超过4000字符。 |
NUMBER(p,s) | 既可以存储浮点数,也可以存储整数,p表示数字的最大位数(如果是小数包括整数部分和小数部分和小数点,p默认是38位),s是指小数位数。 |
DATE | 存储日期和时间,存储纪元、4位年、月、日、时、分、秒,存储时间从公元前4712年1月1日到公元后4712年12月31日。 |
TIMESTAMP | 不但存储日期的年月日,时分秒,以及秒后6位,同时包含时区。 |
CLOB | 存储大的文本,比如存储非结构化的XML文档 |
BLOB | 存储二进制对象,如图形、视频、声音等。 |
小贴士:
-
MySql的DATE:年月日
-
DATETIME:年月日时分秒
-
MySQL字符串:varchar类型
-
Oracle字符串:varchar2:类型
问题
- char 和 varchar2 的区别
- char:固定长度 你给多大 他就存多大 多余的空格补上
- varchar2:可变长度 你给多少 他用多少 多了不用 少了存不进去
- 两者都存字符串
NUMBER类型示例
格式 | 输入的数字 | 实际的存储 |
---|---|---|
NUMBER | 1234.567 | 1234.567 |
NUMBER(6,2) | 123.4567 | 123.46 |
NUMBER(4,2) | 12345.67 | 输入的数字超过了所指定的精度,数据库不能存储 |
日期类型
对于日期类型,可以使用sysdate
内置函数可以获取当前的系统日期和时间,返回DATE
类型,用systimestamp
函数可以返回当前日期、时间和时区。
创建表和约束
创建infos表(学生表)
CREATE TABLE INFOS
(
STUID VARCHAR2(7) NOT NULL, --学号 学号=‘S’+班号+2位序号
STUNAME VARCHAR2(10) NOT NULL, --姓名
GENDER VARCHAR2(4) NOT NULL, --性别
AGE NUMBER(2) NOT NULL, --年龄
SEAT NUMBER(2) NOT NULL, --座号
ENROLLDATE DATE, --入学时间
STUADDRESS VARCHAR2(50) DEFAULT '地址不详', --住址
CLASSNO VARCHAR2(4) NOT NULL --班号 班号=学期序号+班级序号
)
/
ALTER TABLE INFOS ADD CONSTRAINT PK_INFOS PRIMARY KEY(STUID)
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_GENDER
CHECK(GENDER = '男' OR GENDER = '女')
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_SEAT
CHECK(SEAT >=0 AND SEAT <=50)
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_AGE
CHECK(AGE >=0 AND AGE<=100)
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_CLASSNO
CHECK((CLASSNO >='1001' AND CLASSNO<='1999') OR
(CLASSNO >='2001' AND CLASSNO<='2999'))
/
ALTER TABLE INFOS ADD CONSTRAINT UN_STUNAME UNIQUE(STUNAME)
/
解析:
- 创建了infos表
- STUID列添加了主键约束
- GENDER添加了check约束,只允许填写“男”和“女”
- SEAT列添加了check约束,只允许在0到50之间
- AGE列添加了check约束,只允许在0到100之间
- CLASSNO列添加了check约束,只允许在2001到2999之间
创建scores表(成绩表)
CREATE TABLE SCORES
(
ID NUMBER , --ID
TERM VARCHAR2(2), --学期 S1或S2
STUID VARCHAR2(7) NOT NULL, --学号
EXAMNO VARCHAR2(7) NOT NULL, --考号 E+班号+序号
WRITTENSCORE NUMBER(4,1) NOT NULL, --笔试成绩
LABSCORE NUMBER(4,1) NOT NULL --机试成绩
)
/
ALTER TABLE SCORES
ADD CONSTRAINT CK_SCORES_TERM CHECK(TERM = 'S1' OR TERM ='S2')
/
ALTER TABLE SCORES
ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID)
/
解析:
- TERM列添加了check约束,其值为S1或者S2
- STUID列设置为外键列,引用了INFOS表的STUID列
创建 emp和dept表:
D:\Tool\cmder>sqlplus
SQL*Plus: Release 11.2.0.2.0 Production on 星期一 10月 18 20:26:17 2021
Copyright (c) 1982, 2014, Oracle. All rights reserved.
请输入用户名: kaifamiao
输入口令:
连接到:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> CREATE TABLE DEPT(deptid int, deptname varchar2(20), deptaddr varchar2(13), datetime date);
表已创建。
SQL> ALTER TABLE DEPT ADD CONSTRAINT pk_deptid PRIMARY KEY(deptid);
表已更改。
SQL> CREATE TABLE EMP(empid int, deptid int, empname varchar2(20), job varchar2(20), manager int, entrydate date, salary float, bonus float);
表已创建。
SQL> ALTER TABLE EMP ADD CONSTRAINT pk_empid PRIMARY KEY(empid);
表已更改。
SQL> ALTER TABLE EMP ADD CONSTRAINT fk_deptid FOREIGN KEY(deptid) REFERENCES DEPT(deptid);
表已更改。
SQL>
CRUD操作
1、数据操纵语言(DML):用来操纵数据库中数据的命令。包括:select、insert、update、delete。
2、数据定义语言(DDL):用来建立数据库、数据库对象和定义列的命令。包括:create、alter、drop。
3、数据控制语言(DCL):用来控制数据库组件的存取许可、权限等的命令。包括:grant、deny、revoke。
4、其他语言元素:如流程控制语言、内嵌函数、批处理语句等。
MySql和Oracle中几个Sql的差距
日期值
- MySql中插入日期:
insert into tablename (date) values('2021-10-10'), values('2000-10-01');
- Oracle:
insert into tablename (date) values(to_date(‘2021-10-10 13:13:13’,’YYYY-MM-DD HH24:MI:SS’));
- Oracle不可连着插值 日期用 to_date 函数处理插入 年月日时分秒
自增长
-
MySql:自带
auto_increment
自增约束 -
Oracle:得自定义一个序列(Sequence)来定义自增长
CREATE SEQUENCE myseq; SELECT myseq.nextval from dual;-- 自增的序号【序号加一】 select myseq.currval from dual;-- 当前的序号【序号不变】
插入数据
INSERT INTO "INFOS" VALUES ('s100102', '林冲', '男', '22', '2', TO_DATE('2009-08-09 06:30:10', 'YYYY-MM-DD HH24:MI:SS'), '西安', '1001');
INSERT INTO "INFOS" VALUES ('s100104', '阮小二', '男', '26', '3', TO_DATE('2021-10-18 21:16:10', 'YYYY-MM-DD HH24:MI:SS'), '', '1001');
解析:
- insert语句默认把数据插入到了缓存中,没有直接插入到库中。
- commit是把用户操作(添加、删除、修改操作)提交,只有提交操作后,数据才能真正更新到表中,否则其他用户无法查询到当前用户操作的结果。
- 它不能和mysql一样多条数据一起插入,只能一条一条的insert
查询数据
SELECT STUNAME,GENDER,AGE,STUADDRESS
FROM INFOS
WHERE GENDER='男' ORDER BY AGE
尝试一下分页查询
SELECT * FROM
(
select rownum as r ,t.* from dept t where rownum<=4
)
where r > 2
数据更新
SQL> UPDATE INFOS SET CLASSNO='1002',STUADDRESS='山东莱芜'
WHERE STUNAME='阮小二';
1 rows updated
SQL> commit;
删除数据
SQL> DELETE FROM INFOS WHERE STUID='s100102';
1 ROW DELETED
SQL> COMMIT;
除了Delete语句删除数据外,truncate语句也可以删除语句
truncate table infos;
TRUNCATE
命令可以把表中的所有数据一次性全部删除。
TRUNCATE
和DELETE
都能把表中的数据全部删除,他们的区别是:
TRUNCATE
是DDL命令,删除的数据不能恢复;DELETE
命令是DML命令,删除后的数据可以通过日志文件恢复。- 如果一个表中数据记录很多,
TRUNCATE
相对DELETE
速度快。 - 由于
TRUNCATE
命令比较危险,因此在实际开发中,TRUNCATE
命令慎用。
尝试一下分页查询
SELECT * FROM
(
select rownum as r ,t.* from dept t where rownum<=4
)
where r > 2
数据更新
SQL> UPDATE INFOS SET CLASSNO='1002',STUADDRESS='山东莱芜'
WHERE STUNAME='阮小二';
1 rows updated
SQL> commit;
删除数据
SQL> DELETE FROM INFOS WHERE STUID='s100102';
1 ROW DELETED
SQL> COMMIT;
除了Delete语句删除数据外,truncate语句也可以删除语句
truncate table infos;
TRUNCATE
命令可以把表中的所有数据一次性全部删除。
TRUNCATE
和DELETE
都能把表中的数据全部删除,他们的区别是:
TRUNCATE
是DDL命令,删除的数据不能恢复;DELETE
命令是DML命令,删除后的数据可以通过日志文件恢复。- 如果一个表中数据记录很多,
TRUNCATE
相对DELETE
速度快。 - 由于
TRUNCATE
命令比较危险,因此在实际开发中,TRUNCATE
命令慎用。
标签:--,数据库,用户,XE,SQL,Oracle,权限 来源: https://blog.csdn.net/qq_43636709/article/details/120873673