请问:在oracle中的过程中怎么返回一个游标?

作者&投稿:章英 (若有异议请与网页底部的电邮联系)
请问Oracle存储过程如何返回游标?~

有俩种方法:
一种是声明系统游标,一种是声明自定义游标,然后后面操作一样,参数类型为
in out 或out
(1)声明个人系统游标.(推荐)
create or replace p_temp_procedure
(
cur_arg out sys_refcursor; --方法1
)
begin
open cur_arg for select * from tablename;
end
调用
declare
cur_calling sys_refcursor;
begin
p_temp_procedure(cur_calling); --这样这个游标就有值了
for rec_next in cur_calling loop
....
end loop;
end;

(2)在包头中申明一个游表类型,然后调用者申明一个这个类型的游标变量,传给返回游标的存储过程 ,存储过程out这个结果集,这种方法很麻烦.游标类型不能像索引表一样使用create or replace type方法来创建,所以只能在包中申明,并且需要使用/来执行,后面的存储过程才认这个游标类型.(不推荐,但是建议要知道并且要会这种方式,毕竟它有它存在的道理)
--定义全局变量
create or replace package pkg_package
as
type type_cursor is ref cursor;
type type_record is record
(
test01 varchar2(32),
test02 varchar2(32),
test03 varchar2(32)
);
end;
/
--创建返回游标的存储过程
create or replace procedure p_temp_procedure
(
cur_out_arg out pkg_package.type_cursor
)
is
begin
open cur_out_arg for select * from test;
end;
/
--调用
declare
cur_out_arg pkg_package.type_cursor;
rec_arg pkg_package.type_record;
begin
p_temp_procedure(cur_out_arg);
fetch cur_out_arg into rec_arg;
dbms_output.put_line(rec_arg.test01);
dbms_output.put_line(rec_arg.test02);
dbms_output.put_line(rec_arg.test03);
end;

1:首先你需要创建一个包,并定义你返回的游标的类型、存储过程create or replace package TEST_PKG is-- Public type declarationstype cur_emp is REF CURSOR;procedure test_proc (v_empno in number, emps out cur_emp);end TEST_PKG;2:然后你再创建包体create or replace package body TEST_PKG isprocedure test_proc (v_empno in number, emps out cur_emp)asbeginopen emps for select * from emp where empno=7369;end test_proc;end TEST_PKG ;3,通过JAVA调用cstmt = conn.prepareCall("{call TEST_PKG .test_proc (?)}");cstmt.registerOutParameter(1, OracleTypes.CURSOR);cstmt.execute();//获得结果集

oracle中有很多经常用到的包,他们功能强大,能够完成很多复杂,和不可想象的任务,所以我想请大家帮忙整理出来,不管是高手还是新人只要有对某个包比较熟悉,或者对他的一种使用方法比较熟悉,请帮忙跟贴,对大家的管理工作应该都会有很大帮助的。我先抛砖引玉写一个,希望版主和同志们帮忙。
------------------------------------------------------------------------------------
DBMS_SQL
一:)带有参数及解释
1、OPEN_CURSOR:返回新游标的ID值
2、PARSE:解析要执行的语句
3、BIND_VARIABLE:将给定的数量与特定的变量相连接
4、DEFINE_COLOUMN:定义字段变量,其值对应于指定游标中某个位置元素的值
(仅用于SELECT语句)
5、EXECUTE:执行指定的游标
6、EXECUTE_AND_FETCH:执行指定的游标并取记录
7、FETCH_ROWS:从指定的游标中取出记录
8、COLUMN_VALUE:返回游标中指定位置的元素
9、IS_OPEN:当指定的游标状态为OPEN时返回真值
10、CLOSE_CURSOR:关闭指定的游标并释放内存
11、LAST_ERROR_POSITION:返回出错SQL语句的字节偏移量
12、LAST_ROW_ID:返回最后一条记录的ROWID
13、LAST_SQL_FUNCTION_CODE:返回语句的SQL FUNCTION CODE

二:使用实例:
CREATE OR REPLACE
procedure dml_sql (the_rq varchar2) as
The_c1 Integer;
The_result Integer; --dml_sql_result
M_jls number;
The_xh varchar2(2);
Begin
The_xh:=lpad(ltrim(the_rq),2,'0');
The_C1 :=Dbms_sql.open_cursor;
Dbms_sql.parse(the_C1,'select count(*) from user_indexes
where table_name =''ZDCHB'''||the_xh,dbms_sql.v7);
Dbms_sql.define_column(the_c1,1,M_jls);
The_result:=Dbms_sql.execute(The_c1);
If dbms_sql.fetch_rows(cursor1) >; 0 then
Dbms_sql.column_value(cursor1,1,M_jls);
End if;
Dbms_sql.close_cursor(The_C1);
End;

大家不一定按这个模式来,也不一定要写的这么复杂,知道多少就写多少,整理出来,以后如果能够想用什么包到chinaunix里都能查到,就好了,呵呵!

--------------------------------------------------------------------------------
txfy 回复于:2003-09-16 15:03:09

二:dbms
DBMS_JOB 包介绍
调度任务队列里的任务要使用DBMS_JOB包中的过程。使用任务队列不需要特别的数据库特权。任何可以使用这些过程的用户都可以使用任务队列。
1:参数
SUBMIT
-- 向任务队列提交一个任务
REMOVE
-- 从任务队列中删除指定的任务
CHANGE
-- 改变任务
WHAT
-- 改变指定任务的任务内容
NEXT_DATE
-- 改变指定任务的下一次执行时间
INTERVAL
--改变指定任务的执行时间间隔。
BROKEN
-- 禁止指定任务的执行
RUN
--强制执行指定的任务
----------------------------------------------------------------------------------------------------------------------
2:使用方法
1)向任务队列提交一个任务(submit)
DBMS_JOB.SUBMIT( job OUT BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE DEFAULT SYSDATE,
interval IN VARCHAR2 DEFAULT 'null',
no_parse IN BOOLEAN DEFAULT FALSE)

其中interval指定方式为:
'SYSDATE + 7' 每7天一次
'SYSDATE + 1/48' 每半个小时一次
'NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'') + 15/24' 每个礼拜一的下午3点执行
'NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, ''Q''), 3), ''THURSDAY'')'每个季度的第一个星期四

2)删除任务队列中的任务(remove)
DBMS_JOB.REMOVE(job IN BINARY_INTEGER)
The following statement removes job number 14144 from the job queue:
DBMS_JOB.REMOVE(14144);
3)指定任务的任务内容(WHAT)
DBMS_JOB.WHAT( job IN BINARY_INTEGER,
what IN VARCHAR2)
4)指定下次执行时间,如果你暂时不想让它执行可以设成3004年,呵呵!(next_date)
DBMS_JOB.NEXT_DATE( job IN BINARY_INTEGER,
next_date IN DATE)
5)指定任务的执行时间间隔(NTERVAL)
DBMS_JOB.INTERVAL( job IN BINARY_INTEGER,
interval IN VARCHAR2)
-----------------------------------------------------------------------------------------------------------------------
3:查询状态
显示任务的状态和失败执行的次数。

SELECT job, next_date, next_sec, failures, broken
FROM user_jobs;

JOB NEXT_DATE NEXT_SEC FAILURES B
---------- --------- -------- ---------- -
9125 01-NOV-94 00:00:00 4 N
14144 24-OCT-94 16:35:35 0 N
41762 01-JAN-00 00:00:00 16 Y

显示当前运行的任务的信息。

SELECT sid, r.job, log_user, r.this_date, r.this_sec
FROM dba_jobs_running r, dba_jobs j
WHERE r.job = j.job;
SID JOB LOG_USER THIS_DATE THIS_SEC
---------- ---------- -------------------- --------- --------
12 14144 JFEE 24-OCT-94 17:21:24
25 8536 SCOTT 24-OCT-94 16:45:12


oracle查问号怎么查
1、输入sql语句select查看字符集,查看第一行value值是否为简体中文。2、进入注册表,依次单击HKEY及SOFTWARE。3、新建变量,设置变量名即可。

大神,紧急求问在Oracle数据库中,一个用户表可以存储在两个数据文件中...
Oracle中,一个用户表可以存储在两个数据文件中。因为一个表对应一个表空间,而一个表空间可对应多个数据文件,故表与数据文件是1对N的关系。

在oracle数据库中用户权限的问题
1、oracle中可以建很多个用户,但是oracle是一个支持多用户的数据库,在其中每个用户都是独立的,除非有权限否则互相之间是不可见的,因此没有你说的建好几个用户,其中一个用户可以看到整个表中的数据。2、为了实现你的功能可以建下面几个表:USER_TBL:存储你的用户信息 USER_PRO_TBL:存储用户的权限...

怎样在Oracle中用一个用户访问其它用户的表
select* from schema.tablename 这里的schema 一般是用户名,tablename是表名,另外你想要访问别的用户下的表的时候,你要先赋权,比如A用户想要访问B用户的表,首先要在B用户中执行这样的赋权语句 grant select on 表名 to A; 当然这里要赋什么权限,视具体请客认定 ...

oracle问题:SELECT 1 from dual的作用?
Dual是一个虚拟表,这意味着它返回一个值,在本例中是1。1.Oracle提供的最小的表只有一条记录——“X”——无论您做什么(不要删除记录)。例如,select*fromdual,它只有一条记录;在对双值('Y')执行insert之后,再次查询双表并仍然显示一条记录。2.它是sysuser下的一个内部表。所有用户...

Oracle在数据转储时的字符集问题
我们在使用Oracle的Export和Import过程中 并不希望发生字符的转换 但有时这种转换却是必要的 如我们在安装Oracle数据库时 选择ZHS CGB 字符集 由于这种字符集是一种中文小字符集 对于一些汉字不能够正确表示 这需要通过使用ZHS GBK字符集得到解决 此时就要进行字符集的转换 为了确保Export Import过程中 ...

问下大家oracle中to_timestamp和to_date什么区别啊?
一、区别:1)由于oracle中date类型只支持到秒,不支持到毫秒,所以to_date()不能取到毫秒。2)如果要取到毫秒,oracle 9i以上版本,可以使用timestamp类型,timestamp是date的扩展类型,能支持到毫秒,毫秒的显示精度是6位,不过有效位是3位,即最大值达到999,满1000ms就进为1s。操作演示示例如下:...

oracle错误:ORA-00920:无效的关系运算符,请问应该怎么解决?
当在Oracle数据库中遇到ORA-00920:无效的关系运算符的错误时,可能是因为运算符使用不当。以下是针对这个问题的解决步骤:首先,打开PL\/SQLDeveloper软件,连接到你的数据库(双击plsqldeveloper软件,进行连接数据库。)。在命令行中,尝试进行一个简单的查询,不使用任何限定条件,以确保基础连接和环境没有...

oracle问题:SELECT 1 from dual的作用?
Dual是一个虚拟表,这意味着它返回一个值,在本例中是1。1.Oracle提供的最小的表只有一条记录——“X”——无论您做什么(不要删除记录)。例如,select*fromdual,它只有一条记录;在对双值('Y')执行insert之后,再次查询双表并仍然显示一条记录。2.它是sysuser下的一个内部表。所有用户...

如何在Oracle中找到访问次数最多的表
1 在应用层设计和记录表的访问量 2 数据库级别的触发器--查查资料 如果使用监控视图,行不通,上面2个方法可以试试,1 要更好些!

乐安县13029258888: oracle中在存储过程中怎么返回值 -
祁别百吉: 第一个问题: oracle没有inser into 表 存储过程的语句格式,所以这个需要你根据实际要求换种思路做吧. 第二个问题:sqlserver:'a'+char(10)+'b' oracle:'a' || chr(10) || 'b' sqlserver中的char函数在oracle中是chr,参数和返回值是一样的.

乐安县13029258888: 如何在oracle存储过程中执行动态sql语句 -
祁别百吉: 时需要在oracle 存储过程中执行动态SQL 语句 ,例如表名是动态的,或字段是动态的, 或查询命令是动态的,可用下面的方法: set serveroutput ondeclaren number;sql_stmt varchar2(50); t varchar2(20);beginexecute immediate 'alter session ...

乐安县13029258888: oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用, -
祁别百吉: --存储过程的创建 set serveroutput on; create or replace procedure select_dept( num_deptno in number,--定义in模式变量,要求输入部门编号 var_dname out dept.dname%type,--定义out模式变量,可以存储部门名称并输出 var_loc out dept.loc...

乐安县13029258888: ORACLE中怎么执行存储过程 -
祁别百吉: 我试验过了,就是exec 存储过程名或者execute 存储过程名(参数),请你在仔细确认一下,你的存储过程名写没写对呀,或者你没有进入sqlplus中?---- 以上,希望对你能有帮助.

乐安县13029258888: oracle在存储过程中或者函数中如何使用序列? -
祁别百吉: 使用如下的语句试试 select sequence_name.nextval from dual

乐安县13029258888: oracle存储过程中如何使用数组 -
祁别百吉: 首先你需要定义一个数组类型,然后定义这个数组变量 declare type a_type is table of number; -- type a_type is array(10) of number; -- 下面一种定义方式则指定了该数组的最大元素个数a a_type := a_type(); -- 定义并初始化一个数组变量 begin...

乐安县13029258888: 在Oracle中SQL语句的解析步骤是怎样的呢?
祁别百吉: 在Oracle中SQL语句的解析步骤如下: 1、 语法检测.判断一条SQL语句的语法是否符合SQL的规范,比如执行:SQL> selet * from emp;我们就可以看出由于Select关键...

乐安县13029258888: 如何在ORACLE存储过程中创建临时?如何在ORACLE存储过程
祁别百吉: 在ORACLE存储过程中创建临时表 Java代码 create or replace procedure select_look as str varchar2(100); begin str:='select * from emp'; execute immediate str; end; 在...

乐安县13029258888: Oracle中怎么在存储过程中select结果啊 -
祁别百吉: 在存储过程中定义一个sql语句,然后 EXECUTE IMMEDIATE 就执行该sql语句了,如: EXECUTE IMMEDIATE 'select * from tab where...'

乐安县13029258888: Oracle怎么调用包里面的过程 -
祁别百吉: 在存储过程或函数里调用oracle包的话,首先要有执行这个包的权限;如果包属于其他的用户(不是系统包),调用时:用户名.包名.存储过程(参数)名或者 变量:=用户名.包名.函数(参数);因为函数有返回值,变量类型要跟函数返回值的类型一致.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网