CREATE OR REPLACE PROCEDURE test1
(
cv_1 IN OUT SYS_REFCURSOR,
cv_2 IN OUT SYS_REFCURSOR
)
AS
v_database NVARCHAR2(128);
BEGIN--这个结果集我要得到
open cv_1 for
SELECT *
FROM ( SELECT 字段1,字段2 FROM 表1 )
WHERE ROWNUM <= 1; IF ( 没有记录 ) THEN --请问这个如果处理 SELECT *
INTO v_database from (select 字段1 from 表2) IF ( 存在记录 ) THEN --请问这个如果处理
--这个结果集我要得到
open cv_2 for SELECT v_database from dual;
else
操行别的操作
END IF;
END IF;END;
-------------------------
CV_1 外面要得到的,不想再执行一次count(*),请问有没有好的解决方法
(
cv_1 IN OUT SYS_REFCURSOR,
cv_2 IN OUT SYS_REFCURSOR
)
AS
v_database NVARCHAR2(128);
BEGIN--这个结果集我要得到
open cv_1 for
SELECT *
FROM ( SELECT 字段1,字段2 FROM 表1 )
WHERE ROWNUM <= 1; IF ( 没有记录 ) THEN --请问这个如果处理 SELECT *
INTO v_database from (select 字段1 from 表2) IF ( 存在记录 ) THEN --请问这个如果处理
--这个结果集我要得到
open cv_2 for SELECT v_database from dual;
else
操行别的操作
END IF;
END IF;END;
-------------------------
CV_1 外面要得到的,不想再执行一次count(*),请问有没有好的解决方法
procedure usp_LoadPage(p_return_cursor out pkg_common.type_cursor, p_page_index number, p_page_size number) is
v_sql varchar2(200);
v_rec_count number;
v_min number;
v_max number;
begin
v_sql := 'select count(1) from TB_BASE';
execute immediate v_sql into v_rec_count; v_max := p_page_index * p_page_size;
v_min := v_max - p_page_size + 1;
v_sql := 'select * from (select rownum rn, A.* from TB_BASE A where rownum <= ' || v_max || ' ) where rn >= ' || v_min ;
--v_sql := 'select * from (select rownum rn, A.* from TB_BASE A where rownum <= ' || v_max || ' order by fieldName) where rn >= ' || v_min ;
open p_return_cursor for v_sql;
end;
那你就去提取游标 估计这个效率还不一定有执行count(*)高
自己看着办吧
感觉楼主有滥用游标的嫌疑,能不用游标就不要用,效率比sql语句还是要差很多的.
你这个为什么一定要游标 count(*) 不行吗?
CREATE OR REPLACE PROCEDURE test1
(
cv_1 IN OUT SYS_REFCURSOR,
cv_2 IN OUT SYS_REFCURSOR
)
AS
v_database NVARCHAR2(128);
BEGIN
open cv_1 for
SELECT *
FROM ( SELECT 字段1,字段2 FROM 表1 )
WHERE ROWNUM <= 1; Loop
Fetch cv_1 Into cv_1_Row;
EXIT WHEN cv_1%NOTFOUND; --存在记录
BEGIN
blnRecode = true; --true:have data open cv_2 for SELECT v_database from dual; -- 没有记录
IF blnRecode = false THEN
SELECT *
INTO v_database from (select 字段1 from 表2)
END IF;END;
有多个
select
外面用dataset来接收,不得用游标吗。还有别的方法。
对是否存在记录的判断如果用select count(*) into v_flag from tab;
if v_flag > 0 thenend if;如果tab记录特别多的话 select count(*) from tab 很慢。可以考虑这样:
select count(*) into v_flag from tab where rownum < 2;