求Oracle PLSQL编写

求Oracle PLSQL编写,第1张

过程

定义:CREATE [OR REPLACE] PROCEDURE <过程名>[(参数列表)] IS

[局部变量声明]

BEGIN

可执行语句

EXCEPTION

异常处理语句

END [<过程名>];

变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;

在PL/SQL块中直接使用过程名;在程序外使用execute <过程名>[(参数列表)]

函数

定义:CREATE [OR REPLACE] FUNCTION <过程名>[(参数列表)] RETURN 数据类型 IS

[局部变量声明]

BEGIN

可执行语句

EXCEPTION

异常处理语句

END [<过程名>];

变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;

定义:

定义包的规范

CREATE [OR REPLACE] PACKAGE <数据包名> AS

--公共类型和对象声明

--子程序说明

END;

定义包的主体

CREATE [OR REPLACE] PACKAGE BODY <数据包名> AS

--公共类型和对象声明

--子程序主体

BEGIN

-初始化语句

END;

alter index alarminfo1 rebuild;

这个得用动态语句执行,改成这样:

create or replace procedure rebuild_index Is

--说 明:重建告警索引,压缩表空间

begin

execute immediate 'alter index alarminfo1 rebuild';

commit;

end rebuild_index;

在oracle中,函数存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点。刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别。

一、存储过程

1定义

存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure。

2创建存储过程

create [or replace] procedure 存储过程名

[(参数1 类型,参数2 out 类型……)] 

as

变量名类型;

begin

程序代码体

end;

示例一:无参无返

create or replace procedure p1

--or replace代表创建该存储过程时,若存储名存在,则替换原存储过程,重新创建

--无参数列表时,不需要写()

as

begin

dbms_outputput_line('hello world');

end;

--执行存储过程方式1

set serveroutput on;

begin

p1();

end;

--执行存储过程方式2

set serveroutput on;

execute p1();

示例二:有参有返

create or replace procedure p2

(name in varchar2,age int,msg out varchar2)

--参数列表中,声明变量类型时切记不能写大小,只写类型名即可,例如参数列表中的name变量的声明

--参数列表中,输入参数用in表示,输出参数用out表示,不写时默认为输入参数。

------------输入参数不能携带值出去,输出参数不能携带值进来,当既想携带值进来,又想携带值出去,可以用in out

as

begin

msg:='姓名'||name||',年龄'||age;

--赋值时除了可以使用:=,还可以用into来实现

--上面子句等价于select '姓名'||name||',年龄'||age into msg from dual;

end;

--执行存储过程

set serveroutput on;

declare

msg varchar2(100);

begin

p2('张三',23,msg);

dbms_outputput_line(msg);

end;

示例三:参数列表中有in out参数

create or replace procedure p3

(msg in out varchar2)

--当既想携带值进来,又想携带值出去,可以用in out

as

begin

dbms_outputput_line(msg); --输出的为携带进来的值

msg:='我是从存储过程中携带出来的值';

end;

--执行存储过程

set serveroutput on;

declare

msg varchar2(100):='我是从携带进去的值';

begin

p3(msg);

dbms_outputput_line(msg);

end;

示例四:存储过程中定义参数

create or replace procedure p4

as

--存储过程中定义的参数列表

name varchar(50);

begin

name := 'hello world';

dbms_outputput_line(name);

end;

---执行存储过程

set serveroutput on;

execute p4();

总结:1创建存储过程的关键字为procedure。

2传参列表中的参数可以用in,out,in out修饰,参数类型一定不能写大小。列表中可以有多个输入输出参数。

3存储过程中定义的参数列表不需要用declare声明,声明参数类型时需要写大小的一定要带上大小。

  4as可以用is替换。

5调用带输出参数的过程必须要声明变量来接收输出参数值。

6执行存储过程有两种方式,一种是使用execute,另一种是用begin和end包住。

存储过程虽然有很多优点,但是它却不能使用return返回值。当需要使用return返回值时,我们可以使用函数。

二、存储函数

1函数与存储过程的结构类似,但是函数必须有一个return子句,用于返回函数值。

create or replace function f1

return varchar--必须有返回值,且声明返回值类型时不需要加大小

as

msg varchar(50);

begin

msg := 'hello world';

return msg;

end;

--执行函数方式1

select f1() from dual;

--执行函数方式2

set serveroutput on;

begin

dbms_outputput_line(f1());

end;

三、存储过程与存储函数的区别和联系

相同点:1创建语法结构相似,都可以携带多个传入参数和传出参数。

2都是一次编译,多次执行。

不同点:1存储过程定义关键字用procedure,函数定义用function。

2存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。

3执行方式略有不同,存储过程的执行方式有两种(1使用execute2使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form dual;)。

总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。

SELECT COUNT() into out_count FROM IPN_T_GETJI_POINT where RIYO_YMD = riyo_ymd and MONTHLY_DATA_CLSS = monthly_data_clss and

COMPANY_CODE = company_code and STORE_CODE = store_code;

在Oracle中要极力避免参数的名称和字段名称相同。

顺便说一下,大哥你写的语法太不规范了,看了头疼。

----修改后的语法试试看---------

CREATE OR REPLACE PACKAGE IPN1IPNGETPOINTINFO

AS

PROCEDURE f_ipnGetPointInfo(

p_riyo_ymd in date, -------添加p_以示区分

p_monthly_data_clss in varchar,

p_company_code in varchar,

p_store_code in number ,

p_out_count out number

);

END;

/

===================================================

CREATE OR REPLACE PACKAGE BODY IPN1IPNGETPOINTINFO AS

PROCEDURE f_ipnGetPointInfo(

p_riyo_ymd in date,

p_monthly_data_clss in varchar,

p_company_code in varchar,

p_store_code in number ,

p_out_count out number)

IS

BEGIN

SELECT COUNT() into p_out_count

FROM IPN_T_GETJI_POINT

where RIYO_YMD = p_riyo_ymd

and MONTHLY_DATA_CLSS = p_monthly_data_clss

and COMPANY_CODE = p_company_code

and STORE_CODE = p_store_code;

END f_ipnGetPointInfo;

END IPNGETPOINTINFO;

/

以上就是关于求Oracle PL/SQL编写全部的内容,包括:求Oracle PL/SQL编写、Oracle 存储过程建立问题、oracle中函数和存储过程的区别和联系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9713576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存