oracle如何搭建存储,oracle 建立存储过程

ORACLE如何创建存储过程,详细例子。

--创建存储过程 IN_SHEETID 为输入参数CREATE OR REPLACE a class="baidu-highlight" href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9Ph7bmhfvm1bzPvnzm1N90AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank"PROCEDURE/a ST_RECEIPT(IN_SHEETID VARCHAR2) ISBEGIN--将 receipt0表中数据插入 receiptINSERT INTO RECEIPTSELECT * FROM RECEIPT0 WHERE SHEETID = IN_SHEETID;--更新receipt表中Flag值UPDATE RECEIPT SET FLAG = 100 WHERE SHEETID = IN_SHEETID;--INSERT INTO RECEIPTITEMSELECT * FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID;--删除ReceiptItem0表数据DELETE FROM RECEIPTITEM0 WHERE SHEETID = IN_SHEETID;--删除 receipt0表数据DELETE FROM RECEIPT0 WHERE SHEETID = IN_SHEETID;a class="baidu-highlight" href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9Ph7bmhfvm1bzPvnzm1N90AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank"END/a;--调用存储过程BEGINST_RECEIPT('ys141128');a class="baidu-highlight" href=";tn=44039180_cprfenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1d9Ph7bmhfvm1bzPvnzm1N90AP8IA3qPjfsn1bkrjKxmLKz0ZNzUjdCIZwsrBtEXh9GuA7EQhF9pywdQhPEUiqkIyN1IA-EUBtkP1n1n1RdPjTvP1bvrH6kP10L" target="_blank"END/a;--或者EXEC ST_RECEIPT('ys141128');

网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了南充免费建站欢迎大家使用!

oracle存储过程基本语法

一:存储过程

创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限   

删除存储过程,是过程的创建者或者拥有DROP ANY PROCEDURE系统权限 

修改存储过程,则只能是过程的创建者或者拥有ALTER ANY PROCEDURE系统权限的人

执行(或调用)存储过程,是过程的创建者或是拥有EXECUTE ANY PROCEDURE系统权限的人或是被拥有者授予EXECUTE权限的人

1:语法

1)创建

CREATE[ORREPLACE]PROCEDURE存储过程名[(参数[IN|OUT|INOUT] 数据类型...)]

{AS|IS}

[说明部分]

BEGIN

可执行部分

[EXCEPTION

错误处理部分]

END[过程名];

说明:

OR REPLACE 表示如果存在就覆盖存储过程

参数有三种形式:IN、OUT和IN OUT。则默认为IN。

关键字AS也可以写成IS,后跟过程的说明部分,可以在此定义过程的局部变量。

2)删除存储过程:

DROP PROCEDURE 存储过程名;

3)修改存储过程:

  ALTER PROCEDURE 存储过程名 COMPILE; 

4)执行存储过程

  EXECUTE 模式名.存储过程名[(参数...)]; 

 或

   BEGIN 

模式名.存储过程名[(参数...)];

END;

另外:参数可以是变量、常量或表达式

要其它用户执行存储过程须要给其它用户授权

GRANT EXECUTE ON 存储过程名 TO 用户名

2:参数说明

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

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

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

1)参数名 IN 数据类型 DEFAULT 值;

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

      可以是常量、有值变量或表达式

      DEFAULT 关键字为可选项,用来设定参数的默认值。如果在调用存储过程时不指明参数,则参数变量取默认值

      在存储过程中,输入变量接收主程序传递的值,但不能对其进行赋值。

2)参数名 OUT 数据类型;

      定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主程序。

      在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。

      在存储过程中,参数变量只能被赋值而不能将其用于赋值,而且必须给输出变量至少赋值一次。

3)参数名 IN OUT 数据类型 DEFAULT 值; 

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

      在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。

      DEFAULT 关键字为可选项,用来设定参数的默认值。

      在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值。在存储过程中必须给变量至少赋值一次。

补充:如果省略IN、OUT或IN OUT,则默认模式是IN。 

      调用它时参数个数与位置可以不一致,用以下形式调用:

