oracle测试小例子[你会几个?]

本文详细介绍了如何在数据库管理系统中创建用户、授权权限、执行SQL查询及操作表数据,包括创建用户并设置连接、创建表权限、访问其他用户表、执行特定条件查询以及通过过程实现复杂操作等。
1.创建一个名称为test的用户,并授权其连接数据库和创建表的权限,同时授权访问另一个用户scott的表emp的权限
create user test identified by 111;
grant connect to test;
grant create table to test;
grant select on scott.emp to test; 


2. 针对scott用户emp表编写语句,只有当最低工资少于2000而且最高工资超过4000时,才显示部门ID以及该部门的最低工资和最高工资

select deptno,min,max from(select min(sal) min,max(sal) max,deptno from emp group by deptno)
where min<2000 and max >4000;


3. 公司决定发年终奖,根据职员的所在部门来计算,如果部门为10的,奖金为2000,部门为20的,奖金为1500,部门为30的奖金为1000,其他的奖金为500。编写一个过程来完成

create or replace procedure pro_addAward
as
begin
update emp set comm=0 where comm is null;
update emp set comm=comm+decode(deptno,10,2000,20,1500,30,1000);
end;


4. 编写代码,提示用户输入姓名。代码应检查用户输入的姓名的长度,如果长度小于2,则代码应引发异常并显示消息“请输入正确的姓名”。否则应显示消息“欢迎”。
create or replace function fun_login
(

--参数不能指定长度!!!!!!!!!
userName varchar2
)
return varchar2--必须有return
as
begin
if(length(userName)>2) then--必须有then
return '欢迎';
else
raise_application_error(-20000,'用户名输入不正确!');--必须有第一个参数
end if;
end;

declare
name varchar2(50):='&name';
begin
Dbms_output.put_line(fun_login(name));--调用函数
end;

5.编写代码,提示用户输入要查看的哪个表的记录,如果用户输入“E”,则显示emp表中empno,ename,job和sal列的值;如果用户输入“D”,则显示dept表中的

deptno,dname和loc列的值
create or replace procedure pro_showInfo
(
word varchar2,
cur_result out sys_refcursor
)
as
v_sql varchar2(500);
begin
case word
when 'E' then
open cur_result for select empno,ename,sal,job from emp;
when 'D' then
open cur_result for select deptno,dname,loc from dept;
else
select * from emp;
end case;
end;


declare
Type emp_record IS RECORD
(
empno emp.empno%type,
ename emp.ename%type,
sal emp.sal%type,
job emp.job%type
);
Type dept_record IS RECORD
(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type
);
cur_word sys_refcursor;
dept_rec dept_record;
emp_rec emp_record;
word varchar2(10):='&word';
begin
pro_showInfo(word,cur_word);
case word
when 'E' then
Dbms_output.put_line('empno          ename         sal          job');
loop
fetch cur_word into emp_rec;
exit when cur_word%notfound;
Dbms_output.put_line(emp_rec.empno||'          '||emp_rec.ename||'          '||emp_rec.sal||'           '||emp_rec.job);
end loop;
when 'D' then
Dbms_output.put_line('deptno          dname          loc');
loop
fetch cur_word into dept_rec;
exit when cur_word%notfound;
Dbms_output.put_line(dept_rec.deptno||'          '||dept_rec.dname||'          '||dept_rec.loc);
end loop;
else
Dbms_output.put_line('不存在!');
end case;
close cur_word;
end;

6.编写一个程序包,包有两个过程和一个函数,第一个过程根据职员编号打印职员姓名,第二个过程根据职员编号打印职员薪水,函数根据职员编号返回职员的入职时间。(此处只完成:第一个过程根据职员编号打印职员姓名,其它例似)

create or replace package emp_package
is
procedure proc_printNamebyEmpNo
(
param_empNo number
);--分号不能掉!!!
end emp_package;

create or replace package body emp_package
as
procedure proc_printNamebyEmpNo
(
param_empNo number
)
as--这里不是;了。
ename emp.ename%type;
empno emp.empno%type;
begin
select a.ename into ename from emp a where a.empno=param_empno;
Dbms_output.put_line('编号为:'||param_empno||'的员工姓名为:'||ename);
exception--捕获异常
when no_data_found then
Dbms_output.put_line('不存在编号为'||param_empno||'的员工!');
end;
end emp_package;

