Oracle存储过程及返回参数

Oracle存储过程及返回参数
Oracle存储过程及返回参数

1、基本语法

创建存储过程,需要有CREATEPROCEDURE或CREATE ANY PROCEDURE的系统权限。该权限可由系统管理员授予。创建一个存储过程的基本语句如下:CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)]

{AS|IS}

[说明部分:参数定义、变量定义、游标定义]

BEGIN

可执行部分

[EXCEPTION 错误处理部分]

END [过程名];

其中:

可选关键字OR REPLACE 表示如果存储过程已经存在,则用新的存储过程覆盖,通常用于存储过程的重建。

参数部分用于定义多个参数(如果没有参数,就可以省略)。参数有三种形式:IN、OUT和IN OUT;如果没有指明参数的形式,则默认为IN。

IN 定义一个输入参数变量,用于传递参数给存储过程

OUT 定义一个输出参数变量,用于从存储过程获取数据

IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能

例1,创建带输入输出参数的存储过程:

create or replace procedure test_procedure(a in number, x out varchar2)

is

begin

if a >= 90 then

begin

x := 'A';

end;

end if;

if a < 90 then

begin

x := 'B';

end;

end if;

if a < 80 then

begin

x := 'C';

end;

end if;

if a < 70 then

begin

x := 'D';

end;

end if;

if a < 60 then

begin

x := 'E';

end;

end if;

end test_procedure;

执行结果:

例2、创建参数为IN OUT 的存储过程

create table EMP (EMPNO number , ENAME varchar2(32) );

insert into EMP (EMPNO ,ENAME) values (10,'张三');

insert into EMP (EMPNO ,ENAME) values (20,'小马');

insert into EMP (EMPNO ,ENAME) values (30,'小米');

insert into EMP (EMPNO ,ENAME) values (40,'小明');

CREATE OR REPLACE FUNCTION GET_EMP_NAME(P_EMPNO NUMBER DEFAULT 10)

RETURN VARCHAR2 AS

V_ENAME VARCHAR2(32);

BEGIN

SELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO = P_EMPNO;

RETURN(V_ENAME);

EXCEPTION

WHEN NO_DATA_FOUND THEN

-- DBMS_OUTPUT.PUT_LINE('没有该编号雇员!');

RETURN('没有该编号雇员!');

WHEN TOO_MANY_ROWS THEN

-- DBMS_OUTPUT.PUT_LINE('有重复雇员编号!');

RETURN('有重复雇员编号!');

WHEN OTHERS THEN

--- DBMS_OUTPUT.PUT_LINE('发生其他错误!');

RETURN('发生其他错误!');

END;

SQLServer存储过程返回值总结.

