免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2467 | 回复: 13
打印 上一主题 下一主题

Oracle Pro*c入门问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-15 12:52 |只看该作者 |正序浏览
没用过Pro*c
高手指点一下吧
我想写个执行SQL语句的函数
大致看起来是下面那个样子
但是遇到一个问题
标记了XXX的那一行必须写一个SQL语句才行
不然就编译错误
我想在那里放sql_str那个变量
这样就可以传进来什么SQL就执行什么SQL
请问这个怎么写?
谢谢

  1. char *exec_query(char *sql_str, int *col_len)
  2. {
  3.         exec sql whenever sqlerror continue;
  4.         exec sql whenever not found do break;
  5.         exec sql declare cur3 cursor for
  6.                 select a,b from t1;   //XXX
  7. ...
  8. ...
  9. ...
复制代码

论坛徽章:
0
14 [报告]
发表于 2007-05-15 18:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
13 [报告]
发表于 2007-05-15 14:24 |只看该作者
我的ORACLE_HOME下没有demo和sample呢

说说我是怎么打算返回结果集的吧
看起来像这个样子

  1. //首先要告诉函数你查询的是几个字段以及他们的长度
  2. exec_sql(char *sql_str, char *col_len, int col_nums)
  3. {
  4.       if col_nums == 1
  5.           exec sql fetch cur into :c1;
  6.      if col_nums == 2
  7.           exec sql fetch cur into :c1,c2;
  8.      if col_nums == 3
  9.           exec sql fetch cur into :c1,:c2,c3;
  10. ....

  11. }
复制代码

嘿嘿

论坛徽章:
0
12 [报告]
发表于 2007-05-15 14:09 |只看该作者

把sql语句后面的;去掉就好了。。。。

论坛徽章:
0
11 [报告]
发表于 2007-05-15 14:04 |只看该作者
返回结果集缓缓再说
现在这个程序死循环了
在while(1)那里死循环
怎么搞的


  1. #include <stdio.h>

  2. EXEC SQL INCLUDE SQLCA;
  3. #define USERNAME        "fa"
  4. #define PASSWORD        "system"

  5. int DB_login(void) {
  6.         EXEC SQL WHENEVER SQLERROR GOTO SqlError;
  7.         EXEC SQL CONNECT :USERNAME IDENTIFIED BY :PASSWORD;
  8.         EXEC SQL SET TRANSACTION READ WRITE;

  9.         if (getenv( "NLS_DATE_FORMAT" ) == NULL) {
  10.                 EXEC SQL ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD';
  11.         }

  12.         return (0);

  13. SqlError:
  14.         return(-1);
  15. }

  16. char *exec_query(char *sql_str, int *col_len)
  17. {
  18.         char c1[10],c2[10];
  19.         char *ret = NULL;
  20.         char lsql[128];
  21.         
  22.         /* DB Search    */
  23.         exec sql whenever sqlerror continue;
  24.         exec sql whenever not found do break;

  25.         strcpy(lsql, sql_str);
  26.         exec sql prepare psql from :lsql;
  27.         exec sql declare cur3 cursor for psql;
  28.         exec sql open cur3;
  29.         
  30.         ret = malloc(5000);
  31.         while (1) {
  32.                 EXEC SQL FETCH cur3 INTO :c1, :c2;
  33.                 memcpy(ret, c2, 10);
  34.         }
  35.         return ret;
  36. }

  37. int main()
  38. {
  39.         printf("%d\n",DB_login());
  40.         printf("%s\n",exec_query("select a,b from t1;",NULL));
  41. }

复制代码

论坛徽章:
0
10 [报告]
发表于 2007-05-15 13:41 |只看该作者
LZ看一下$ORACLE_HOME//precomp/demo/proc目录下的sample

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-05-15 13:35 |只看该作者
算了,不聊了,反正该帖也会被伟大的 langue 版主转到 Oracle 版。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-05-15 13:35 |只看该作者
要先 prepare 一把才行。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-05-15 13:34 |只看该作者
Oracle 动态 SQL 要比 DB2 的稍微麻烦一点点。
其实作为 select 来讲,最难的不是如何去执行它,而是如何去获得它执行的效果——结果集。
你打算以什么样的形式获得结果集?

我这里有封装好的函数。
对于单条记录的,返回一个 name => value 对的链表。
对于多条记录的,将每一行记录作为一个链表调用一个回调函数。
但在有些情况下,并不适合用回调函数。
C 里面有没有 Python 的生成器,所以还得提供另一套接口。
不过因为我的程序里用不到,也就这样了。

论坛徽章:
0
6 [报告]
发表于 2007-05-15 13:33 |只看该作者
我这样写的
有错误


  1. EXEC SQL BEGIN DECLARE SECTION;
  2.                 char            lvar[20];
  3.                 char            lsql[512];
  4.         EXEC SQL END DECLARE SECTION;
  5.         strcpy(lsql, sql_str);
  6.         exec sql declare cur3 cursor for
  7.                  lsql;
  8.         exec sql open cur3;
  9. ...
  10. ...
  11. ...
复制代码
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP