求解:select查询列为null不显示的过程转为函数

isumsen 2012-09-05 09:47:35
是这样的,查询的是公司表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,主要用在过程中返回结果集。)
...全文
313 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
isumsen 2012-09-05
  • 打赏
  • 举报
回复
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;
可是不能通过,不知道 OUT Sys_Refcursor 能否直接写在块里还是我的最后 dbms_output.PUT_LINE(v_cur)有问题。
isumsen 2012-09-05
  • 打赏
  • 举报
回复

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通不过
Cryking 2012-09-05
  • 打赏
  • 举报
回复
谁说不能在PL/SQL中使用啊,

declare
v_01 Sys_Refcursor;
...
begin
print_corp(v_01);

...
end;

这样就可以啊
《数据结构》 课程设计报告 专 业 计算机科学与技术 班 级 姓 名 学 号 指导教师 起止时间 2012.12~2013.1 课程设计:排序综合 任务描述 排序综合 任务:利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序 。 要求: (1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序 、起泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不 同的文件中。 (2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出 其中两种较快的方法。 二、问题分析 1、功能分析 分析设计课题的要求,要求编程实现以下功能: (1)排序表的建立—即创建顺序表; (2)顺序表的排序—即直接插入排序、希尔排序、起泡排序、快速排序、简单选择排 序操作; (3)统计每一种排序方法的性能—即测试上机运行程序所花费的时间; 2、数据对象分析 数据信息:随机整数 数据数量可以预先确定(20000以上) 数据结构设计 使用顺序表实现,有关定义如下: typedef int Status; typedef int KeyType ; //设排序码为整型量 typedef int InfoType; typedef struct { //定义被排序记录结构类型 KeyType key ; //排序码 I nfoType otherinfo; //其它数据项 } RedType ; typedef struct { RedType * r; //存储带排序记录的顺序表 //r[0]作哨兵或缓冲区 int length ; //顺序表的长度 } SqList ; //定义顺序表类型 四、功能设计 (一)主控菜单设计 为实现通各种排序的功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为 这些菜单项配上相应的功能。 程序运行后,给出6个菜单项的内容和输入提示,如下: 1. 直接插入排序 2. 希尔排序 3. 起泡排序 4. 快速排序 5. 简单选择排序 0. 退出系统 (二)程序模块结构 由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数): 主控菜单项选择函数menu() 创建排序表函数 InitList_Sq() 对顺序表L进行直接插入排序函数Insertsort() 希尔排序函数ShellSort(); 起泡排序函数Bubble_sort() 快速排序函数QSort ( ) 简单选择排序函数SelectSort() (三)函数调用关系 程序的主要结构(函数调用关系)如下图所示。 Menu() InitList_Sq(L) Main() Insertsort(L) ShellSort() Bubble_sort() QSort ( ) SelectSort() 其中main()是主函数,它进行菜单驱动,根据选择项0~5调用相应的函数。main()函数使 用for循环实现重复选择。其循环结构如下: for (;;) { long start,end; switch(menu()) { case 1: printf("* 直接插入排序 *\n"); start=clock(); Insertsort(L); end=clock(); printf("%d ms\n",end-start); fp=fopen("D:直接插入排序.txt","w"); if(fp==NULL)//打开文件失败 { printf("打开文件失败!\n"); exit(1); } for(i=1;i<=L.length;i++) fprintf(fp,"%d ",L.r[i]); fclose(fp); break; case 2: printf("* 希尔排序 *\n"); start=clock(); ShellSort(L,an,14); end=clock(); printf("%d ms\n",end-start); fp=fopen("D:希尔排序 .txt","w"); if(fp==NULL)//打开文件失败 { printf("打开文件失败!\n"); exit(1); } for(i=1;i<=L.length;i++) fprintf(fp,"%d ",L.r[i]); fclose(fp); break; case 3: printf("* 起泡排序 *\n"); start=clock(); Bubble_sort(L); end=clock(); printf("%d ms\n",end-start); fp=fopen("D: 起泡排序 .txt","w"); if(fp==NULL)//打开文件失败 { printf("打开文件失败!\n"); exi

17,092

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