Oracle讲解
导出数据/导入数据
6.1 导出数据
导出整个数据库中的对象,需要特定的权限,比如管理员 DOS命令行完成导入导出
Exp system/manager@accp file=FULLDB full=y buffer=32768; 导出SCOTT模式下的所有对象
Exp scott/tiger@accp file=scott_back owner=scott; 以表的形式把数据导出成文件
EXP scott/tiger@accp tables=(emp,dept) file=文件路径 ;*.dmp
6.2 导入数据
IMP accp/accp@accp file=item_back.dmp ignore=y full=y; 导入文件:
imp accp/accp@orcl tables=(t1,t2,...) file=文件路径 ignore=y // ignore=y如果表存在就不用创建,而是直接导入数据到此表 将SCOTT用户的表导入MARTIN用户
Imp system/aptech@accp file=scott_back fromuser=scott touser=martin tables=(emp,dept)
在.net中使用ORACLE 首先给项目添加引用
System.Data与System.Data.OracleClient OracleConnection conn = new OracleConnection();
conn.ConnectionString = \; conn.Open();
OracleCommand command = conn.CreateCommand(); command.CommandText = \; OracleDataReader reader = command.ExecuteReader(); while (reader.Read()) {
Console.WriteLine(\, reader.GetInt32(0), reader.GetString(1), reader.GetString(2), reader.GetInt32(3)); }
reader.Close(); conn.Close();
在JAVA中使用Oralce,需要添加oracle的jar包
Class.forName(\); Connection
conn=DriverManager.getConnection(\
26
Oracle讲解
orcl\,\,\);
System.out.println(conn);
CallableStatement stm=conn.prepareCall(\); stm.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR); stm.execute();
ResultSet rs=(ResultSet)stm.getObject(1); while(rs.next()){ System.out.println(rs.getInt(1)+\ \+rs.getString(2)); }
conn.close();
Oracle9i的做法:
学校机房里的ORACLE不能启动监听器解决办法需要先通过
Oracle Net Configuration Assistant删除现有监听器,再添加一个新的监听器, 那么新的监听器服务会自动启动。
另外如果需要用程序连接则还要修改net Manager里的服务名称name下的地址为本机IP地址
Oracle10g的做法:
找到C:\\oracle\\product\\10.1.0\\DB_1\\ NETWORK\\ADMIN\\目录下的listener.ora和tnsnames.ora文件里的(HOST=自己计算机的名称),然后重启ORACLE服务
创建学员信息表(student)表 列名 stuId stuName stuAge stuEmail stuAddress 课程表(course) 列名 courseId 成绩表(score) 列名 scoreId stuId courseId score 类型 NUMBER(4) NUMBER(4) NUMBER(2) NUMBER(4,2) 描述 从1开始,自动增长1,主键 外键,引用student表的主键 外键,引用course表的主键 1到100之间 类型 NUMBER(2) 描述 从1开始,自动增长1,主键 类型 NUMBER(4) NUMBER(2) 描述 从1001开始,自动增长1,主键 16到45之间的数字 VARCHAR2(20) 非空 VARCHAR2(20) Email地址必须包含@ VARCHAR2(50) 默认值为’荆州’ courseName VARCHAR2(20) 非空 --查询每个学员的总成绩 27
Oracle讲解
SELECT stuId 学号,SUM(score) 总成绩 FROM score GROUP BY stuId ORDER BY 总成绩 DESC;
--查询JAVA成绩的前三名
SELECT score java成绩 FROM score WHERE courseId=1 AND rownum<=3; --查询地址为空的学员
SELECT * FROM stduent WHERE stuAddress IS NULL;
--查询学员的SQL成绩并显示学号、SQL成绩、以及学员姓名 SELECT sco.score SQL成绩,sco.stuId 学号,stu.stuName 姓名 FROM student stu INNER JOIN score sco
ON(stu.stuId=sco.stuId) WHERE sco.courseId=2; --查询哪些学生没有参加考试
SELECT sco.score HTML成绩,sco.stuId 学号,sco.courseId 课程编号,stu.stuName 姓名 FROM student stu LEFT JOIN score sco
ON(stu.stuId=sco.stuId) WHERE sco.score IS NULL; --等价于
SELECT sco.score HTML成绩,sco.stuId 学号,sco.courseId 课程编号,stu.stuName 姓名 FROM student stu,score sco WHERE stu.stuId=sco.stuId(+) AND sco.score IS NULL; --查询显示学员的JAVA成绩,如果成绩<60分 显示’不及格’ 60<=成绩<80 显示’三等’ 80<=成绩<90 显示’二等’ 90<=成绩 显示’一等’ --编写程序,显示从2到100之间的素数 SET SERVEROUTPUT ON; DECLARE n NUMBER(4):=1; i NUMBER(4):=1; BEGIN LOOP n:=n+1; i:=1; LOOP i:=i+1; EXIT WHEN mod(n,i)=0; END LOOP; IF n=i THEN DBMS_OUTPUT.PUT_LINE(n); END IF; EXIT WHEN n=100; END LOOP; END; /
--循环加分,JAVA成绩普遍很低,现都给与加分,但是总分不能超过100分,直到所有人都及格,停止加分。
SET SERVEROUTPUT ON;
28
Oracle讲解
DECLARE
num NUMBER:=0; BEGIN
SELECT count(*) INTO num FROM score WHERE courseId=1 AND score<60; WHILE num>0 LOOP
UPDATE score SET score=100 WHERE courseId=1 AND score>=95; UPDATE score SET score=score+5 WHERE courseId=1 AND score<95;
SELECT count(*) INTO num FROM score WHERE courseId=1 AND score<60; END LOOP; COMMIT; END; /
--使用游标查询并显示学员信息 SET SERVEROUTPUT ON; DECLARE
stuName student.stuName%TYPE;
CURSOR stuName_cur IS SELECT stuName FROM student; BEGIN
OPEN stuName_cur; LOOP
FETCH stuName_cur INTO stuName;
DBMS_OUTPUT.PUT_LINE('姓名: '||stuName); EXIT WHEN stuName_cur%NOTFOUND; END LOOP; CLOSE stuName_cur; END; /
--使用参数游标传递学员学号,查询与之相关的信息 SET SERVEROUTPUT ON; DECLARE
stuRow student%ROWTYPE; stuCode student.stuId%TYPE; CURSOR stuName_cur(stu_Id student.stuId%TYPE) IS SELECT * FROM student WHERE stuId=stu_Id; BEGIN
stuCode:=&请输入学号;
OPEN stuName_cur(stuCode); LOOP
FETCH stuName_cur INTO stuRow;
DBMS_OUTPUT.PUT_LINE('姓名: '||stuRow.stuName||' 年龄:'||stuRow.stuAge); EXIT WHEN stuName_cur%NOTFOUND; END LOOP; CLOSE stuName_cur; END;
29
Oracle讲解
/
--编写过程,接收学员的学号,求出此学员的三门课的平均成绩打印输出。 SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE findStudent ( stu_Id NUMBER ) AS stu_Name VARCHAR2(20); BEGIN SELECT stuName INTO stu_Name FROM student WHERE stuId=stu_Id; DBMS_OUTPUT.PUT_LINE('学生姓名:'||stu_Name); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('学号不存在'); END; /
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE findStudent ( stu_Id NUMBER ) AS stu_Age NUMBER(2); stu_Name VARCHAR2(20); CURSOR my_CUR IS SELECT stuName,stuAge FROM student WHERE stuId>stu_Id; BEGIN OPEN my_CUR; FETCH my_CUR INTO stu_Name,stu_Age; WHILE my_CUR%FOUND LOOP FETCH my_CUR INTO stu_Name,stu_Age; DBMS_OUTPUT.PUT_LINE(stu_Name||' '||stu_Age); END LOOP; CLOSE my_CUR; END; /
--编写过程,带输入参数学号和课程编号,输出参数为这个学生这门课的成绩,如果缺考就为0
SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE findStudent ( stu_Id IN NUMBER, course_Id IN NUMBER, scoreout OUT NUMBER
30