Oracle數(shù)據(jù)庫開發(fā)(二).Linux下配置使用ProC
2024-08-29 13:45:52
供稿:網(wǎng)友
一、提要 上文簡單介紹了Windows下PRoC配置開發(fā),這次我們使用linux平臺再次配置Oracle ProC開發(fā)環(huán)境(RedHat Linux 9 + Oracle 92)。 《ORACLE數(shù)據(jù)庫開發(fā)(一).Windows下配置使用ProC》和《ORACLE數(shù)據(jù)庫開發(fā)(二).Linux下配置使用ProC》這兩篇文章的目的只是做一些基礎(chǔ)介紹,至于Oracle ProC編譯參數(shù)以及Linux下的ProC Makefile
相關(guān)內(nèi)容,將再后續(xù)文章逐步引入。
一言以弊之,先易后難。二、數(shù)據(jù)庫環(huán)境 與Windows下十分類似,首先確認(rèn)安裝了組件,Oracle - application Development - Pro C-C++ 。安裝后會在$ORACLE_HOME/bin生成相應(yīng)可執(zhí)行文件,在$ORACLE_HOME/precomp/demo/proc下也會生成一些makefile文件和示例。三、示例文件 main.pc
--------------------------------------------------------- #include "sqlca.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sql_error(char *msg)
{
printf("/n%s %s/n", msg,(char *)sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(0);
}
int main() {
EXEC SQL INCLUDE sqlca;
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
EXEC SQL WHENEVER SQLERROR DO sql_error(" <ERROR> ");
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR oraCN[30];
EXEC SQL END DECLARE SECTION;
strcpy(oraCN.arr,"system/manager@linuxdb");
oraCN.len = strlen(oraCN.arr);
oraCN.arr[oraCN.len]='/0';
EXEC SQL CONNECT :oraCN;
printf("/n [OK Connected!] ");
return 0;
} 代碼其實(shí)是Windows的原版。
四、編譯運(yùn)行 無需修改任何參數(shù)文件,即安裝后直接創(chuàng)建main.pc,執(zhí)行如下命令:
$ proc parse=none iname=main.pc
Pro*C/C++: Release 9.2.0.4.0 - ProdUCtion on Thu Jun 7 14:17:05 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
System default option values taken from: /home/ora/ora9/oracle/precomp/admin/pcscfg.cfg
$ gcc -g -o main main.c -I/home/ora/ora9/oracle/precomp/public -L/home/ora/ora9/oracle/lib -lclntsh
$ ./main
<ERROR> ORA-12541: TNS:no listener
成功編譯運(yùn)行,這里也可以使用《ProC動態(tài)SQL示例(第1,2,3種方法)》一文中的示例,將//注釋全部替換為空,即可編譯。
http://blog.csdn.net/liwei_cmg/archive/2006/05/29/759963.aspx
不過會有告警提示:
/tmp/ccC7E6qe.o(.text+0xea): In function `db_connect':
/home/ora/develop/src/db.c:385: the `gets' function is dangerous and should not be used.
這個(gè)是由于使用了gets函數(shù)所致,見gets的man手冊:
BUGS
Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead. It is not advisable to mix calls to input functions from the stdio library with low - level calls to read() for the file descriptor asso-ciated with the input stream; the results will be undefined and very probably not what you want.
要解決這個(gè)問題,可以使用scanf函數(shù)替換gets,獲取屏幕輸入。如 scanf("%s",cmd)。