Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

锋线上的冲杀——论Linux数据库大比拚

来源: 作者: 时间:2007-04-11 点击: [收藏] [投稿]

在编程PostgreSQL的客户程序时,我碰到了一些小错误。例如,如果文档记录是可能的话,在声明一个光标(cursor)时,ecpg把不接受一个 FOR READ ONLY子句 。ORDER BY子句甚至没被实现。

我遇见的问题大都ecpg预处理器有关。Postgres有一个 C API(不管怎么说,ESQL需要被编译进一些东西),它可能是优秀的,但是我没使用它(这就是生活)。当有ESQL时,我准备使用ESQL。

这是摘自postgres-client.pgc的list_books()函数:







void list_books(void) 
{ 
EXEC SQL BEGIN DECLARE SECTION; 
int article_no; 
char author_first_names[30]; 
char author_last_names[30]; 
char title[30]; 
char isbn[14]; 
int wholesale_price; 
int retail_price; 
int copies_available; 
EXEC SQL END DECLARE SECTION; 
EXEC SQL DECLARE book_cursor CURSOR FOR 
SELECT ARTICLE_NO, AUTHOR_FIRST_NAMES, AUTHOR_LAST_NAMES, 
TITLE, ISBN, WHOLESALE_PRICE, RETAIL_PRICE, 
COPIES_AVAILABLE FROM BOOK; 
EXEC SQL OPEN book_cursor; 
while (1) 
{ 
EXEC SQL FETCH NEXT FROM book_cursor 
INTO :article_no, :author_first_names, :author_last_names, 
:title, :isbn, :wholesale_price, :retail_price, 
:copies_available; 
if (sqlca.sqlcode == 100) /* 100 == NOT FOUND */ 
break; /* bail out */ 
printf("\nArticle no. %d\n", article_no); 
printf("%s, %s:\n", author_last_names, author_first_names); 
printf(" %s (%s)\n", title, isbn); 
printf("Bought at %d; selling at %d; %d copies available\n\n", 
wholesale_price, retail_price, copies_available); 
}; 
EXEC SQL CLOSE book_cursor; 
}

代码是相当直观。它声明一些宿主变量,在一个BEGIN/END DECLARE SECTION构造中包装声明,打开一个SELECT光标查询,并且然后一行一行地取到宿主变量中,光标然后关闭。

我使用了更旧的, 遭到一致反对的sqlcode变量而不是更现代的sqlstate,因为这种方式更容易检查一个NOT FOUND情形。



 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Linux入门普及读物 解读Linux编程库   下一篇:Linux系统套接字编程中存在的五个隐患

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号