Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2885373
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: C/C++

2013-02-05 17:30:00

给同事写个一个Pro*C调用存储过程返回的游标的小例子。


Microsoft Windows XP [版本 5.1.2600]

(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\htaix>cd c:\


C:\>sqlplus test/test@remotedb

SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 2月 5 16:48:02 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> SELECT * FROM T;

        ID NAME
---------- ----------------------------------------
         1 a
         2 b
         3 c
         4 d

SQL> CREATE OR REPLACE PROCEDURE GETCURSOR(MYCURSOR OUT SYS_REFCURSOR)
  2  AS
  3  BEGIN
  4     OPEN MYCURSOR FOR SELECT * FROM T;
  5  END;
  6
  7  /

过程已创建。

SQL> SET SERVEROUT ON
SQL> declare
  2     mycursor sys_refcursor;
  3     v_row t%rowtype;
  4  begin
  5    GETCURSOR(mycursor);
  6    loop
  7       fetch mycursor into v_row;
  8       exit when mycursor%notfound;
  9       dbms_output.put_line('id='||v_row.id);
 10    end loop;
 11    close mycursor;
 12  end;
 13  /
id=1
id=2
id=3
id=4

PL/SQL 过程已成功完成。

SQL>

创建了一个返回游标类型的存储过程。


Pro*C代码如下:


#include
#include
#include
exec sql include sqlca;


main()
{
  exec sql begin declare section;
    char *username="test/test@remotedb";
    int id;
    char name[20];
    sql_cursor t_cursor;
  exec sql end   declare section;
  exec sql connect :username;
  exec sql allocate :t_cursor;
   EXEC SQL EXECUTE
       BEGIN
            GETCURSOR(:t_cursor);
       END;
   END-EXEC;
   exec sql whenever not found do break;
   while(1)
   {
    exec sql fetch :t_cursor into :id,:name;  
    printf("id: %d,name: %s\n",id,name);
   }
  exec sql close :t_cursor;
  exec sql free :t_cursor;
  exec sql commit work release;
}


编程成可执行文件,执行结果如下:


/home/cpicsrv/yansp > ./test
id: 1,name: a                  
id: 2,name: b                  
id: 3,name: c                  
id: 4,name: d 
阅读(3861) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

CU博客助理2013-04-08 17:55:37

嘉宾点评:本文介绍了如何在ORACLE中定义一个返回游标的存储过程,并通过Pro * C 调用此过程,获取游标,展示数据的过程。内容浅显易懂,实例虽简短,却足以讲解清楚知识点。只是作为普及性文章,对背景知识介绍不够,不了解 Pro * C的读者可能无法弄清楚上下文;对于已经对 Pro * C 有相当了解的读者而言,知识有些简单,启发性不足。如果博主在文章格式上再下点功夫,使操作和说明能够清晰的分辨出来,博文的质量和可读性将更上一层楼。(感谢您参与博文评选,结果即将公布)