EXECUTE CHANGE_SALARY(P_RAISE=80,P_EMPNO=7788);  //=运算符左侧是参数名,右侧是参数表达式

二:函数

创建函数,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限

删除函数,需要是函数的创建者或者是拥有DROP ANY PROCEDURE系统权限的人

修改函数,需要是函数的创建者或者拥有ALTER ANY PROCEDURE系统权限的人

执行函数,需要是函数的创建者或拥有EXECUTE ANY PROCEDURE系统权限的人

1:语法

1)创建:

CREATE[ORREPLACE]FUNCTION函数名[(参数[IN] 数据类型...)]

RETURN数据类型

{AS|IS}

[说明部分]

BEGIN

可执行部分

RETURN(表达式)

[EXCEPTION

错误处理部分]

END[函数名];

说明:

 参数是可选的,但只能是IN类型(IN关键字可以省略)。

 在定义部分的RETURN 数据类型,用来表示函数的数据类型,也就是返回值的类型,不可省略。

 在可执行部分的RETURN(表达式),用来生成函数的返回值,其表达式的类型应该和定义部分说明的函数返回值的数据类型一致。在函数的执行部分可以有多个RETURN语句,但只有一个RETURN语句会被执行,一旦执行了RETURN语句,则函数结束并返回调用环境。 

2)删除

  DROP FUNCTION 函数名;

3)修改

  ALTER PROCEDURE 函数名 COMPILE;

4)执行

  变量名:=函数名(...) 

三:对存储过程 和 函数的查看(可以通过对数据字典【USER_SOURCE】的访问来查询存储过程或函数的有关信息)

1:查询某个存储过程序内容

select TEXT from user_source WHERE NAME='存储过程名';

2:查看数据字殿

DESCRIBE USER_SOURCE ; //命令行中

3:查看存储过程的参数

DESCRIBE say_hello; //后面是过程名

4:查看发生编辑错误

SHOW ERRORS ;

5:查询一个存储过程或函数是否是有效状态(即编译成功)

SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='过程名';//注意大小写

VALID表示该存储过程有效(即通过编译),INVALID表示存储过程无效或需要重新编译。它的状态会改变,这与它依赖外部表(表删除修改等操作)有关系

6:查看存储过程与表的依赖关系

SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';

说明

NAME为实体名,TYPE为实体类型,REFERENCED_OWNER为涉及到的实体拥有者账户,REFERENCED_NAME为涉及到的实体名,REFERENCED_TYPE 为涉及到的实体类型。

问题:

如果一个用户A被授予执行属于用户B的一个存储过程的权限,在用户B的存储过程中,访问到用户C的表,用户B被授予访问用户C的表的权限,但用户A没有被授予访问用户C表的权限,那么用户A调用用户B的存储过程是失败的还是成功的呢?答案是成功的。

Oracle如何创建存储过程和如何调用存储过程

【delphi+oracle报表解决方案(一)】delphi中调用oracle的存储过程(分带返回游标,不返回值两种)

关键字: delphi ,oracle存储过程,游标,返回数据集,报表注:delphi 6+ oracle 8.1.6一.创建包与包体1.附:建表aaclass为下面作测试用create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );INSERT INTO aaclass values('c1', 'cn1', 10 ) ;

INSERT INTO aaclass values('c2', 'cn2', 40 ) ;

INSERT INTO aaclass values('c1', 'cn3', 30 ) ;

commit;2.建包:CREATE OR REPLACE PACKAGE PKG_JCCTEST1

AS type rc_class is ref cursor;

--求p1,p2的和与差,返回的多个值通过游标返回

procedure GetSubAndSum2(p1 number,p2 number ,

ResultCursor out rc_class);

--查询满足条件的数据集,返回数据集通过游标返回

procedure GetClass2(a in number,ResultCursor out rc_class ) ; --往表中插一条记录,不返回结果集时,本人用AdoQuery调用(adodataset好象要求必须返回结果集)

procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,

p_pnumber number) ;

end PKG_JCCTEST1; 3.建包体CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1

