Oracle经典案例代码
- 格式:pdf
- 大小:78.32 KB
- 文档页数:7
oracle函数循环写法在Oracle数据库中,可以使用PL/SQL(Procedural Language/Structured Query Language)语言来编写存储过程和函数,实现循环等复杂逻辑。
下面将演示在Oracle中使用PL/SQL编写循环的基本写法,以及一些常见的循环类型。
1. 基本循环写法DECLARE--变量声明counter NUMBER:=1;BEGIN--简单循环FOR counter IN1..5LOOP--打印计数器的值DBMS_OUTPUT.PUT_LINE('Counter: '||counter);END LOOP;END;/上述代码演示了一个简单的循环,使用FOR counter IN 1..5 LOOP语句,计数器counter从1递增到5,循环体内打印计数器的值。
2. WHILE 循环DECLARE--变量声明counter NUMBER:=1;BEGIN--WHILE 循环WHILE counter <=5LOOP--打印计数器的值DBMS_OUTPUT.PUT_LINE('Counter: '||counter);--计数器递增counter :=counter +1;END LOOP;END;/这是一个使用WHILE循环的例子,计数器从1开始,当计数器小于等于5时,循环体内执行打印和递增计数器的操作。
3. LOOP 循环DECLARE--变量声明counter NUMBER:=1;BEGIN--LOOP 循环LOOP--打印计数器的值DBMS_OUTPUT.PUT_LINE('Counter: '||counter);--计数器递增counter :=counter +1;--退出条件EXIT WHEN counter >5;END LOOP;END;/在上述例子中,使用LOOP关键字来创建一个无限循环,通过EXIT WHEN语句设定退出条件,当计数器大于5时退出循环。
ORA-3113错误就是说连接到数据库的网络中断了。
就我的经验来说,出现这个问题的地方可能有两个。
第一,客户机和数据库之间的网络中断了。
第二,数据库中的bug 造成了会话的中断并且客户认为网络错误就造成上述问题的主要原因有些错误由于频繁出现、原因复杂而被Oracle DBA 们戏称之为"经典的错误"。
其中ORA-3113 "end of file on communication channel" 就是这样的一个。
我们可以简单的把这个错误理解为Oracle客户端进程和数据库后台进程连接中断。
不过,导致这个错误的原因实际上有很多种:对数据库设置不当、任何能导致数据库后台进程崩溃的行为都可能产生这个错误。
此外,该错误出现的场景复杂,可能出现在:∙启动的Oracle的时侯∙试图创建数据库的时侯∙试图对数据库进行连接的时侯∙在客户端正在运行SQL/PL/SQL的时侯∙备份/恢复数据库的时侯∙其它一些情况下......错误原因种种根据网络上大家反映的情况来看,错误原因大约有这些:∙Unix核心参数设置不当∙Oracle执行文件权限不正确/环境变量问题∙客户端通信不能正确处理∙数据库服务器崩溃/操作系统崩溃/进程被kill∙Oracle 内部错误∙特定SQL、PL/SQL引起的错误∙空间不够∙防火墙的问题∙其它原因在开始解决问题之前,作如下几件事情:∙回忆一下在出现错误之前你都做了什么操作,越详细越好;∙查看background_dump_dest 目录中的alertSID.log 文件也是你必须要的事情;∙用Google搜索一下,在互联网上有很多信息等着你去发现,不要什么都问别人。
当然, 如果你找到了一些对你更有帮助的东西--这篇文档就不用看了:-)1) Unix核心参数设置不当/ init参数设置不当如果数据库在安装过程中没有设定正确的操作系统核心变量,可能在安装数据库文件的时侯没甚么问题,在创建数据库的时侯常常会出现03113错误。
oracle实例练习1.用sys账户登录,解锁scott账户代码:Connect sys/orcl@orcl_client AS SYSDBAALTER USER "SCOTT" ACCOUNT UNLOCK2.以scott身份登录数据库conn scott/tiger@orcl3.创建学生表student(sno,sname,sgender,sbirthday,sadd) score(sno,math,english) 代码:create table student(sno char(3),sname varchar2(10),sgender char2(20),sbirthday date,sadd varchar2(50))create table score(sno char(3),math number(4,1),english number(4,1))4.插入记录student插入记录:001,小张,女,1980-8-20,济南002,小王,男,1983-4-1,莱芜003,小李,女,1980-5-20,济南004,小赵,女,1980-5-20,莱芜005, 小孔, 女, 1982-6-18 威海score插入记录:(005没参加考试,800是个进修生,不是学校的正式生)001,90,92002,85,79003,80,94004,78,77800 79, 88代码:alter session set nls_date_format ='YYYY-MM-DD HH24:MI:SS';insert into student values('001','小张','女',to_date('1980-08-20','yyyy-mm-dd'),'济南');insert into student values('002','小王','男',to_date('1983-04-01','yyyy-mm-dd'),'莱芜');insert into student values('003','小李','女',to_date('1980-05-20','yyyy-mm-dd'),'济南');insert into student values('004','小赵','女',to_date('1980-05-20','yyyy-mm-dd'),'莱芜');insert into student values('005','小孔','女',to_date('1982-06-18','yyyy-mm-dd'),'威海');insert into score values('001','90','92');insert into score values('002','85','79');insert into score values('003','80','94');insert into score values('004','78','77');insert into score values('800','79','88');5.a统计各个地区的学生数b计算各个学生的总成绩(数学+英语),并且按照成绩由高到低做出学生的成绩单报告(没考试的学生名字不要出现在报告单上,进修生的成绩也不在报告单上)报告单标题显示:学号姓名数学英语总成绩c计算各个学生的总成绩(数学+英语),并且按照成绩由高到低做出学生的成绩单报告(没考试的学生名字也要出现在报告单上,进修生的成绩不在报告单上)报告单标题显示:学号姓名数学英语总成绩代码:select sadd 地区,count(*) as 人数from student group by saddselect student.sno 学号, sname 姓名, math 数学, english 英语, (math+english) 总成绩from student inner join score on score where student.sno=score.sno order by 总成绩descselect student.sno 学号, sname 姓名, math 数学, english 英语, math+english 总成绩from student left outer join score onstudent.sno=score.sno order by 总成绩desc或select student.sno 学号, sname 姓名, math 数学,english 英语, (math+english) 总成绩from student,score where student.sno=score.sno(+) order by 总成绩desc;6.根据student表,创建一个新表student_copy(结构相同,数据只有济南的两个学生)从student表中查出莱芜得同学信息,插入到student_copy表中commit//提交刚才的插入代码:create table student_copy as select * from student Where sadd='济南';insert into student_copy(select * from student where sadd='莱芜');commit;7.插入一条新的学生纪录:006 小林男1979-7-9 泰安savepoint a //设置保存点a删除掉学号为003的学生纪录(误删)rollback to savepoint a察看结果commit(提交插入纪录的操作)/rollback(回滚到插入006记录前的数据状态)代码:insert into student values('006','小林','男',to_date('1979-07-09','yyyy-mm-dd'),'泰安');select * from student;savepoint a;delete from student where sno='003';rollback to savepoint a;select * from student;commit;/rollback;8.修改student_copy表名为student2删除表student2的数据(注意delete/truncate的区别)删除表student,score,student2代码:rename student_copy to student2;delete from student2;rollback;select * from student2;truncate table student2;rollback;select * from student2;drop table student;drop table score;drop table student2;9.创建100个表,table_0到table_99,分别插入数据,第1条数据插入到第1个表。
Oracle_存储过程exception异常处理大全及实例经典最终异常处理是编程中非常重要的一部分,它允许我们处理代码中可能出现的错误和异常情况,以确保程序的稳定性和正确性。
在Oracle存储过程中,我们可以使用异常处理来捕获并处理各种类型的异常。
下面是Oracle存储过程中常见的一些异常以及它们的处理方式:1.NO_DATA_FOUND:当SELECT语句或游标未找到任何数据时引发此异常。
通常使用一个特殊值或条件来处理这种异常,例如使用NULL值或设置默认值。
示例:```sqlDECLAREv_data NUMBER;BEGINSELECT column INTO v_data FROM table WHERE condition;--处理数据EXCEPTIONWHENNO_DATA_FOUNDTHENv_data := 0; -- 设置默认值为0END;```2.TOO_MANY_ROWS:当SELECT语句或游标返回多行数据时引发此异常。
通常使用限制条件来确保只返回一行数据,或者使用游标来处理多行数据。
示例:```sqlDECLARECURSOR c_data IS SELECT column FROM table WHERE condition;v_data NUMBER;BEGINOPEN c_data;FETCH c_data INTO v_data;IF c_data%FOUND THEN--处理数据...ELSE--处理异常情况...ENDIF;CLOSE c_data;EXCEPTIONWHENTOO_MANY_ROWSTHEN--处理异常情况...END;```3.DUP_VAL_ON_INDEX:当INSERT或UPDATE语句违反唯一性约束时引发此异常。
通常使用异常处理块来处理该异常或使用MERGE语句来处理重复数据。
示例:```sqlBEGININSERT INTO table (column1, column2) VALUES (value1, value2);EXCEPTIONWHENDUP_VAL_ON_INDEXTHEN--处理异常情况...END;```4.VALUE_ERROR:当数据类型转换错误或算术溢出时引发此异常。
oracle查询实例命令以下是一些Oracle数据库中常用的查询实例命令示例:1.查询表的所有数据:SELECT * FROM table_name;2.查询指定列的数据:SELECT column1, column2, ... FROM table_name;3.查询满足特定条件的数据:SELECT * FROM table_name WHERE condition;4.对结果进行排序:SELECT * FROM table_name ORDER BY column_name [ASC|DESC];5.使用聚合函数进行数据统计:SELECT COUNT(*) FROM table_name; -- 统计行数SELECT SUM(column_name) FROM table_name; -- 求和SELECT AVG(column_name) FROM table_name; -- 平均值SELECT MAX(column_name) FROM table_name; -- 最大值SELECT MIN(column_name) FROM table_name; -- 最小值6.连接多个表进行查询:SELECT t1.column1, t2.column2 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id;7.使用条件进行分组:SELECT column1, COUNT(*) FROM table_name GROUP BY column1;8.使用LIKE进行模糊查询:SELECT * FROM table_name WHERE column_name LIKE 'keyword%';以上只是一些常见的查询示例,实际查询命令会根据具体的表结构和查询需求而有所不同。
在使用Oracle数据库时,请根据具体情况和需求构建和调整查询语句。
C#Oracle数据库操作类实例详解本⽂所述为C#实现的Oracle数据库操作类,可执⾏超多常⽤的Oracle数据库操作,包含了基础数据库连接、关闭连接、输出记录集、执⾏Sql语句,返回带分页功能的dataset 、取表⾥字段的类型和长度等,同时还有哈稀表⾃动插⼊数据库等⾼级任务。
需要特别指出的是:在执⾏SQL语句,返回 DataReader之前⼀定要先⽤.read()打开,然后才能读到数据,再⽤hashTable对数据库进⾏insert,update,del操作,注意此时只能⽤默认的数据库连接"connstr"。
本⽂所述为C#实现的Oracle数据库操作类,可执⾏超多常⽤的Oracle数据库操作,包含了基础数据库连接、关闭连接、输出记录集、执⾏Sql语句,返回带分页功能的dataset 、取表⾥字段的类型和长度等,同时还有哈稀表⾃动插⼊数据库等⾼级任务。
需要特别指出的是:在执⾏SQL语句,返回 DataReader之前⼀定要先⽤.read()打开,然后才能读到数据,再⽤hashTable对数据库进⾏insert,update,del操作,注意此时只能⽤默认的数据库连接"connstr"。
完整的C# Oracle数据库类实例代码如下:using System;using System.Data;using System.Data.OracleClient;using System.Collections;using System.Reflection;namespace MyOraComm{/// ConnDbForOracle 的摘要说明。
public class ConnForOracle{protected OracleConnection Connection;private string connectionString;public ConnForOracle(){string connStr;connStr = System.Configuration.ConfigurationSettings.AppSettings["connStr"].ToString();connectionString = connStr;Connection = new OracleConnection(connectionString);}#region 带参数的构造函数/// 带参数的构造函数/// 数据库联接字符串public ConnForOracle(string ConnString){string connStr;connStr = System.Configuration.ConfigurationSettings.AppSettings[ConnString].ToString();Connection = new OracleConnection(connStr);}#endregion#region 打开数据库/// 打开数据库public void OpenConn(){if(this.Connection.State!=ConnectionState.Open)this.Connection.Open();}#endregion#region 关闭数据库联接/// 关闭数据库联接public void CloseConn(){if(Connection.State==ConnectionState.Open)Connection.Close();}#endregion#region 执⾏SQL语句,返回数据到DataSet中/// 执⾏SQL语句,返回数据到DataSet中/// sql语句/// ⾃定义返回的DataSet表名/// 返回DataSetpublic DataSet ReturnDataSet(string sql,string DataSetName){DataSet dataSet=new DataSet();OpenConn();OracleDataAdapter OraDA=new OracleDataAdapter(sql,Connection);OraDA.Fill(dataSet,DataSetName);// CloseConn();return dataSet;}#endregion/// Sql语句/// 每页显⽰记录数/// <当前页/param>/// 返回dataset表名/// 返回DataSetpublic DataSet ReturnDataSet(string sql,int PageSize,int CurrPageIndex,string DataSetName){DataSet dataSet=new DataSet();OpenConn();OracleDataAdapter OraDA=new OracleDataAdapter(sql,Connection);OraDA.Fill(dataSet,PageSize * (CurrPageIndex - 1), PageSize,DataSetName);// CloseConn();return dataSet;}#endregion#region 执⾏SQL语句,返回 DataReader,⽤之前⼀定要先.read()打开,然后才能读到数据/// 执⾏SQL语句,返回 DataReader,⽤之前⼀定要先.read()打开,然后才能读到数据/// sql语句/// 返回⼀个OracleDataReaderpublic OracleDataReader ReturnDataReader(String sql){OpenConn();OracleCommand command = new OracleCommand(sql,Connection);return command.ExecuteReader(mandBehavior.CloseConnection);}#endregion#region 执⾏SQL语句,返回记录总数数/// 执⾏SQL语句,返回记录总数数/// sql语句/// 返回记录总条数public int GetRecordCount(string sql){int recordCount = 0;OpenConn();OracleCommand command = new OracleCommand(sql,Connection);OracleDataReader dataReader = command.ExecuteReader();while(dataReader.Read()){recordCount++;}dataReader.Close();//CloseConn();return recordCount;}#endregion#region 取当前序列,条件为seq.nextval或seq.currval////// 取当前序列public decimal GetSeq(string seqstr){decimal seqnum = 0;string sql="select "+seqstr+" from dual";OpenConn();OracleCommand command = new OracleCommand(sql,Connection);OracleDataReader dataReader = command.ExecuteReader();if(dataReader.Read()){seqnum=decimal.Parse(dataReader[0].ToString());}dataReader.Close();// CloseConn();return seqnum;}#endregion#region 执⾏SQL语句,返回所影响的⾏数/// 执⾏SQL语句,返回所影响的⾏数public int ExecuteSQL(string sql){int Cmd=0;OpenConn();OracleCommand command = new OracleCommand(sql,Connection);try{Cmd =command.ExecuteNonQuery(); //ExecuteNonQuery⽅法,返回受影响的⾏数,适⽤于insert/update/delete }catch{}}return Cmd;}#endregion//==⽤hashTable对数据库进⾏insert,update,del操作,注意此时只能⽤默认的数据库连接"connstr"#region 根据表名及哈稀表⾃动插⼊数据库⽤法:Insert("test",ht)public int Insert(string TableName,Hashtable ht){OracleParameter[] Parms=new OracleParameter[ht.Count];IDictionaryEnumerator et = ht.GetEnumerator();DataTable dt=GetTabType(TableName);System.Data.OracleClient.OracleType otype;int size=0;int i=0;while ( et.MoveNext() ) // 作哈希表循环{GetoType(et.Key.ToString().ToUpper(),dt,out otype,out size);System.Data.OracleClient.OracleParameter op=MakeParam(":"+et.Key.ToString(),otype,size,et.Value.ToString()); Parms[i]=op; // 添加SqlParameter对象i=i+1;}string str_Sql=GetInsertSqlbyHt(TableName,ht); // 获得插⼊sql语句int val=ExecuteNonQuery(str_Sql,Parms);return val;}#endregion#region 根据相关条件对数据库进⾏更新操作⽤法:Update("test","Id=:Id",ht);public int Update(string TableName,string ht_Where, Hashtable ht){OracleParameter[] Parms=new OracleParameter[ht.Count];IDictionaryEnumerator et = ht.GetEnumerator();DataTable dt=GetTabType(TableName);System.Data.OracleClient.OracleType otype;int size=0;int i=0;// 作哈希表循环while ( et.MoveNext() ){GetoType(et.Key.ToString().ToUpper(),dt,out otype,out size);System.Data.OracleClient.OracleParameter op=MakeParam(":"+et.Key.ToString(),otype,size,et.Value.ToString()); Parms[i]=op; // 添加SqlParameter对象i=i+1;}string str_Sql=GetUpdateSqlbyHt(TableName,ht_Where,ht); // 获得插⼊sql语句int val=ExecuteNonQuery(str_Sql,Parms);return val;}#endregion#region del操作,注意此处条件个数与hash⾥参数个数应该⼀致⽤法:Del("test","Id=:Id",ht)public int Del(string TableName,string ht_Where,Hashtable ht){OracleParameter[] Parms=new OracleParameter[ht.Count];IDictionaryEnumerator et = ht.GetEnumerator();DataTable dt=GetTabType(TableName);System.Data.OracleClient.OracleType otype;int i=0;int size=0;// 作哈希表循环while ( et.MoveNext() ){GetoType(et.Key.ToString().ToUpper(),dt,out otype,out size);System.Data.OracleClient.OracleParameter op=MakeParam(":"+et.Key.ToString(),et.Value.ToString());Parms[i]=op; // 添加SqlParameter对象i=i+1;}string str_Sql=GetDelSqlbyHt(TableName,ht_Where,ht); // 获得删除sql语句int val=ExecuteNonQuery(str_Sql,Parms);return val;}#endregion// ========上⾯三个操作的内部调⽤函数==================#region 根据哈稀表及表名⾃动⽣成相应insert语句(参数类型的)/// 根据哈稀表及表名⾃动⽣成相应insert语句/// 要插⼊的表名/// 哈稀表/// 返回sql语句int i=0;int ht_Count=ht.Count; // 哈希表个数IDictionaryEnumerator myEnumerator = ht.GetEnumerator();string before="";string behide="";while ( myEnumerator.MoveNext() ){if (i==0){before="("+myEnumerator.Key;}else if (i+1==ht_Count){before=before+","+myEnumerator.Key+")";}else{before=before+","+myEnumerator.Key;}i=i+1;}behide=" Values"+before.Replace(",",",:").Replace("(","(:");str_Sql="Insert into "+TableName+before+behide;return str_Sql;}#endregion#region 根据表名,where条件,哈稀表⾃动⽣成更新语句(参数类型的)public static string GetUpdateSqlbyHt(string Table,string ht_Where,Hashtable ht){string str_Sql="";int i=0;int ht_Count=ht.Count; // 哈希表个数IDictionaryEnumerator myEnumerator = ht.GetEnumerator();while ( myEnumerator.MoveNext() ){if (i==0){if (ht_Where.ToString().ToLower().IndexOf((myEnumerator.Key+"=:"+myEnumerator.Key).ToLower())==-1) {str_Sql=myEnumerator.Key+"=:"+myEnumerator.Key;}}else{if (ht_Where.ToString().ToLower().IndexOf((":"+myEnumerator.Key+" ").ToLower())==-1){str_Sql=str_Sql+","+myEnumerator.Key+"=:"+myEnumerator.Key;}}i=i+1;}if (ht_Where==null || ht_Where.Replace(" ","")=="") // 更新时候没有条件{str_Sql="update "+Table+" set "+str_Sql;}else{str_Sql="update "+Table+" set "+str_Sql+" where "+ht_Where;}str_Sql=str_Sql.Replace("set ,","set ").Replace("update ,","update ");return str_Sql;}#endregion#region 根据表名,where条件,哈稀表⾃动⽣成del语句(参数类型的)public static string GetDelSqlbyHt(string Table,string ht_Where,Hashtable ht){string str_Sql="";int i=0;int ht_Count=ht.Count; // 哈希表个数IDictionaryEnumerator myEnumerator = ht.GetEnumerator();while ( myEnumerator.MoveNext() ){if (i==0){if (ht_Where.ToString().ToLower().IndexOf((myEnumerator.Key+"=:"+myEnumerator.Key).ToLower())==-1) {str_Sql=myEnumerator.Key+"=:"+myEnumerator.Key;}if (ht_Where.ToString().ToLower().IndexOf((":"+myEnumerator.Key+" ").ToLower())==-1){str_Sql=str_Sql+","+myEnumerator.Key+"=:"+myEnumerator.Key;}}i=i+1;}if (ht_Where==null || ht_Where.Replace(" ","")=="") // 更新时候没有条件{str_Sql="Delete "+Table;}else{str_Sql="Delete "+Table+" where "+ht_Where;}return str_Sql;}#endregion#region ⽣成oracle参数////// ⽣成oracle参数/// 字段名/// 数据类型/// 数据⼤⼩/// 值public static OracleParameter MakeParam(string ParamName,System.Data.OracleClient.OracleType otype,int size,Object Value) {OracleParameter para=new OracleParameter(ParamName,Value);para.OracleType=otype;para.Size=size;return para;}#endregion#region ⽣成oracle参数public static OracleParameter MakeParam(string ParamName,string Value){return new OracleParameter(ParamName, Value);}#endregion#region 根据表结构字段的类型和长度拼装oracle sql语句参数public static void GetoType(string key,DataTable dt,out System.Data.OracleClient.OracleType otype,out int size){DataView dv=dt.DefaultView;dv.RowFilter="column_name='"+key+"'";string fType=dv[0]["data_type"].ToString().ToUpper();switch (fType){case "DATE":otype= OracleType.DateTime;size=int.Parse(dv[0]["data_length"].ToString());break;case "CHAR":otype= OracleType.Char;size=int.Parse(dv[0]["data_length"].ToString());break;case "LONG":otype= OracleType.Double;size=int.Parse(dv[0]["data_length"].ToString());break;case "NVARCHAR2":otype= OracleType.NVarChar;size=int.Parse(dv[0]["data_length"].ToString());break;case "VARCHAR2":otype= OracleType.NVarChar;size=int.Parse(dv[0]["data_length"].ToString());break;default:otype= OracleType.NVarChar;size=100;break;}}#endregion#region动态取表⾥字段的类型和长度,此处没有动态⽤到connstr,是默认的!by/⽂少public System.Data.DataTable GetTabType(string tabnale){string sql="select column_name,data_type,data_length from all_tab_columns where table_name='"+tabnale.ToUpper()+"'";OpenConn();return (ReturnDataSet(sql,"dv")).Tables[0];public int ExecuteNonQuery(string cmdText, params OracleParameter[] cmdParms) {OracleCommand cmd = new OracleCommand();OpenConn();cmd.Connection=Connection;mandText = cmdText;if (cmdParms != null){foreach (OracleParameter parm in cmdParms)cmd.Parameters.Add(parm);}int val = cmd.ExecuteNonQuery();cmd.Parameters.Clear();//conn.CloseConn();return val;}#endregion}}。
oracle 存储过程优秀例子Oracle存储过程是一种在数据库中存储和执行SQL语句的过程。
它可以接受参数并返回结果,用于实现复杂的业务逻辑和数据操作。
下面是10个优秀的Oracle存储过程示例,展示了不同方面的功能和用法。
1. 创建表并插入数据```sqlCREATE PROCEDURE create_employee_table ASBEGINEXECUTE IMMEDIATE 'CREATE TABLE employee (id NUMBER, name VARCHAR2(100))';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (1, ''John Doe'')';EXECUTE IMMEDIATE 'INSERT INTO employee VALUES (2, ''Jane Smith'')';END;```这个存储过程创建了一个名为employee的表,并插入了两条数据。
2. 更新员工姓名```sqlCREATE PROCEDURE update_employee_name(p_id NUMBER,p_name VARCHAR2) ASBEGINUPDATE employee SET name = p_name WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID和新的姓名作为参数,然后更新对应员工的姓名。
3. 删除员工记录```sqlCREATE PROCEDURE delete_employee(p_id NUMBER) AS BEGINDELETE FROM employee WHERE id = p_id;COMMIT;END;```这个存储过程接受员工的ID作为参数,然后删除对应的员工记录。
python操作oracle数据库的简单方法和封装类实例Python提供了多种方法来操作Oracle数据库,包括使用第三方库进行操作和使用标准库中的模块进行操作。
1. 使用cx_Oracle库进行操作:cx_Oracle是Python官方提供的一个Oracle数据库连接库。
可以使用pip命令进行安装。
使用cx_Oracle连接数据库的一般步骤如下:1. 导入cx_Oracle库:import cx_Oracle3. 创建游标对象:cursor = conn.cursor4. 执行SQL语句:cursor.execute('SELECT * FROM 表名')5. 获取查询结果:result = cursor.fetchall6. 关闭游标和连接:cursor.close(; conn.close以下是一个使用cx_Oracle库操作Oracle数据库的示例:```pythonimport cx_Oracledef query_data(:cursor = conn.cursorcursor.execute('SELECT * FROM 表名')result = cursor.fetchallcursor.closeconn.closereturn resultdef insert_data(data):cursor = conn.cursorcursor.execute('INSERT INTO 表名 VALUES (:1, :2)', data)cursor.closeconn.closeresult = query_dataprint(result)insert_data(('值1', '值2'))```2. 封装类操作Oracle数据库:为了方便使用,可以将数据库操作封装成一个类,提供常用的数据库操作方法,例如查询、插入、更新和删除等。
Oracle条件分支语句使用案例pl/sql中提供了三种条件分支语句if---then,if---then---else,if--then---elsif---else。
这里需要注意一个细节(细节决定成败):elsif而不是elseif。
一:简单的条件判断:if--then案例1:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10%。
create or replace procedure sp_p2(spName varchar2) isv_sal emp.sal%type;beginselect sal into v_sal from emp where ename=spName;if v_sal<2000 thenupdate emp set sal=sal*1.1 where ename=spName;end if;end;案例2:修改emp表的数据,把那些小于2000的员工工资增加10%,并把更新前后的工资显示出来。
create or replace procedure sp_p2(spName varchar2) is --执行存储过程时要用的变量。
v_sal emp.sal%type;v_sal1 emp.sal%type; --定义两个与emp表中sal列的字符类型相同。
beginselect sal into v_sal from emp where ename=spName;--把得到的数据存到变量里边。
if v_sal<2000 thenupdate emp set sal=sal*1.1 where ename=spName;select sal into v_sal1 from emp where ename=spName;dbms_output.put_line('旧工资为:'||v_sal); --表的列不能在这里用,需要通过定义变量和存储值来实现。
ORACLE经典案例ORACLE--E-001)员工信息综合查询(ORACLE定义ORACLE-F-001——ORACLE-F-005的综合练习:1.用sqlplus连接数据库时,为什么会出Oracle not available错误?2.找出员工的姓中(last_name)第三个字母是a的员工名字3.找出员工名字中含有a和e的4.找出所有有提成的员工,列出名字、工资、提出,显示结果按工资从小到大,提成从小到大5.42部门有哪些职位6.哪些部门不是Sales部7.显示工资不在1000到1550之间的员工信息:名字、工资,按工资从大到小排序。
8.显示职位为Stock Clerk和Sales Representative,年薪在14400和17400之间的员工的信息:名字、职位、年薪。
9.解释select id ,commission_pct from s_emp where commission_pct is null和selectid , commission_pct from s_emp where commission_pct = null的输出结果。
10.select语句的输出结果为select * from s_dept;select * from s_emp;select * from s_region;select * from s_customer;……当前用户有多少张表,结果集有多少条记录。
11.判断select first_name , dept_id from s_emp where salary > '1450'是否抱错,为什么?答案1.oracle server(即通常所说的数据库)是否启动,ORACLE_SID是否正确设置。
2.select last_name from s_emp where last_name like '__a%';3.select first_name from s_emp where first_name like '%a%' andfirst_name like '%e%';比较:select first_name from s_emp where first_name like '%a%e%';4.select first_name , salary , commission_pct from s_emp wherecommission_pct is not null order by salary desc , commission_pct;5.select distinct title from s_emp where dept_id = 426.select id , name ,region_id from s_dept where name <> 'Sales'7.select first_name , salary from s_emp where salary not between 1000and 1550 order by salary desc8.select first_name , title , salary*12 ann_sal from s_emp where titlein ('Stock Clerk', 'Sales Representative' and salary between 1200 and 1450;9.is null判断是否为空,=null判断某个值是否等于null,null = null和null <> null都为false。
10.select 'select * from '||table_name||';' from user_tables;11.隐式数据类型转换。
ORACLE--E-002)人力资源系统数据复杂查询(ORACLE定义ORACLE-F-006——ORACLE-F-008的综合练习:1.改变NLS_LANG的值,让select to_char(salary*12,’L99,999.99’) from s_emp 输出结果的货币单位是¥和$2.列出每个员工的名字,工资、涨薪后工资(涨幅为8%),元为单位进行四舍五入3.找出谁是最高领导,将名字按大写形式显示4.Ben的领导是谁(Ben向谁报告)。
5.Ben领导谁。
(谁向Ben报告)。
6.哪些员工的工资高于他直接上司的工资,列出员工的名字和工资,上司的名字和工资7.哪些员工和Biri(last_name)同部门8.哪些员工跟Smith(last_name)做一样职位9.哪些员工跟Biri(last_name)不在同一个部门10.哪些员工跟Smith(last_name)做不一样的职位11.显示有提成的员工的信息:名字、提成、所在部门名称、所在地区的名称12.显示Operations部门有哪些职位13.整个公司中,最高工资和最低工资相差多少14.提成大于0的人数15.显示整个公司的最高工资、最低工资、工资总和、平均工资,保留到整数位。
16.整个公司有多少个领导17.列出在同一部门入职日期晚但工资高于其他同事的员工:名字、工资、入职日期答案1.setenv NLS_LANG 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'setenv NLS_LANG 'AMERICAN_7ASCII'2.select first_name , salary , round(salary*1.08) from s_emp;3.select upper(first_name) from s_emp where manager_id is null;4.select e1.first_name from s_emp e1 , s_emp e2 where e2.manager_id =e1.id and e2.first_name = 'Ben';5.select e1.first_name from s_emp e1 , s_emp e2 where e1.manager_id =e2.id and e2.first_name = 'Ben';6.select e.first_name , e.salary , m.first_name , m.salary from s_empe , s_emp m where e.manager_id = m.id and e.salary > m.salary;7.select e1.first_name from s_emp e1 , s_emp e2 where e1.dept_id =e2.dept_id and st_name = 'Biri' and st_name <> 'Biri';8.select e1.first_name from s_emp e1 , s_emp e2 where e1.title = e2.titleand st_name = 'Smith' and st_name <> 'Smith';9.select e1.first_name from s_emp e1 , s_emp e2 where e1.dept_id =e2.dept_id(+) and st_name(+) = 'Biri' and st_name is null;10.select e1.first_name , e2.first_name from s_emp e1 , s_emp e2 wheree1.title(+) = e2.title and st_name(+) = 'Smith' and st_name is null;11.select dname , rname , first_name , commission_pct froms_emp e , s_dept d , s_region r where e.dept_id = d.id and d.region_id = r.id and mission_pct is not null;12.select distinct e.title from s_emp e , s_dept d where e.dept_id = d.idand = 'Operations';13.select max(salary) – min(salary) from s_emp;14.select count(*) from s_emp where commission_pct > 0;15.select max(salary) , min(salary) , sum(salary) , round(avg(salary))from s_emp;16.select count(distinct manager_id) from s_emp;17.select e1.first_name , e1.start_date , e1.salary from s_emp e1 , s_empe2 where e1.dept_id = e2.dept_id and e1.start_date > e2.start_date and e1.salary > e2.salary;ORACLE--E-003)复杂业务数据关联查询(ORACLE定义ORACLE-F-009——ORACLE-F-011的综合练习:1.各个部门平均、最大、最小工资、人数,按照部门号升序排列2.各个部门中工资大于1500的员工人数3.各个部门平均工资和人数,按照部门名字升序排列4.列出每个部门中有同样工资的员工的统计信息,列出他们的部门号,工资,人数5.该部门中工资高于1000的员工数量超过2人,列出符合条件的部门:显示部门名字、地区名称6.哪些员工的工资,高于整个公司的平均工资,列出员工的名字和工资(降序)7.哪些员工的工资,介于32和33部门(33高些)平均工资之间8.所在部门平均工资高于1500的员工名字9.列出各个部门中工资最高的员工的信息:名字、部门号、工资10.最高的部门平均工资值的是多少11.哪些部门的人数比32号部门的人数多12.Ben的领导是谁(非关联子查询)13.Ben领导谁(非关联子查询)14.Ben的领导是谁(关联子查询)15.Ben领导谁(关联子查询)16.列出在同一部门共事,入职日期晚但工资高于其他同事的员工:名字、工资、入职日期(关联子查询)17.哪些员工跟Biri(last_name)不在同一个部门(非关联子查询)18.哪些员工跟Biri(last_name)不在同一个部门(关联子查询)19.Operations部门有哪些职位(非关联子查询)20.Operations部门有哪些职位(关联子查询)答案1.select dept_id , avg(salary) asal , max(salary) asal , min(salary)isal , count(*) cnt from s_emp group by dept_id order by dept_id;2.select dept_id , count(*) cnt from s_emp where salary > 1500 groupby dept_id;3.select max() dname , max() rname , avg(e.salary) avgsalfrom s_emp e , s_dept d , s_region r where e.dept_id = d.id andd.region_id = r.id group by dept_id order by dname , rname;4.select e1.dept_id , e1.salary , count(*) cnt from s_emp e1 , s_empe2 where e1.salary = e2.salary and e1.dept_id = e2.dept_id and e1.id <> e2.id group by e1.dept_id , e1salary5.select max() dname , max() rname , count(*) cnt from s_empe , s_dept d , s_region r where e.dept_id = d.id and d.region_id =r.id and e.salary > 1000 group by dept_id having count(*) > 2;6.select first_name , salary from s_emp where salary > (selectavg(salary) from s_emp) order by salary desc;7.select first_name , salary from s_emp where salary between (selectavg(salary) from s_emp where dept_id = 32) and (select avg(salary) from s_emp where dept_id = 33);8.select first_name , salary from s_emp where dept_id in (select dept_idfrom s_emp group by dpet_id having avg(salary) > 1500);9.select first_name , salary , dept_id from s_emp where (dept_id , salary)in (select dept_id , max(salary) from s_emp group by dept_id);10.select max(avg(salary)) from s_emp;11.select dept_id , count(*) cnt from s_emp group by dept_id havingcount(*) > (select count(*) from s_emp where dept_id = 32);12.select first_name from s_emp where id in (select manager_id from s_empwhere first_name = 'Ben');13.select first_name from s_emp where manager_id = (select id from s_empwhere first_name = 'Ben');14.select first_name from s_emp o where exists (select 1 from s_emp iwhere first_name = 'Ben' and i.manager_id = o.id);15.select first_name from s_emp o where exists (select 1 from s_emp iwhere first_name = 'Ben' and i.id = o.manager_id);16.select first_name from s_emp o where exists (select 1 from s_emp iwhere i.dept_id = o.dept_id and o.start_date > i.start_date and o.salary > i.salary);17.select first_name from s_emp where dept_id not in (select dept_id froms_emp where last_name = 'Biri');18.select last_name from s_emp o where not exists (select 1 from s_empi where i.dept_id = o.dept_id and st_name = 'Biri');19.select distinct title from s_emp where dept_id in (select id froms_dept where name = 'Operations');20.select distinct title from s_emp e where exists (select 1 from s_deptd where e.dept_id = d.id and name = 'Operations';。