`
yxx676229549
  • 浏览: 73841 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle 语法

 
阅读更多

 

 

 

//下面为游标知识
 
declare 
--定义游标
type emp_cursor is ref cursor;
star_cursor emp_cursor;
begin
open star_cursor for select ...;
loop
      fetch star_cursor into ...;
      dbms...;
end loop;
end;
 

 

SET SERVEROUTPUT ON;
DECLARE 
--游标的声明
CURSOR c_emp is
	select ename,sal from emp;
   --定义接收游标中的 数据变量
   v_ename emp.ename%TYPE;
   v_sal emp.sal%TYPE;	
   --声明基于游标的记录来接收数据
   vr_emp c_emp%ROWTYPE;
BEGIN
   --打开游标
   open c_emp;
   --取出游标中的数据
   loop
      fetch c_emp into v_ename,v_sal;
      --检查是否到最后一条数据
      exit when c_emp%NOTFOUND;
      --打印数据
      DBMS_OUTPUT.PUT_LINE('姓名:'||v_ename||'薪水:'||v_sal);
      end loop;
   CLOSE c_emp;   
   DBMS_OUTPUT.PUT_LINE('=====================');
   open c_emp;
   loop
      fetch c_emp into vr_emp;
      exit when c_emp%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE('姓名:'||vr_emp.ename||'薪水:'||vr_emp.sal);
      end loop;  
   CLOSE c_emp;    
   DBMS_OUTPUT.PUT_LINE('=====================');
   
   --上面两个都要打开关闭游标,下面for循环不用打开和关闭游标
   
   for emp_record in reverse c_emp loop
      DBMS_OUTPUT.PUT_LINE('姓名:'||emp_record.ename||'薪水:'||emp_record.sal);
      end loop; 
END;   
 

下面是while循环

 

SET SERVEROUTPUT ON;
DECLARE 
--游标的声明
CURSOR c_emp is
	select ename,sal from emp;
   --定义接收游标中的 数据变量
   v_ename emp.ename%TYPE;
   v_sal emp.sal%TYPE;	
   --声明基于表的记录来接收数据
   vr_emp c_emp%ROWTYPE;
BEGIN
   --打开游标
   if c_emp%ISOPEN = false then	
   open c_emp;
   end if;
   fetch c_emp into v_ename,v_sal;
   while c_emp%FOUND loop
   	DBMS_OUTPUT.PUT_LINE('name:'||v_ename||'sal:'||v_sal);
   	if c_emp%ROWCOUNT = 200 then
   	exit;
   	end if;
   	fetch c_emp into v_ename,v_sal;
   end loop;	
   close c_emp;
END;    
 

游标中的参数问题

 

 

 

	SET SERVEROUTPUT ON;
	DECLARE 
	--游标的声明
	CURSOR c_emp (p_deptno in emp.deptno%TYPE)
		is
		select * from emp 
		where deptno = p_deptno;
	r_deptno emp.deptno%TYPE;	
	BEGIN
		r_deptno := '30';
		for r_emp in c_emp(r_deptno)
		loop
			DBMS_OUTPUT.PUT_LINE('dempno is: '||r_deptno||'name is:'||r_emp.ename);
		end loop;
	END;

 

 

//下面是存储过程
create procedure star_pro(v_name varchar2,v_sal number ) is
begin
update emp set sal = v_sal where ename = v_name;
end;

//上面为存储过程的一般形式,下面为存储过程带上in,out参数,并通过oracle执行存储过程得到结果
create or replace procedure sp_test 
as
cursor c_group
is
select ename from emptestwhere sal > 2000 group by job;
begin
for r_group in c_group
loop
update emptest set comm = comm+3000;
end loop;
end;

create or replace procedure sp_findname 
(i_ename in varchar2,
o_sal out number)
as
begin
select sal into o_sal from emptest
where ename = i_ename;
exception
when others
then 
dbms_output.put_line('error');
end;

declare
v_sal emptest.sal%type;
begin
sp_findname('STAR',v_sal);
dbms_output.put_line('v_sal is'||v_sal);
end;

//通过java调用并返回单个结果的例子
create or replace procedure sp_inout 
    (i_id in int , o_name out varchar2 , o_job out varchar2)
as
begin
    select ename,job
        into o_name,o_job
    from emptest where empno = i_id;
end;

//通过java调用并返回一个结果集的例子
--1.新建一个包,并在包中定义一个游标test_cursor
create or replace package testpackage as
type test_cursor is ref cursor;
end;

--2.创建过程
create or replace procedure sp_getall
(id in number,p_cursor out testpackage.test_cursor)
is
begin
open p_cursor for 
select * from emp where deptno = id;
end;
//java调用存储过程一般形式
try {
			//1.加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//2.获得连接
			Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
			//3.创建CallableStatement
			CallableStatement cs = connection.prepareCall("{call star_pro(?,?)}");
			//4.赋值
			cs.setString(1,"SCOTT");
			cs.setInt(2,30000);	
			//5.执行
			cs.execute();
			//6.关闭
			cs.close();
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

//java调用存储过程带上返回结果的形式

package star;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JdbcConn {

	public static void main(String[] args) {
		conn();
	}
	
	public static void conn(){
		String driver = "oracle.jdbc.driver.OracleDriver";
		String user = "SCOTT";
		String password = "tiger";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, user, password);
			
			//下面是一般的oracle查询
			String sql = "select * from emptest where ename = ?";
			/*ps = conn.prepareStatement(sql);
			ps.setString(1, "SCOTT");
			rs = ps.executeQuery();
			
			while(rs.next()){
				System.out.println(rs.getString(2)+"  的工作是  "+rs.getString(3));
			}*/
			
			//下面是java调用存储过程
			CallableStatement callableStatement = conn.prepareCall("{call sp_inout(?,?,?)}");
			callableStatement.setInt(1, 7788);
			callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);
			callableStatement.registerOutParameter(3, java.sql.Types.VARCHAR);
			
			callableStatement.execute();
			
			String name = callableStatement.getString(2);
			String job = callableStatement.getString(3);
			
			System.out.println(name + "  " +job);
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

//java调用存储过程返回一个结果集
try {
			//1.加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//2.获得连接
			Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
			//3.创建CallableStatement		
			CallableStatement cs = connection.prepareCall("{call sp_getall(?,?)}");
			cs.setInt(1,30);
			cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
//这里可以有两种选择  
//1.oracle.jdbc.OracleTypes.*;
//2. java.sql.Types.*;
			cs.execute();
			ResultSet rs = (ResultSet) cs.getObject(2);
			while(rs.next()){
				System.out.println("name is : "+rs.getString(2));
			}
			
			cs.close();
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}


  

 

 

 

//包的规范只包含过程和函数的说明,但是没有具体代码,
//包体用于实现包规范中的过程和函数
create package star_package is
procedure update_sal(v_name varchar2,v_sal number);
function annual_income(v_name varchar2) return number;
end;
//下面是包体的创建
create package body star_package is
procedure update_sal(v_name varchar2,v_sal number)
is
begin
...
end;
function annual_income(v_name varchar2) return number
is
results number; //结果
begin
...
return results;
end;
end;

 记录

 

declare
type emp_record is record(name emp.ename%type,sal emp.sal%type)
star_record emp_record;
begin
select ename,sal into star_record
from emp where ...;
dbms_output.putline('...');
end;

//复合变量,含有多个变量

 

 

//下面为触发器
 

 

create or replace trigger emptest_ba
       before insert or update or delete
       on emptest
       for each row
declare 
       v_ename emptest.ename%type;
begin
       if inserting then
              v_ename := 'INSERT';
              :new.hiredate :=sysdate;
       elsif deleting then
              v_ename := 'DELETE';
       elsif updating then
              v_ename := 'UPDATE';       
       end if;
       update emptest set ename = v_ename where deptno = 40;
       
       if sql%notfound then
          insert into emptest(ename,sal)
          values
          (v_ename,10);
       end if;
end;
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



  


  
分享到:
评论

相关推荐

    Sql语法转换为Oracle语法

    标题“Sql语法转换为Oracle语法”涉及到的主要知识点是SQL Server与Oracle数据库之间的SQL语句转换。这通常是因为在系统迁移或跨平台开发时,需要将SQL Server的查询语句适应Oracle数据库的语法。 描述中提到的...

    pg与oracle语法差异

    ### pg与oracle语法差异知识点详解 #### 一、空值处理 **PostgreSQL** 和 **Oracle** 在处理空值(`null`)方面存在显著差异: - **PostgreSQL**: `null` 和空字符串(`''`)被视为不同的值。这意味着在进行比较或...

    oracle语法大全 个人整理

    以下是一些关于Oracle语法和个人学习整理的关键知识点: 1. **初始口令**:Oracle安装完成后,预设了一些默认的系统用户及其口令,例如: - internal/oracle - sys/change_on_install - system/manager - scott...

    Oracle语法指南.zip

    本"Oracle语法指南"提供了全面的Oracle SQL语法参考和实例解析,旨在帮助用户更好地理解和掌握Oracle数据库的操作。 首先,"oracle语法.txt"可能包含了Oracle SQL的基础到高级语法,例如: 1. **数据类型**:...

    Oracle语法整理(较全)

    本篇文章将深入探讨Oracle语法的一些关键点,包括序列、DUAL表的使用以及如何查看系统数据。 首先,我们来看序列(Sequences)。序列在Oracle中用于生成唯一的整数,通常用于主键或者唯一标识符。创建序列后,可以...

    oracle语法

    Oracle语法是数据库管理中至关重要的组成部分,特别是在大型企业级应用中,Oracle数据库系统因其稳定性、高效性和安全性而被广泛使用。这篇文档将深入探讨Oracle SQL语法的基础和高级特性,包括数据查询、数据操作、...

    UltraEdit/UEStudio Oracle 语法高亮/语法着色文件

    UltraEdit/UEStudio Oracle 语法高亮/语法着色文件

    oracle语法详细介绍

    oracle语法详细介绍,简单易懂,很实用

    Oracle语法实例讲解chm

    Oracle数据库系统是全球广泛使用的大型关系数据库管理系统,它在企业级数据存储、管理和处理方面具有卓越性能。Oracle的客户端/服务器架构...《Oracle语法实例讲解》这样的资源可以帮助你进一步提升Oracle技能。

    Oracle语法oracle的基础知识

    Oracle语法,有关于oracle的基础知识。

    oracle语法大全

    对于初学者而言,掌握Oracle语法是迈向数据库管理专业之路的关键步骤。本资料集《Oracle语法大全》旨在提供全面而深入的Oracle语言知识,涵盖了从基础查询到高级特性的各个方面。 一、查询语句(SQL查询) 在Oracle...

    Oracle语法详解视频教程(下)part1

    Oracle语法详解视频教程(二)part1,一共6个部分,需6个全部下载才能解压。 该视频内容为:介绍Oracle语句的条件查询和排序操作。

    Oracle语法大全

    Oracle语法大全涵盖了从基本的SQL查询到复杂的数据库管理技术,旨在帮助用户全面理解和掌握Oracle数据库的操作。 一、SQL基础 Oracle SQL是用于与Oracle数据库交互的语言,包括数据查询、插入、更新和删除等操作。...

    oracle语法及常用命令

    Oracle 语法及常用命令 Oracle 语法是关系型数据库管理系统的核心语言,用于管理和操作数据库。下面是 Oracle 语法及常用命令的详细知识点: 一、数据库概述 * 数据库是按照数据结构来组织、存储和管理数据的仓库...

    oracle 语法基础

    了解Oracle语法基础对于数据库管理员(DBA)和开发人员来说至关重要。 1. **数据类型** Oracle 支持多种数据类型,包括数值类型(如 NUMBER)、字符串类型(如 VARCHAR2、CHAR)、日期时间类型(如 DATE)、二进制...

    oracle语法.rar

    这个“oracle语法.rar”压缩包包含了关于Oracle数据库的一些关键知识点,如递归查询、内置函数、PL/SQL编程以及分页建表等。下面将详细介绍这些内容。 1. **递归查询**:在Oracle中,递归查询通常用于处理层次结构...

Global site tag (gtag.js) - Google Analytics