ASprocedure GetSubAndSum2(p1 number,p2 number ,

ResultCursor out rc_class)

IS

BEGIN

open ResultCursor for

select p1-p2 as "sum", p1+p2 as "sub" from dual;

END ;

procedure GetClass2(a in number,ResultCursor out rc_class )

is

begin open ResultCursor for

select aaclass.* from aaclass where pnumber a;end ;procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,

p_pnumber number)

is

begin

insert into aaclass values(p_cid,p_cname,p_pnumber) ;

-- commit;

end ; 二.在delphi中利用AdoDataSet调用上述第一个存储过程

1.利用AdoConnection1连接数据库(驱动为 oracle Provider for OLE DB),

**并在连接字符串中加入这一节: PLSQLRSet=1; 如下所示:

Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=12.在窗体上加AdoDataSet1 指明连接为上述AdoConnection1,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:

procedure TForm1.Button1Click(Sender: TObject);

var

AResult , BResult : integer;

begin

ADODataSet1.Close ;

ADODataSet1.CommandType := cmdText ;

ADODataSet1.Parameters.Clear ; //***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理

//输出游标的参数不需要指定!!!!!!,本来此函数带三个参数,我们这里只需要传两个参数.

ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ; //***C 顺序有关,createparam必须放在commandtext赋值语句之后. // 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,45为传入的实参值

ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);

//创建第二个参数,根据createparameter的顺序 自动与call中的第二个参数对应

ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4); //下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)

ADODataSet1.Open ; //根据存储过程,数据集只有一条记录,所以不需要用while do 来遍历数据集,直接取数据了 //此处的字段名根据包过程中的返回游标 对应的字段名来取

//定义的存储过程返回游标如: open ResultCursor for

// select p1-p2 as "sum", p1+p2 as "sub" from dual;

//把对应的字段值取出来即可

AResult := ADODataSet1.Fields.FieldByName('sub').Value ;

BResult := ADODataSet1.Fields.FieldByName('sum').Value ; //显示结果

showmessage(inttostr(AResult)) ;

showmessage(inttostr(BResult)) ;end;

三.在delphi中利用AdoDataSet调用上述第二个存储过程

还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:procedure TForm1.Button2Click(Sender: TObject);

begin

ADODataSet1.Close ;

ADODataSet1.CommandType := cmdText ;

ADODataSet1.Parameters.Clear ; //***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理

//输出游标的参数不需要指定!!!!!!,本来此函数带两个参数,我们这里只需要传一个参数.

ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ; //***C 顺序有关,createparam必须放在commandtext赋值语句之后. // 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,20为传入的实参值

ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);

//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)

ADODataSet1.Open ; while not ADODataSet1.Eof do

begin

showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +

'--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +

'--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)

) ;

ADODataSet1.Next ;

end ;

end; 四 利用adoquery调用第三个过程,不返回数据集的procedure TForm1.Button3Click(Sender: TObject);

begin

AdoQuery1.Close ;

AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;

AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;

AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;

AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ; AdoQuery1.ExecSQL ;

end;

五 利用adoquery调用第一个过程,返回数据集的.

procedure TForm1.Button4Click(Sender: TObject);

begin

AdoQuery1.Close ;

AdoQuery1.Parameters.Clear ; AdoQuery1.SQL.Clear ; AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;

AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;

AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ; AdoQuery1.Open ; Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+

string( AdoQuery1.FieldByName('sum').Value));

end;六.关于三层体系的此类问题两层的解决了,三层类似.

中间层用tadodataset 或tadoquery (+tdatasetprovider),中间层的adoconnection的连接字符串加上plsqlRset=1;

客户端用clientdataset ,大同小异,举例如下: begin

//调用相应的过程

ClientDataSet1.Close ;

ClientDataSet1.Params.Clear ; ClientDataSet1.CommandText := '{call PackageName.ProcedureName(?,?)}' ;

ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;

ClientDataSet1.Open ;

end ;

本文来自CSDN博客,转载请标明出处:


当前文章:oracle如何搭建存储,oracle 建立存储过程
本文路径:http://scyanting.com/article/hsiogh.html