oracle存储过程返回table
㈠ oracle存储过程 中把临时表数据 返回结果集
用索引表快一些,然后使用select * from table(存储过程名(参数列表....))输出。
㈡ oracle如何执行存储过程以及如何返回一个table
sql">-- 定义类型
CREATE OR REPLACE TYPE MyTable AS OBJECT(A int, B int, C int);
/
CREATE OR REPLACE TYPE MyTableResult IS TABLE OF MyTable;
/
CREATE OR REPLACE FUNCTION getTestTable return MyTableResult
IS
-- 预期返回结果.
return_Result MyTableResult := MyTableResult();
BEGIN
-- 结果追加一行.
return_Result.EXTEND;
-- 设置结果内容.
return_Result(return_Result.COUNT) := MyTable(A => 1, B=>2, C=>3);
-- 结果追加一行.
return_Result.EXTEND;
-- 设置结果内容.
return_Result(return_Result.COUNT) := MyTable(A => 4, B=>5, C=>6);
-- 结果追加一行.
return_Result.EXTEND;
-- 设置结果内容.
return_Result(return_Result.COUNT) := MyTable(A => 7, B=>8, C=>9);
return return_Result;
END getTestTable;
/
SQL> SELECT
2 A, B, C
3 FROM
4 table( getTestTable() );
A B C
---------- ---------- ----------
1 2 3
4 5 6
7 8 9
SQL>
㈢ mybatis怎样接收oracle数据库存储过程所返回的Table类型数据和array
帮你看了半天,没有找到好的解决办法,变相方法是可以在plsql中返回一个ref cursor,java中直接用resultset就能接收了。
希望其他人能回答你的问题吧。。
㈣ 在Oracle存储过程中查询的数据结果怎样返回
oracle 跟ms不一样。
要返回表的记录数据,只能通过游标,或者自定义对象数组在存储过程中组装好后返回。
㈤ oracle存储过程可以返回内容吗
可以的。
返回一个游标社!
有俩种方法:
一种是声明系统游标,一种是声明自定义游标,然后后面操作一样,参数类型为
in out 或out
(1)声明个人系统游标.(推荐)
create or replace p_temp_procere
(
cur_arg out sys_refcursor; --方法1
)
begin
open cur_arg for select * from tablename;
end
调用
declare
cur_calling sys_refcursor;
begin
p_temp_procere(cur_calling); --这样这个游标就有值了
for rec_next in cur_calling loop
....
end loop;
end;
㈥ java怎样接受oracle数据库的存储过程所返回的Table类型数据
先在Oracle中建立视图,利用Oracle的PLSQL编写视图来显示存储过程的内容,再用Java访问没问题的。
㈦ ORACLE 存储过程怎么返回临时表结果集
我刚做的,参考下:
SQL> CREATE GLOBAL TEMPORARY TABLE REPROTTEST(
2 ID NUMBER,
3 ANAME VARCHAR2(20)
4 ) ON COMMIT DELETE ROWS;(也可以用PRESERVER ROWS,看实际需求)
Table created
SQL> create or replace procere report_month_responsibility(
2 o_cur out sys_refcursor)
3 as
4 begin
5 insert into reprottest(id,aname) values(1,'1');
6 open o_cur for select * from reprottest;
7 end report_month_responsibility;
8 /
Procere created
SQL> set serverout on
SQL> declare
2 v_id number;
3 v_aname varchar2(20);
4 o_cur sys_refcursor;
5 begin
6 report_month_responsibility(o_cur);
7 fetch o_cur into v_id,v_aname;
8 while o_cur%found loop
9 dbms_output.put_line('输出结果:'||v_id||','||v_aname);
10 fetch o_cur into v_id,v_aname;
11 end loop;
12 commit;
13 end;
14 /
输出结果:1,1
PL/SQL procere successfully completed
你的那个ORA-01031: insufficient privileges,是权限不足的问题。
SQL代码:
CREATE GLOBAL TEMPORARY TABLE REPROTTEST(
ID NUMBER,
ANAME VARCHAR2(20)
) ON COMMIT DELETE ROWS;
create or replace procere report_month_responsibility(
o_cur out sys_refcursor)
as
begin
insert into reprottest(id,aname) values(1,'1');
open o_cur for select * from reprottest;
end report_month_responsibility;
declare
v_id number;
v_aname varchar2(20);
o_cur sys_refcursor;
begin
report_month_responsibility(o_cur);
fetch o_cur into v_id,v_aname;
while o_cur%found loop
dbms_output.put_line('输出结果:'||v_id||','||v_aname);
fetch o_cur into v_id,v_aname;
end loop;
commit;
end;
/
㈧ java怎样接受oracle数据库的存储过程所返回的Table类型数据和array
给你段代码参考,绝对可以:
使用cs.registerOutParameter(2, OracleTypes.STRUCT, DBI.TYPE.T_SMS_TASK);
OracleTypes.STRUCT,表示自定义的table类型, DBI.TYPE.T_SMS_TASK这个是你在oracle里面创建的类型。
我这里相当于返回了一个 自定义的type的index by 表。
public static SMSTaskObj selectSmsTask(int terminateTime) {
ICallableStatement cs = null;
SMSTaskObj taskObj = null;
try {
cs = DbFactory.getInstance().getCallableStatement(
DBI.SERVER_DB_NAME, PROC_SEL_SMS_TASK);
cs.setInt(1, terminateTime);
cs.registerOutParameter(2, OracleTypes.STRUCT, DBI.TYPE.T_SMS_TASK);
cs.registerOutParameter(3, OracleTypes.INTEGER);
cs.execute();
int retVal = cs.getInt(3);
if (retVal != 0) {
throw new Exception("Oracle procere PROC_SEL_SMS_TASK error!");
}
STRUCT struct = (STRUCT) cs.getObject(2);
Datum[] dt = struct.getOracleAttributes();
if (String.valueOf(dt[0].bigDecimalValue()).equals("-1")) {
return null;
}
taskObj = new SMSTaskObj();
taskObj.setTaskId(String.valueOf(dt[0].bigDecimalValue()));
taskObj.setTempId(String.valueOf(dt[1].bigDecimalValue()));
taskObj.setUserGroupId(String.valueOf(dt[2].bigDecimalValue()));
taskObj.setUserId(String.valueOf(dt[3].bigDecimalValue()));
taskObj.setTempContent(dt[4].toString());
taskObj.setParamAmount(dt[5].intValue());
taskObj.setPriorityLevel(String.valueOf(dt[6].intValue()));
} catch (Exception ex) {
log.error(ex);
} finally {
try {
if (cs != null)
cs.close();
} catch (SQLException sqle) {
log.error(sqle);
}
}
return taskObj;
}
㈨ Oracle存储过程创建临时表,插入数据后,怎么返回临时表数据,并在asp.net中接收到datatable中
建一个视图好啦.把结果存起来:
CREATE VIEWVIEW_NAME AS
SELECT * FROM A
UNION ALL
SELELCT * FROM B
这样就会把两张的表内容同时存在视图:VIEW_NAME中.并且还会时时更新.即方便又节省空间.
㈩ oracle 存储过程如何返回tbale
与SQL Server的存储过程和函数均可以返回结果集不同的是,PL/SQL的存储过程和函数均不直接提供返回数据集的方法,但可以通过返回类型对象来实现返回数据集的效果。具体思路为:
(1)创建包头,在其中声明类型和存储过程,类型应该引用游标;
(2)创建包体,定义存储过程,执行查询,将查询得到的结果集以游标句柄的形式返回。
说明:游标分为显示游标和隐式游标,任何查询结果默认都提供隐式游标,当前方案的重点在于使用游标取得查询结果的句柄,由于游标被引用为类型,通过返回类型,即等效于(并不等同)返回数据集。
具体的案例如下:
--创建包头
create or replace package mypackage1
as
--声明类型,并引用游标
type cursorType is ref cursor;
--声明存储过程,两个输入参数,一个输出参数,输出游标类型数据
procere prcGetGlobalAddress
(
pos1 integer, --分页查询的下限
pos2 integer, --分页查询的上限
cur in out mypackage1.cursorType --输出参数,数据类型为引用游标的类型
);
end mypackage1;
--创建包体
create or replace package body mypackage1
as
--定义存储过程
procere prcGetGlobalAddress
(
pos1 integer,
pos2 integer,
cur in out mypackage1.cursorType
)
as
begin
--返回得到分页查询结果集的游标句柄
open cur for
select *
from ( select a.*,rownum rn
from ( select *
from tblsys_globaladdress) a
where rownum<=pos2)
where rn > =pos1;
end prcGetGlobalAddress;
end mypackage1;