是这样的,查询的是公司表bd_corp,三个字段unitcode,unitname,sealeddate。
其中在unitcode like '02%'的时候,sealeddate列会全部是null,这个时候查询的时候不要这一列,在unitcode like '01%'的时候,sealeddate不全是null,需要。
这个据说动态sql能搞定,但是没用过。
求人用过程写出的是:
CREATE OR REPLACE PROCEDURE print_corp(v_cur OUT Sys_Refcursor)
AS
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode like '01%'and sealeddate IS NOT NULL;
IF v_count >0 THEN
OPEN v_cur FOR SELECT unitcode,unitname,sealeddate FROM bd_corp;
ELSE
OPEN v_cur FOR SELECT unitcode,unitname FROM bd_corp;
END IF;
END;
这个过程达到了根据公司表编码unitcode查询,如果查询结果的sealeddate列全是空值,不要这一列。
这个过程有一个缺点,
1,不能在PL/SQL Developer使用,必须在sqlplus中,因为使用了:
SQL> var v_cur refcursor
SQL> exec print_cur(:v_cur);
2,不能讲unitcode作为一个变量,每次查询不同的还要重新定义过程。
我想写成一个function,将unitcode作为一个变量,然后查询的时候可以直接select function(‘xx’) from dual。
请问可以吗?(据说sys_refcursor是oracle9i以后系统定义的一个refcursor,主要用在过程中返回结果集。)
其中在unitcode like '02%'的时候,sealeddate列会全部是null,这个时候查询的时候不要这一列,在unitcode like '01%'的时候,sealeddate不全是null,需要。
这个据说动态sql能搞定,但是没用过。
求人用过程写出的是:
CREATE OR REPLACE PROCEDURE print_corp(v_cur OUT Sys_Refcursor)
AS
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode like '01%'and sealeddate IS NOT NULL;
IF v_count >0 THEN
OPEN v_cur FOR SELECT unitcode,unitname,sealeddate FROM bd_corp;
ELSE
OPEN v_cur FOR SELECT unitcode,unitname FROM bd_corp;
END IF;
END;
这个过程达到了根据公司表编码unitcode查询,如果查询结果的sealeddate列全是空值,不要这一列。
这个过程有一个缺点,
1,不能在PL/SQL Developer使用,必须在sqlplus中,因为使用了:
SQL> var v_cur refcursor
SQL> exec print_cur(:v_cur);
2,不能讲unitcode作为一个变量,每次查询不同的还要重新定义过程。
我想写成一个function,将unitcode作为一个变量,然后查询的时候可以直接select function(‘xx’) from dual。
请问可以吗?(据说sys_refcursor是oracle9i以后系统定义的一个refcursor,主要用在过程中返回结果集。)
解决方案 »
- UpdateXML函数的弊端,如何解决
- 请教一下,嵌套查询,请各位帮我扫扫盲..
- vc++ 存储过程(ORACLE)
- 如何让executeBatch在遇到一条失败后继续执行?
- 超变态的BUG!33-ORA-01002: fetch out of sequence
- vc连接oracle,用ole驱动,连接串应该怎么些?
- pb8.0在服务器上能连上数据库,可是到工作站上却连不上,错误如下:
- 不评测,只调查!请实事求是的回答:贵公司关键业务所使用的数据库是什么?
- 字符集问题,是832 到852,我该把注册表的字符集改成什么,原数据可能是日文的。
- Sqlldr 同时指定控制文件和日志文件
- 关于ORACLE SPLIT 查询的问题,望大虾解答
- 路过的大虾,请假下下!关于ORACLE的DECODE的,谢谢哦!
v_01 Sys_Refcursor;
...
begin
print_corp(v_01);...
end;这样就可以啊
declare
-- Local variables here
v_cur Sys_Refcursor;
v_count NUMBER;
begin
-- Test statements here
SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode like '02%'and sealeddate IS NOT NULL;
IF v_count >0 THEN
OPEN v_cur FOR SELECT unitcode,unitname,sealeddate FROM bd_corp;
ELSE
OPEN v_cur FOR SELECT unitcode,unitname FROM bd_corp;
END IF;
dbms_output.PUT_LINE(v_cur);
end;
你看这样做,最后用 dbms_output.PUT_LINE打印输入游标得到的结果,可是在PL/SQL Developer的test window通不过
-- Local variables here
v_cur Sys_Refcursor;
v_count NUMBER;
begin
-- Test statements here
SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode like '02%'and sealeddate IS NOT NULL;
IF v_count >0 THEN
OPEN v_cur FOR SELECT unitcode,unitname,sealeddate FROM bd_corp;
ELSE
OPEN v_cur FOR SELECT unitcode,unitname FROM bd_corp;
END IF;
dbms_output.PUT_LINE(v_cur);
end;
可是不能通过,不知道 OUT Sys_Refcursor 能否直接写在块里还是我的最后 dbms_output.PUT_LINE(v_cur)有问题。