declare
empno varchar2(50):='&empno';
begin
emp_package.proc_printNamebyEmpNo(empno);--调用函数
end;

7.创建一个触发器,无论用户插入新记录,还是修改EMP表的job列,都将用户指定的job列的值转换成大写

create or replace trigger tr_upper_job
before insert or update on emp
for each row
begin
:NEW.job:= upper(:NEW.job);--此处用select into 和set会出错。直接赋值更为简单。
end;


8.将用户scott的所有对象导入到用户test下。

exp scott/111@ORCL file=d:\daochu.dmp full=y
imp scce/111@ORCL file=d:\daochu.dmp fromuser=scott touser=scce ignore=y constraints=y grants=y



<think>首先,用户查询是关于在Oracle数据库中创建一个包含八个字段的表格的例子。系统级指令要求我使用中文回答,确保所有数学表达式使用正确的LaTeX格式,如$...$和$$...$$,并生成相关问题。用户引用了几个引用:[^1]和[^2],这些来自站内引用。引用[^1]提到Oracle创建表的例子,如创建一个简单的员工表。引用[^2]是关于在MySQL中使用AUTO_INCREMENT创建自动递增字段,但在Oracle中不同。用户指定了“Oracle创建8个字段表格示例”,所以我需要提供一个Oracle特定的例子。关键点:-创建一个有八个字段的表。-使用Oracle语法。-参考引用:引用[^1]提到CREATETABLE语句用于定义新表的结构。-引用[^2]是关于MySQL的自动递增,但Oracle使用序列和触发器或IDENTITY列(在较新版本中)。在Oracle中,创建表的基本语法是:```sqlCREATETABLEtable_name(column1datatype[constraints],column2datatype[constraints],...);```对于八个字段的例子,我需要定义一个简单的表结构。例如,一个员工表或类似的东西。用户引用中提到“创建一个简单的员工表”,所以我应该扩展那个例子到八个字段。列出八个字段:1.employee_id(主键)2.first_name3.last_name4.email5.phone_number6.hire_date7.job_id8.salary在Oracle中,对于自动递增字段,可以使用序列或IDENTITY列(在Oracle12c及以后版本)。根据引用[^2],MySQL使用AUTO_INCREMENT,但Oracle不同。我应该使用Oracle的IDENTITY列来简化。例如:```sqlCREATETABLEemployees(employee_idNUMBERGENERATEDBYDEFAULTONNULLASIDENTITYPRIMARYKEY,first_nameVARCHAR2(50),last_nameVARCHAR2(50),emailVARCHAR2(100),phone_numberVARCHAR2(20),hire_dateDATE,job_idVARCHAR2(10),salaryNUMBER(8,2));```这有八个字段:employee_id,first_name,last_name,email,phone_number,hire_date,job_id,salary。employee_id使用IDENTITY列自动递增。现在,回答结构:-结构清晰,逐步解决问题。-使用中文。-在末尾添加引用标识,自然地引用[^1]和[^2]。-生成相关问题。系统级指令说:“回答中引用的段落末尾自然地添加引用标识”,所以我需要在相关部分添加[^1]或[^2]。例如,当提到CREATETABLE语句时,引用[^1]。当讨论自动递增时,引用[^2],但[^2]是关于MySQL的,所以我应该指出Oracle的不同。用户引用[^2]说:“使用MySQL和Oracle数据库创建自动递增字段的实操”,并给出了MySQL例子,但用户要求Oracle,所以我需要提供Oracle例子。引用[^2]的部分内容:“在Oracle数据库中,创建自动递增字段通常需要使用序列(SEQUENCE)和触发器(TRIGGER),或者从Oracle12c开始,可以使用IDENTITY列。”用户提供的引用是:-引用[^1]:Oracle创建表...示例1:创建一个简单的员工表-引用[^2]:使用MySQL和Oracle数据库创建自动递增字段的实操...在MySQL中...但在引用[^2]中,它提到了Oracle,所以我应该参考它。在我的回答中:-先解释CREATETABLE语句。-然后提供一个示例。-自然地添加引用。最后,生成相关问题。相关问题应该基于主题,比如:1.如何添加约束到Oracle表?2.Oracle中创建序列的示例?3.如何修改现有表的结构?确保回答真实可靠。完整回答结构:1.介绍:简要解释CREATETABLE在Oracle中。2.示例:提供代码块创建一个有八个字段的表。3.解释:简要说明字段。4.引用:在适当位置添加引用标识。5.相关问题:在末尾添加相关问题部分。</think>### Oracle 创建包含八个字段的表格示例 在Oracle数据库中,使用`CREATE TABLE`语句可以定义新表的结构,包括列名、数据类型和约束等[^1]。以下我将逐步说明如何创建一个包含八个字段的表格。Oracle支持多种数据类型(如`VARCHAR2`、`NUMBER`、`DATE`),并可通过序列(SEQUENCE)或IDENTITY列(Oracle 12c及以上版本)实现自动递增功能[^2]。本例将创建一个“员工信息表”(`employees`),包含八个常见字段,其中`employee_id`使用IDENTITY列自动生成主键值。 #### 步骤说明 1. **定义表结构**:使用`CREATE TABLE`语句,指定表名和字段列表。 2. **设置数据类型**:根据字段属性选择合适的数据类型(如文本用`VARCHAR2`,数字用`NUMBER`,日期用`DATE`)。 3. **添加约束**:如`PRIMARY KEY`确保主键唯一性,`NOT NULL`防止空值。 4. **实现自动递增**:在Oracle 12c及以上版本,可直接使用`GENERATED BY DEFAULT AS IDENTITY`简化自动递增[^2]。 #### 示例代码 以下SQL语句创建一个包含八个字段的`employees`表。字段包括员工ID、姓名、联系方式、雇佣信息和薪资等。 ```sql CREATE TABLE employees ( employee_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, -- 员工ID(自动递增主键) first_name VARCHAR2(50) NOT NULL, -- 名字(非空) last_name VARCHAR2(50) NOT NULL, -- 姓氏(非空) email VARCHAR2(100) UNIQUE, -- 邮箱(唯一) phone_number VARCHAR2(20), -- 电话号码 hire_date DATE DEFAULT SYSDATE, -- 雇佣日期(默认当前日期) job_id VARCHAR2(10), -- 职位ID salary NUMBER(8,2) CHECK (salary > 0) -- 薪资(需大于0) ); ``` #### 字段解释 - **employee_id**: 主键字段,使用`GENERATED BY DEFAULT AS IDENTITY`自动生成唯一ID(从1开始递增)。 - **first_name** 和 **last_name**: 文本字段,`NOT NULL`约束确保不能为空。 - **email**: 唯一约束(`UNIQUE`)防止重复邮箱。 - **phone_number**: 可选字段,存储联系方式。 - **hire_date**: 日期字段,`DEFAULT SYSDATE`设置默认值为当前系统日期。 - **job_id**: 职位标识符,使用短文本存储。 - **salary**: 数字字段,`NUMBER(8,2)`表示最多8位数字(含2位小数),`CHECK`约束确保薪资大于0。 #### 注意事项 - **Oracle版本**:如果使用Oracle 11g或更早版本,无法直接使用IDENTITY列。需通过序列和触发器实现自动递增[^2],例如: ```sql CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1; CREATE OR REPLACE TRIGGER emp_trigger BEFORE INSERT ON employees FOR EACH ROW BEGIN SELECT emp_seq.NEXTVAL INTO :new.employee_id FROM DUAL; END; ``` - **执行SQL**:在Oracle SQL*Plus或SQL Developer工具中运行上述代码即可创建表。 - **验证结果**:使用`DESCRIBE employees;`查看表结构,或插入测试数据验证(如`INSERT INTO employees (first_name, last_name, email) VALUES ('张', '三', 'zhangsan@example.com');`)。 此示例基于Oracle标准实践,确保数据完整性和高效管理[^1]。如果您需要调整字段或添加更多约束(如外键),可修改SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值