oracle输出参数怎么定义,oracle参数说明

Oracle中怎么用游标作为输出参数,写点代码举例吧!

您好,要自己定义一个type [cur_name] is ref cursor游标,返回的时候就直接 procedure AAA(变量名 out [cur_name])如此申明OUT变量

沂南ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!

存储过程 用系统默认的 sys_refcursor 游标类型 定义变量就OK了

1、Sql代码

--PL/SQL Code (包中带过程) 过程带游标的OUT参数,返回游标(ref cursor)

create or replace package my_pack as

type my_ref_cursor is ref cursor;

procedure getMyCursor(val out my_ref_cursor);

end my_pack;

create or replace package body my_pack as

procedure getMyCursor(val out my_ref_cursor)

is

begin

open val for select * from student;

end;

end my_pack;

--PL/SQL Code (包中带过程) 过程带游标的OUT参数,返回游标(ref cursor)

create or replace package my_pack as

type my_ref_cursor is ref cursor;

procedure getMyCursor(val out my_ref_cursor);

end my_pack;

create or replace package body my_pack as

procedure getMyCursor(val out my_ref_cursor)

is

begin

open val for select * from student;

end;

end my_pack;

2、Java代码

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:oracle9i","XXX_temp","XXX_temp");

DriverManager.registerDriver (new oracle.jdbc.OracleDriver());

CallableStatement cs = conn.prepareCall("{ call my_pack.getMyCursor(?) }");

cs.registerOutParameter(1,OracleTypes.CURSOR);

cs.execute();

ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);

while(rs.next())

{

System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+ rs.getDate(4)+" "+rs.getString(5));

}

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:oracle9i","XXX_temp","XXX_temp");

DriverManager.registerDriver (new oracle.jdbc.OracleDriver());

CallableStatement cs = conn.prepareCall("{ call my_pack.getMyCursor(?) }");

cs.registerOutParameter(1,OracleTypes.CURSOR);

cs.execute();

ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);

while(rs.next())

{

System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+ rs.getDate(4)+" "+rs.getString(5));

}

3、Sql代码

--PL/SQL Code(存储过程) 带游标的OUT参数,返回游标(ref cursor)

create or replace procedure retCursor(ret_cursor out sys_refcursor)is

ret_cursor_value sys_refcursor;

begin

open ret_cursor_value for select * from student;

ret_cursor:=ret_cursor_value;

end retCursor;

--PL/SQL Code(存储过程) 带游标的OUT参数,返回游标(ref cursor)

create or replace procedure retCursor(ret_cursor out sys_refcursor)is

ret_cursor_value sys_refcursor;

begin

open ret_cursor_value for select * from student;

ret_cursor:=ret_cursor_value;

end retCursor;

4、Java代码

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection conn = Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:oracle9i","XXX_temp","XXX_temp");

DriverManager.registerDriver (new oracle.jdbc.OracleDriver());

CallableStatement cs = conn.prepareCall("{ call retCursor(?) }");

cs.registerOutParameter(1,OracleTypes.CURSOR);

cs.execute();

ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);

while(rs.next())

{

System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+ rs.getDate(4)+" "+rs.getString(5));

}

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection conn = Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:oracle9i","XXX_temp","XXX_temp");

DriverManager.registerDriver (new oracle.jdbc.OracleDriver());

CallableStatement cs = conn.prepareCall("{ call retCursor(?) }");

cs.registerOutParameter(1,OracleTypes.CURSOR);

cs.execute();

ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);

while(rs.next())

{

System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+ rs.getDate(4)+" "+rs.getString(5));

}

5、下面是个每个学生求平均值的存储过程。遇到的问题是带参数游标中的变量名字不要和表中的一样,否则会出问题

Sql代码

create or replace procedure AAA

as

--查询学生表的ID

cursor s_sno is select s.sno from student s;

--通过学生ID查询平均成绩

cursor sc_avg(s_no varchar2) is select avg(sc.degree) from score sc where sc.sno=s_no;

s_sno_j student.sno%type; --变量ID

sc_avg_i score.degree%type; --变量平局成绩

begin

open s_sno;--打开查询ID的游标

loop

fetch s_sno into s_sno_j;

exit when s_sno%notfound;

open sc_avg(s_sno_j); --打开查询平均成绩的游标,参数为学生ID

loop

fetch sc_avg into sc_avg_i;

exit when sc_avg%notfound;

dbms_output.put_line(sc_avg_i);

end loop;

close sc_avg;

end loop;

close s_sno;

end AAA;

plsql调用oracle存储过程有输入参数和输出参数 sql语句怎么写如题 谢谢了

假设第一个参数为in参数,每二个参数为out参数:

variable

x

number;

//定义一个绑定变量

exec

过程(1,:x)

//1为输入参数,x为输出参数,过程执行后x就得到输出值了。

print

x

//看结果

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输出参数怎么定义,oracle参数说明
浏览地址:http://myzitong.com/article/dsiegcp.html