SQLServer 存储过程返回值总结 1. 存储过程没有返回值的情况 (即存储过程语句中没有 return 之类的语句用方法 int count = ExecuteNonQuery(..执行存储过程其返回值只有两种情况 (1假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行 count 就是几 (2假如通过查询分析器执行该存储过程, 在显示栏中假如显示 ' 命令已成功完成。 ' 则 count = -1;在显示栏中假如有查询结果,则 count = -1 总结:A.ExecuteNonQuery(该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是 -1,不会为 0。 B.不论 ExecuteNonQuery(方法是按照 CommandType.StoredProcedure 或者 CommandType.Text 执行, 其效果和 A 一样。 --------------------------------------------------------------------------------------------------------------------------------------------------- 2. 获得存储过程的返回值 --通过查询分析器获得 (1不带任何参数的存储过程 (存储过程语句中含有 return ---创建存储过程 CREATE PROCEDURE testReturn AS return 145 GO ---执行存储过程

DECLARE @RC int exec @RC=testReturn select @RC ---说明 查询结果为 145 (2带输入参数的存储过程 (存储过程语句中含有 return ---创建存储过程 create procedure sp_add_table1 @in_name varchar(100, @in_addr varchar(100, @in_tel varchar(100 as if(@in_name = '' or @in_name is null return 1 else begin insert into table1(name,addr,tel values(@in_name,@in_addr,@in_tel return 0

2020年(Oracle管理)华为oracle培训教材

(Oracle管理)华为oracle培训教材

SQL语言简介 1、SQL概述 SQL是一种面向数据库的通用数据处理语言规范,能完成以下几类功能:提取查询数据,插入修改删除数据,生成修改和删除数据库对象,数据库安全控制,数据库完整性及数据保护控制。 数据库对象包括表、视图、索引、同义词、簇、触发器、函数、过程、包、数据库链、快照等(表空间、回滚段、角色、用户)。数据库通过对表的操作来管理存储在其中的数据。 1)SQL*PLUS界面: 登录:输入SQLPLUS回车;输入正确的ORACLE用户名并回车;输入用户口令并回车,显示提示符:SQL> 退出:输入EXIT即可。 2)命令的编辑与运行: ●在命令提示符后输入SQL命令并运行,以分号结束输入;以斜杠结束输入;以空行结束输入; ●利用SQL缓冲区进行PL/SQL块的编辑和运行; ●利用命令文件进行PL/SQL块的编辑和运行。 2、数据库查询 1)用SELECT语句从表中提取查询数据。语法为 SELECT[DISTINCT]{column1,column2,…}FROMtablenameWHERE{conditi ons}GROUPBY{conditions}ORDERBY{expressions}[ASC/DESC]; 说明:SELECT子句用于指定检索数据库的中哪些列,FROM子句用于指定从哪一个表或视图中检索数据。

2)SELECT中的操作符及多表查询WHERE子句。(LIKE,IS,…) WHERE子句中的条件可以是一个包含等号或不等号的条件表达式,也可以是一个含有IN、NOTIN、BETWEEN、LIKE、ISNOTNULL等比较运算符的条件式,还可以是由单一的条件表达通过逻辑运算符组合成复合条件。 3)ORDERBY子句 ORDERBY子句使得SQL在显示查询结果时将各返回行按顺序排列,返回行的排列顺序由ORDERBY子句指定的表达式的值确定。 4)连接查询 利用SELECT语句进行数据库查询时,可以把多个表、视图的数据结合起来,使得查询结果的每一行中包含来自多个表达式或视图的数据,这种操作被称为连接查询。 连接查询的方法是在SELECT命令的FROM子句中指定两个或多个将被连接查询的表或视图,并且在WHERE子句告诉ORACLE如何把多个表的数据进行合并。根据WHERE子句中的条件表达式是等还是不等式,可以把连接查询分为等式连接和不等式连接。 5)子查询 如果某一个SELECT命令(查询1)出现在另一个SQL命令(查询2)的一个子句中,则称查询1是查询2的子查询。 3、基本数据类型(NUMBER,VARCHAR2,DATE)O RACEL支持下列内部数据类型: ●VARCHAR2变长字符串,最长为2000字符。 ●NUMBER数值型。

ORACLE存储过程

ORACLE提供了四种类型的可存储的程序: 函数, 过程. 包,触发器 一.声明部分(Declarationsection) (1)声明部分包含了变量和常量的数据类型和初始值 (2)这个部分是由关键字DECLARE开始 (3)如果不需要声明变量或常量,那么可以忽略这一部分; 二.执行部分(Executablesection) (1)执行部分是PL/SQL块中的指令部分, (2)由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。 三.异常处理部分(Exceptionsection) 这一部分是可选的,在这一部分中处理异常或错误。 过程存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用。 1.创建存储过程 CREATE[ORREPLACE]PROCEDURE过程名 (参数1{IN/OUT/INOUT}类型, 参数2{IN/OUT/INOUT}类型, …….

参数N{IN/OUT/INOUT}类型, )IS/AS 过程体 BEGIN END存储过程名字 说明: (1)ORREPLACE关键字可选,但一般会使用,功能为如果同名的过程已存在,则删除同名过程,然后重建,以此来实现修改过程的目的。 (2)过程可以包括多个参数,参数模式有IN/OUT/INOUT三种,默认为IN,也可以没参数。 (3)IS/AS键字也等价 (4)过程体为该过程的代码部分,是一个含有声明部分,执行部分和异常处理部分的PL/SQL块。但需要注意的是,在过程的声明体中不能使用DECLARE关键字,由IS或AS来代替。 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select。。。into。。。给变量赋值 5,在代码中抛异常用raise+异常名 2.查看过程

存储过程及参数命名规范

存储过程及参数命名规范 一、存储过程命名规范 1.操作方式add(添加) mod(修改) del(删除) sel(查询) drag(托拽) copy(拷贝) lock(锁) chk(检查) cho(选择) rp(报表) ini(初始化) get(得到function专用) 2.结果类型Tree(树) Tab(表) 3.修饰语A(Tab专用修饰符all) 4.顺序bf(之前) 5.过程标识P (对外过程) F(方法) E(内部过程) 公有过程命名规则 公式:过程名=标识+对象条件+操作及修饰 过程标识_对象名(By条件)(结果类型)_主操作方式(修饰语) (顺序)(次操作方式) ()是可选对象 例: 树查询p_xxxxTree_Sel 树节点查表p_xxxxTab_Sel 主特征表查询P_xxxxByChr_Sel 明细特征表查询P_xxxxByDtlChr_Sel 查询所有p_xxxxx_SelA 独立选择框树P_xxxxTree_Cho 独立选择框树查表P_xxxxTab_Cho 独立选择框待选项查询p_xxxxByChr_Cho 独立选择框已选择项查询P_xxxxSeled_Cho 业务绑定选择框树P_xxxxforxxxTree_Cho 业务绑定选择框树查表P_xxxxforxxxTab_Cho 业务绑定选择框普通查询p_xxxxforxxxByChr_Cho 业务绑定已选择项查询P_xxxxforxxxSeled_Cho 除主页面查询外的其他条件查询P_xxxxByxxxx_Sel 新增P_xxxx_Add 修改P_xxxx_Mod 删除P_xxxx_Del 删除前检查P_xxxx_ChkBfDel 初始化P_xxxx_IniBfxxx 新增,修改,删除任选合一P_xxxx_Save 方法命名规则

存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令

存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL 语句同ASP代码混杂在一起。这样做的好处至少有三个: 第一、大大提高效率。存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。 第二、提高安全性。假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。第三、有利于SQL语句的重用。 在ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。为了方便说明,根据存储过程的输入输出,作以下简单分类: 1. 只返回单一记录集的存储过程 假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明): /*SP1*/ CREATE PROCEDURE dbo.getUserList as set nocount on begin select * from dbo.[userinfo] end go 以上存储过程取得userinfo表中的所有记录,返回一个记录集。通过command对象调用该存储过程的ASP 代码如下: '**通过Command对象调用存储过程** DIM MyComm,MyRst Set MyComm = Server.CreateObject("https://www.360docs.net/doc/c915178098.html,mand") MyComm.ActiveConnection = MyConStr 'M yConStr是数据库连接字串 https://www.360docs.net/doc/c915178098.html,mandText = "getUserList" '指定存储过程名 https://www.360docs.net/doc/c915178098.html,mandType = 4 '表明这是一个存储过程 MyComm.Prepared = true '要求将SQL命令先行编译 Set MyRst = MyComm.Execute Set MyComm = Nothing 存储过程取得的记录集赋给MyRst,接下来,可以对MyRst进行操作。 在以上代码中,CommandType属性表明请求的类型,取值及说明如下: -1 表明CommandText参数的类型无法确定 1 表明CommandText是一般的命令类型 2 表明CommandText参数是一个存在的表名称 4 表明CommandText参数是一个存储过程的名称 还可以通过Connection对象或Recordset对象调用存储过程,方法分别如下:

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

SQL一个存储过程调用另一个存储过程 获取返回值问题

2008-12-16 21:41 第一种方法: 使用output参数 USE AdventureWorks; GO IF OBJECT_ID ( 'https://www.360docs.net/doc/c915178098.html,p_GetList', 'P' ) IS NOT NULL DROP PROCEDURE https://www.360docs.net/doc/c915178098.html,p_GetList; GO CREATE PROCEDURE https://www.360docs.net/doc/c915178098.html,p_GetList @product varchar(40) , @maxprice money , @compareprice money OUTPUT , @listprice money OUT AS SELECT https://www.360docs.net/doc/c915178098.html, AS Product, p.ListPrice AS'List Price' FROM Production.Product p JOIN Production.ProductSubcategory s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE https://www.360docs.net/doc/c915178098.html, LIKE@product AND p.ListPrice <@maxprice; -- Populate the output variable @listprice. SET@listprice= (SELECT MAX(p.ListPrice) FROM Production.Product p JOIN Production.ProductSubcategory s ON p.ProductSubcategoryID = s.ProductSubcategoryID WHERE https://www.360docs.net/doc/c915178098.html, LIKE@product AND p.ListPrice <@maxprice); -- Populate the output variable @compareprice. SET@compareprice=@maxprice; GO 另一个存储过程调用的时候: Create Proc Test as DECLARE@compareprice money, @cost money EXECUTE https://www.360docs.net/doc/c915178098.html,p_GetList '%Bikes%', 700, @compareprice OUT, @cost OUTPUT IF@cost<=@compareprice BEGIN PRINT'These products can be purchased for less than $'+RTRIM(CAST(@compareprice AS varchar(20)))+'.' END ELSE PRINT'The prices for all products in this category exceed $'+RTRIM(CAST(@compareprice AS varchar(20)))+'.'

oracle-存储过程练习题

1.创建用户kaifa(密码亦为kaifa),并分配connect,create table,resource权限。 CREATE user KAIFA IDENTIFIED BY KAIFA DEFAULT TABLESPACE HOSDATA TEMPOARY TABLESPACE TEMPDATA; GRANT CONNECT , CREATE TABLE , RESOURCE TO KAIFA 2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。 概要表(CCB_GYB)信息如下: --RMB 人民币 --CNY 本位币 --USD 外币折美元 如果币种为RMB,则取出人民币余额作为本期余额;为CNY,则取本位币余额;为USD 则取外币折美元余额。 请编写一个函数GetCurrBal( qrp_rq IN VARCHAR2, --报表日期 qrp_code IN VARCHAR2--币种 ) CREATE OR REPLACE FUNCTION GetCurrBal( Vqrp_rq Date , --报表日期 Vqrp_code VARCHAR2--币种 ) RETURN NUMBER IS VAMOUNT NUMBER ; VDATE Date; BEGIN SELECT ACCOUNTING_DATE INTO VDATE FROM CCB_GYB Where ACCOUNTING_DATE = Vqrp_rq; IF Vqrp_code = 'RMB'THEN SELECT RMB_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'RMB' AND ACCOUNTING_DATE= VDATE; ELSE IF Vqrp_code = 'CNY'THEN SELECT CNY_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'CNY';

存储过程书写范例

--存储过程的创建和调用演示 ------------------------------------- --1.不带参数的存过过程的创建 CREATEPROCEDURE PRO_WITH_NO_PARAM AS BEGIN--BEGIN 可省略 SELECT*FROM C; END--END 可省略 --调用 EXEC PRO_WITH_NO_PARAM; ------------------------------------ --2.带参数的存储过程 CREATEPROCEDURE PRO_WHIT_PARAM ( @Sno char(5), @Cno char(1) ) AS BEGIN SELECT*FROM SC WHERE Sno=@Sno AND Cno=@Cno END --调用 EXEC PRO_WHIT_PARAM '09002','3' --------------------------------------- --3.带一个参数的多表查询存储过程 CREATEPROCEDURE PRO_QUERY_DOUBLE_TABLE ( @Sname_IN char(6) ) AS BEGIN SELECT Sname,Ssex,Sage,Sdept,Cno,Grade FROM S STU ,SC SCTU WHERE STU.Sno = SCTU.Sno AND Sname = @Sname_IN END --执行 EXEC PRO_QUERY_DOUBLE_TABLE '姑姑' ----------------------------------------- --4.创建一个插入表的存储过程 CREATEPROCEDURE PRO_INSERT ( @Sno_IN CHAR(5), @Cno_IN CHAR(1), @Grade_IN int )

存储过程实例精选

整理者为我 实例1:只返回单一记录集的存储过程。 银行存款表(bankMoney)的内容如下 要求1:查询表bankMoney的内容的存储过程 create procedure sp_query_bankMoney as select * from bankMoney go exec sp_query_bankMoney 注* 在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧! 实例2(向存储过程中传递参数): 加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。 Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output with encryption ---------加密 as insert bankMoney (id,userID,sex,Money)

Values(@param1,@param2,@param3, @param4) select @param5=sum(Money) from bankMoney where userID='Zhangsan' go 在SQL Server查询分析器中执行该存储过程的方法是: declare @total_price int exec insert_bank '004','Zhangsan','男',100,@total_price output print '总余额为'+convert(varchar,@total_price) go 在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容): 1.以Return传回整数 2.以output格式传回参数 3.Recordset 传回值的区别: output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。 实例3:使用带有复杂 SELECT 语句的简单过程 下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。 USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = 'au_info_all' AND type = 'P') DROP PROCEDURE au_info_all GO

oracle存储过程学习经典[语法实例调用]

Oracl e 存储过程学习 目录 Oracle 存储过程1 Oracle存储过程基础知识1 Oracle存储过程的基本语法2 关于Oracle存储过程的若干问题备忘4 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错5 5.在存储过程中,关于出现null的问题5 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程6 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17 Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

如何在Oracle中使用Java存储过程(详解)

如何在Oracle中使用Java存储过程 (详解) 一、如何缔造java存储过程? 通常有三种步骤来缔造java存储过程。 1. 使用oracle的sql语句来缔造: e.g. 使用create or replace and compile java source named "" as 后边跟上java源程序。要求类的步骤必须是public static的,威力用于存储过程。 1.SQL> create or replace and compile java source named "javademo1 " 2. as 3. import java.sql.*; 4. public class JavaDemo1 5. { 6. public static void main(String[] argv) 7. { 8. System.out.println("hello, java demo1"); 9. } 10. } 11. / 12. 13.Java 已 14. 15.缔造。 16. 17.SQL> show errors java source "javademo1" 18.没有 19. 20.舛误。 21. 22.SQL> create or replace procedure javademo1 23. 2 as 24.3 language java name JavaDemo1.main(https://www.360docs.net/doc/c915178098.html,ng.String[]); 25. 4 / 26. 27.过程已 28.

30. 31.SQL> set serveroutput on 32.SQL> call javademo1(); 33. 34.调用 35.实现。 36. 37.SQL> call dbms_java.set_output(5000); 38. 39.调用 40.实现。 41. 42.SQL> call javademo1(); 43.hello, java demo1 44. 45.调用 46.实现。 47. 48.SQL> call javademo1(); 49.hello, java demo1 50.调用 51.实现。 2. 使用外部class文件来装载缔造 e.g. 这里既然用到了外部文件,必定要将class文件放到oracle Server 的某一目录下边。 1.public class OracleJavaProc 2.{ 3. public static void main(String[] argv) 4. { 5. System.out.println("Its a Java Oracle procedure."); 6. } 7.} 8. 9. 10.SQL> grant create any directory to scott; 11. 12.授权 13.顺利。 14. 15.SQL> conn scott/tiger@iihero.oracledb

存储过程写法

获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值 例:向Order表插入一条记录,返回其标识 CREATE PROCEDURE[dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEGIN SET NOCOUNT ON; BEGIN INSERT INTO[Order](o_buyerid ) VALUES (@o_buyerid ) SET@o_id=@@IDENTITY END END 存储过程中获得方法: DECLARE@o_buyerid int DECLARE@o_id bigint EXEC[nb_order_insert]@o_buyerid ,o_id bigint 2.RETURN过程返回值 CREATE PROCEDURE[dbo].[nb_order_insert]( @o_buyerid int , @o_id bigint OUTPUT ) AS BEGIN SET NOCOUNT ON; IF(EXISTS(SELECT*FROM[Shop]WHERE[s_id]=@o_shopid)) BEGIN INSERT INTO[Order](o_buyerid ) VALUES (@o_buyerid ) SET@o_id=@@IDENTITY RETURN1—插入成功返回1 END ELSE RETURN0—插入失败返回0 END

存储过程中的获取方法 DECLARE@o_buyerid int DECLARE@o_id bigint DECLARE@result bit EXEC@result=[nb_order_insert]@o_buyerid ,o_id bigint 3.SELECT 数据集返回值 CREATE PROCEDURE[dbo].[nb_order_select]( @o_id int ) AS BEGIN SET NOCOUNT ON; SELECT o_id,o_buyerid FROM[Order] WHERE o_id =@o_id GO 存储过程中的获取方法 (1)、使用临时表的方法 CREATE TABLE[dbo].[Temp]( [o_id][bigint]IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, [o_buyerid][int]NOT NULL ) INSERT[Temp]EXEC[nb_order_select]@o_id –这时Temp就是EXEC执行SELECT 后的结果集 SELECT*FROM[Temp] DROP[Temp]—删除临时表 (2)、速度不怎么样.(不推荐) SELECT*from openrowset(’provider_name','Trusted_Connection=yes’,'exec nb _order_select’) 1.获取Return返回值 程序代码 //存储过程 //Create PROCEDURE MYSQL // @a int,

Oracle+PlSql存储过程 学习文档

Oracl e 存储过程 目录 Oracle 存储过程 (1) Oracle存储过程基础知识 (1) Oracle存储过程的基本语法 (2) 关于Oracle存储过程的若干问题备忘 (4) 1. 在Oracle中,数据表别名不能加as。 (4) 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利 用游标的话就另当别论了。 (5) 3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。 (5) 4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错 (5) 5. 在存储过程中,关于出现null的问题 (5) 6. Hibernate调用Oracle存储过程 (6) 用Java调用Oracle存储过程总结 (6) 一、无返回值的存储过程 (6) 二、有返回值的存储过程(非列表) (8) 三、返回列表 (9) 在存储过程中做简单动态查询 (11) 一、本地动态SQL (12) 二、使用DBMS_SQL包 (13) Oracle存储过程调用Java方法 (16) Oracle高效分页存储过程实例 (17) Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

用JDBC操作Oracle的存储过程返回值.

用JDBC操作Oracle的存储过程返回值 Oracle的存储过程可以返回任何类型,包括一个ResultSet,JDBC自带的CallableStatement可以提供操作这些返回值得借口,其中我们可以通过registerOutParameter来注册需要返回的类型。CallableStatement是PrepareStatement的一个子类,但提供了返回和注册Out类型参数的功能。我们看一下例子,在Oracle里面我们定义了一个包如下: create or replace package GP_TESTP is type my_dCursor is ref cursor; procedure GP_Test(m_cursor2 OUT my_dCursor; end GP_TESTP; create or replace package body GP_TESTP is procedure GP_Test(m_cursor2 OUT my_dCursor is begin open m_cursor2 for select bom.material_no,bom.product_no from gp2_bom bom where bom.year=2006 ; end GP_Test; end GP_TESTP; 在JDBC里面我们可以通过如下的接口来得到返回的动态游标的内容 Global.start(; //初始化连接池 ConnectionWrapper wrapper=ConnectionPoolFactory.getPoolInstance(.borrowConnection(;//从连接池里面返回连接 Connection conn=wrapper.getConnection(; try { String callSql="{call GP_TESTP.GP_Test(?}"; CallableStatement cs = null; ResultSet rs=null; cs = conn.prepareCall(callSql; cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR; cs.execute(; rs = (ResultSetcs.getObject(2; while(rs.next({ //String s=rs.get(""; String component=rs.getString(2; String productNo=rs.getString(4; System.out.println("component="+component+"-------productNo="+productNo; } } catch (SQLException e { // TODO Auto-generated catch block e.printStackTrace(; } 注意兰颜色的代码是注册动态游标和返回结果集的关键代码。 ======================================= 2008年07月06日星期日 07:41 P.M.一:无返回值的存储过程存储过程为: CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2 AS BEGIN INSERT INTO HYQ.B_ID (I_ID,I_NAME VALUES (PARA1, PARA2; END TESTA; 然后呢,在java里调用时就用下面的代码: package com.hyq.src; import java.sql.*; import java.sql.ResultSet; public class TestProcedureOne { public TestProcedureOne( { } public static void main(String[] args { String driver = "oracle.jdbc.driver.OracleDriver"; String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq "; Statement stmt = null;

SQL Server存储过程和参数示例

一些用在SQL 2000的企业管理GUI中,并且不打算用于其他的流程。微软已预计将其中的一些存储过程从未来的SQL Server版本中删除(或已经删除了)。虽然这些存储过程可能很有用并为你节省了很多时间,但是他们可以在任何时候改变他们的函数或简单的删除掉。 下面的图表显示了当许多存储过程从一个Microsoft SQL Server版本移入另一个版本时,引入了新的存储过程,而原来的一些则从安装包里删除了。大多数的存储过程,如果不是所有的,要求用户是系统管理员服务器角色以便执行这些存储过程。和文件系统交互的存储过程还要求执行存储过程的用户(还有SQL Server的服务帐户)具有访问文件/文件夹的权限。 sp_executeresultset 微软在SQL Server 2005中删除了这个名为sp_executeresultset的便利小程序。它允许你在空闲时通过使用SELECT查询产生动态SQL代码。然后,作为结果的SQL命令将会在数据库上执行。它允许你创建单独的一行代码,这行代码可以在单步中查询到你的数据库里

的每一个表的记录数目(就像例子中所显示的)。这是一个未公开的存储过程,而且无法知道它为什么被删除了。但是,唉,这个便利的有用存储过程已经没有了。 exec sp_execresultset 'SELECT ''SELECT '''''' + name + '''''', count(*) FROM '' + name from sysobjects where xtype = ''U''' sp_MSforeachdb / sp_MSforeachtable sp_MSforeachdb / sp_MSforeachtable 两个存储过程,sp_MSforeachdb和sp_MSforeachtable封装了一个指针。它们允许你对你的SQL Server上的每一个数据库和当前数据库中的每一个表分别执行T-SQL代码。然而你不能在SQL2000和之前的版本中在一个sp_MSforeachdb命令中使用sp_MSforeachtable命令。在这些存储过程中使用的指针名称是一样的(hCForEach),因此在每一次执行sp_MSforeachtable时会返回一个错误说该指针名称已经在使用。在SQL Server 2005中,微软解决了这一问题。为了执行“下一个”命令,你必须告诉其中的一个存储过程它将使用一个不同的替换字符而不是默认的问号。我改变了数据库命令中的这个替换字符,因为它更为简单。 打印当前数据库中的每一个表的名称 exec sp_MSforeachtable 'print ''?''' 打印当前服务器的每一个数据库 exec sp_MSforeachdb 'print ''?''' 打印当前数据库的每一个表 exec sp_MSforeachdb 'use [@] exec sp_MSforeachtable ''print ''''@.?''''''', '@' sp_readerrorlog / xp_readerrorlog 存储过程sp_readerrorlog实际上有两种形式。每一项的工作内容一样;一个是另一个的简单封装。封装的存储过程是sp_readerrorlog,它调用xp_readerrorlog。这两个都有四个输入参数,但是只有前两个对我们有用。第一个参数设定你希望看到的文件编号。第二

Oracle存储过程基本结构

1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字 2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) 例子: BEGIN

SELECT col1,col2 into 变量1,变量2 FROM typestruct wher e xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ... 3.IF 判断 IF V_TEST=1 THEN BEGIN do something END; END IF; 4.while 循环 WHILE V_TEST=1 LOOP BEGIN

XXXX END; END LOOP; 5.变量赋值 V_TEST := 123; 6.用for in 使用cursor ... IS CURSOR cur IS SELECT * FROM xxx; BEGIN FOR cur_result in cur LOOP BEGIN V_SUM :=cur_result.列名1+cur_result.列名2 END; END LOOP;

END; 7.带参数的cursor CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHE RE TYPEID=C_ID; OPEN C_USER(变量值); LOOP FETCH C_USER INTO V_NAME; EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER; 8.用pl/sql developer debug 连接数据库后建立一个Test WINDOW 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试 关于oracle存储过程的若干问题备忘 1.在oracle中,数据表别名不能加as,如:

相关文档
最新文档