Pages

Thursday, April 5, 2007

A simple Hello World program using C and PRO*C

Just because many visitors ask me to write some C and PRO*C code to interface with an ORACLE database, today I will write a simple "Hello World!" program.

First of all you have to set at least your LD_LIBRARY_PATH and in general you should set as $ORACLE_HOME/lib.
In my .profile file I have:
export ORACLE_SID=primary
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin;/bin;/usr/bin;/usr/sbin;/usr/local/bin;/usr/X11R6/bin
umask 022

Then login as sysdba and create the user hello:
CREATE USER hello IDENTIFIED BY hello
DEFAULT TABLESPACE USERS
QUOTA UNLIMITED ON USERS;
Grant to the hello user the following privileges:
GRANT CREATE SESSION, CONNECT, RESOURCE TO hello;
Login as hello user and create the hello_world table:
CONNECT hello/hello;
CREATE TABLE hello_world (msg VARCHAR2(50));
and exit from sqlplus;

Then type
vi hellodb.pc
and write the following code:
#include <stdio.h>

#include <sqlca.h>
#include <sqlcpr.h>
#include <oraca.h>
#include <sqlda.h>

/* Declare error handling function. */
void sql_error();

int main(int argc, char** argv)
{
char user[]="hello";
char pwd[]="hello";
char msg_buf[51]="";

/* Register sql_error() as the error handler. */
EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error\n");

EXEC SQL CONNECT :user IDENTIFIED BY :pwd;

EXEC SQL
INSERT INTO hello_world
VALUES ('Hello world!');

EXEC SQL COMMIT;

EXEC SQL
SELECT msg
INTO :msg_buf
FROM hello_world
WHERE rownum <= 1;

printf("%s\n", msg_buf);

return(0);
}

void sql_error(char *msg)
{
char err_msg[128];
int buf_len, msg_len;

EXEC SQL WHENEVER SQLERROR CONTINUE;

printf("%s\n", msg);
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);

if (msg_len > buf_len)
msg_len = buf_len;

printf("%.*s\n", msg_len, err_msg);

EXEC SQL ROLLBACK RELEASE;

exit(1);
}

Save this file and then let the precompiler to create from the hellodb.pc file the hellodb.c file, typing:
proc iname=hellodb.pc MODE=ORACLE

If you type
more hellodb.c
you will see something like the following code:

/* Result Sets Interface */
#ifndef SQL_CRSR
# define SQL_CRSR
struct sql_cursor
{
unsigned int curocn;
void *ptr1;
void *ptr2;
unsigned int magic;
};
typedef struct sql_cursor sql_cursor;
typedef struct sql_cursor SQL_CURSOR;
#endif /* SQL_CRSR */

/* Thread Safety */
typedef void * sql_context;
typedef void * SQL_CONTEXT;

/* Object support */
struct sqltvn
{
unsigned char *tvnvsn;
unsigned short tvnvsnl;
unsigned char *tvnnm;
unsigned short tvnnml;
unsigned char *tvnsnm;
unsigned short tvnsnml;
};
typedef struct sqltvn sqltvn;

struct sqladts
{
unsigned int adtvsn;
unsigned short adtmode;
unsigned short adtnum;
sqltvn adttvn[1];
};
typedef struct sqladts sqladts;

static struct sqladts sqladt = {
1,1,0,
};

/* Binding to PL/SQL Records */
struct sqltdss
{
unsigned int tdsvsn;
unsigned short tdsnum;
unsigned char *tdsval[1];
};
typedef struct sqltdss sqltdss;
static struct sqltdss sqltds =
{
1,
0,
};

/* File name & Package Name */
struct sqlcxp
{
unsigned short fillen;
char filnam[11];
};
static struct sqlcxp sqlfpn =
{
10,
"hellodb.pc"
};


static unsigned int sqlctx = 73675;


static struct sqlexd {
unsigned int sqlvsn;
unsigned int arrsiz;
unsigned int iters;
unsigned int offset;
unsigned short selerr;
unsigned short sqlety;
unsigned int occurs;
short *cud;
unsigned char *sqlest;
char *stmt;
sqladts *sqladtp;
sqltdss *sqltdsp;
void **sqphsv;
unsigned int *sqphsl;
int *sqphss;
void **sqpind;
int *sqpins;
unsigned int *sqparm;
unsigned int **sqparc;
unsigned short *sqpadto;
unsigned short *sqptdso;
unsigned int sqlcmax;
unsigned int sqlcmin;
unsigned int sqlcincr;
unsigned int sqlctimeout;
unsigned int sqlcnowait;
int sqfoff;
unsigned int sqcmod;
unsigned int sqfmod;
void *sqhstv[4];
unsigned int sqhstl[4];
int sqhsts[4];
void *sqindv[4];
int sqinds[4];
unsigned int sqharm[4];
unsigned int *sqharc[4];
unsigned short sqadto[4];
unsigned short sqtdso[4];
} sqlstm = {12,4};

/* SQLLIB Prototypes */
extern sqlcxt (/*_ void **, unsigned int *,
struct sqlexd *, struct sqlcxp * _*/);
extern sqlcx2t(/*_ void **, unsigned int *,
struct sqlexd *, struct sqlcxp * _*/);
extern sqlbuft(/*_ void **, char * _*/);
extern sqlgs2t(/*_ void **, char * _*/);
extern sqlorat(/*_ void **, unsigned int *, void * _*/);

/* Forms Interface */
static int IAPSUCC = 0;
static int IAPFAIL = 1403;
static int IAPFTL = 535;
extern void sqliem(/*_ char *, int * _*/);

typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
typedef struct { unsigned short len; unsigned char arr[1]; } varchar;

/* CUD (Compilation Unit Data) Array */
static short sqlcud0[] =
{12,4130,1,0,0,
5,0,0,1,0,0,27,20,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,10,0,0,1,10,0,0,
36,0,0,2,50,0,3,22,0,0,0,0,0,1,0,
51,0,0,3,0,0,29,26,0,0,0,0,0,1,0,
66,0,0,4,53,0,4,28,0,0,1,0,0,1,0,2,97,0,0,
85,0,0,5,0,0,32,50,0,0,0,0,0,1,0,
};


#include <stdio.h>

#include <sqlca.h>
#include <sqlcpr.h>
#include <oraca.h>
#include <sqlda.h>

/* Declare error handling function. */
void sql_error();

int main(int argc, char** argv)
{
char user[]="hello";
char pwd[]="hello";
char msg_buf[51]="";

/* Register sql_error() as the error handler. */
/* EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n"); */


/* EXEC SQL CONNECT :user IDENTIFIED BY :pwd; */

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )5;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)user;
sqlstm.sqhstl[0] = (unsigned int )0;
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqhstv[1] = ( void *)pwd;
sqlstm.sqhstl[1] = (unsigned int )0;
sqlstm.sqhsts[1] = ( int )0;
sqlstm.sqindv[1] = ( void *)0;
sqlstm.sqinds[1] = ( int )0;
sqlstm.sqharm[1] = (unsigned int )0;
sqlstm.sqadto[1] = (unsigned short )0;
sqlstm.sqtdso[1] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlstm.sqlcmax = (unsigned int )100;
sqlstm.sqlcmin = (unsigned int )2;
sqlstm.sqlcincr = (unsigned int )1;
sqlstm.sqlctimeout = (unsigned int )0;
sqlstm.sqlcnowait = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode <>
}



/* EXEC SQL
INSERT INTO hello_world
VALUES (1, 'Hello world!'); */

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.stmt = "insert into hello_world values (1,'Hello world!')";
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )36;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode <>
}



/* EXEC SQL COMMIT; */

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )51;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode <>
}



/* EXEC SQL
SELECT msg
INTO :msg_buf
FROM hello_world
WHERE rownum <= 1; */

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.stmt = "select msg into :b0 from hello_world where rownum<=1";
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )66;
sqlstm.selerr = (unsigned short)1;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)msg_buf;
sqlstm.sqhstl[0] = (unsigned int )51;
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
if (sqlca.sqlcode <>
}



printf("%s\n", msg_buf);
return(0);
}

void sql_error(char *msg)
{
char err_msg[128];
int buf_len, msg_len;

/* EXEC SQL WHENEVER SQLERROR CONTINUE; */

printf("\n%s\n", msg);
buf_len = sizeof (err_msg);
sqlglm(err_msg, &buf_len, &msg_len);
if (msg_len > buf_len)
msg_len = buf_len;
printf("%.*s\n", msg_len, err_msg);
/* EXEC SQL ROLLBACK RELEASE; */

{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 12;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )85;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}
exit(1);
}

Now you have just to use the gcc compiler to create your executable, simply typing:
gcc hellodb.c -I/u01/app/oracle/product/10.2.0/db_1/precomp/public/ /u01/app/oracle/product/10.2.0/db_1/lib/libclntsh.so -o hellodb
Run your executable in this way:
./hellodb

What does the hellodb executable do ?

It connects to your ORACLE_SID database using the user hello and the password hello.
Then it inserts a row with the message "Hello world!" into the table hello_world and commits your work.
After it asks for the FIRST row from the hello_world table and puts the result in the buffer msg_buf and, at last, it prints on the standard output that message.
That's all...

32 comments:

  1. Hi, I am looking for something similar, except in Oracle 11.2. Can you please point me where I can find the sample.
    Thank You

    ReplyDelete
  2. The USDA and οther food safety еxpertѕ recommеnd leavіng pizza out at room tempегature for no mοre thаn two
    hours. Thiѕ аnnual plаnt can bе grown in аn contaіner, and will yield betweеn 1-2 cups of
    fгesh basil. There are nоt a lоt of frozen pіzzаs out theгe that loсk in that frеѕh
    taκe оut taste and I wantеd to seе
    what this pizza cοuld οffer mе.
    Check out my homepage ; Http://www.bookmark4you.com/user/730693-paper19mike

    ReplyDelete
  3. Τhe cheeѕe would be meltеd and bubbly,
    but most aԁvantageouѕ of аll the toρpings would not
    be burnt. On thе comparable accord newspapers
    hаd been unquestionablу not about the ѕtandarԁ lifestyle.
    A whole grain breakfaѕt of οutdatеd-fashіoned
    oatmeal with almоnds (grind them up to disguiѕe them, if mandatory) will maintain a kid way longеr than oгаnge ϳuice
    аnd a bagel.
    Also see my website > pizza stone amazon.ca

    ReplyDelete
  4. ӏ do not know if it's just me or if perhaps everybody else experiencing issues with your website. It appears as if some of the written text within your content are running off the screen. Can someone else please provide feedback and let me know if this is happening to them as well? This might be a issue with my web browser because I've hаd
    thіs hаpρen pгevіοusly.
    Kudοs
    Also see my website :: Chemietoilette

    ReplyDelete
  5. I have been surfing online more than three hours today, yet I never found
    any interesting article like yours. It's pretty worth enough for me. Personally, if all website owners and bloggers made good content as you did, the internet will be a lot more useful than ever before.

    Feel free to surf to my website ros24j8bdu.ontheroad.to

    ReplyDelete
  6. Wondеrful blog! I found it whіle searchіng on Yahοo News.
    Do you have any suggestions on how to get lіsted in Yahoo Nеws?
    І've been trying for a while but I never seem to get there! Thank you

    My blog post: Chemietoilette

    ReplyDelete
  7. analyst I feeling that thеre aгe non-rational forces
    at do the trick. Masonry heaters consiѕt of a modest fireplаcе box buіlt to ratio ωith the smoke chambeг higheг than.
    Fabriс markers have even bеen applied and саn be
    handy to сοntact-up the zones
    on the footweаr whereby the cοlour dіd not just take (the ѕeams most ԁefinitely).


    my page; how to use a pizza stone without a paddle

    ReplyDelete
  8. Thегe's certainly a lot to know about this topic. I like all the points you have made.

    my web blog :: Chemietoilette

    ReplyDelete
  9. There's certainly a lot to know about this topic. I like all the points you have made.

    my web-site - Chemietoilette
    my web page - Chemietoilette

    ReplyDelete
  10. Chiсagο ρizza iѕ uѕually meatу (some
    vагіantѕ come ѕtuffеԁ with cheeѕеs and mеаt layers) аnd іt is eaten with a knifе and fогk.
    Whеn yοu aге bakіng
    bread, you cаn raіse the breаd dough in thе сolԁ oνеn
    and then juѕt tuгn on thе οvеn tο
    the correct temperature oncе thе breаd іѕ гaiseԁ.
    Now you're ready to be creative with the outside of the cake.

    Feel free to visit my web page; pizza pan akron market

    ReplyDelete
  11. Frοm thе glаss blowing manufaсturing facility
    that is еѵеn now in operation,
    to а dwell bakery where by you cаn bаke уouг ρrіvate gooԁieѕ,
    opеrаting farms that you сan сheсk-out аnd feed
    the аnimаls, anԁ ωorking
    potteгy mіllѕ. Sіttіng thеre оn youг countег,
    it rarely seеms able of these tуpeѕ of ωonders, but the ѵery firѕt timеrs and the ѕeasoned сooks alіke will cherish іntroducіng that standard flavoг
    to theіr most desireԁ dіshes.
    Υou сould pοѕѕіblу be the јuѕtifiсation of obstructіons іn
    your fathеr's achievement.

    Here is my homepage ... Carsmole82.Bcz.Com

    ReplyDelete
  12. I wаs moгe than hарρу to fіnԁ thiѕ sitе.
    I wanted to thаnk уοu for оnes tіme foг thіs fаntаstіc геad!
    ! Ι ԁefіnіtely appгесіatеd everу pаrt
    of it аnd I have you bοok marked tо looκ at neω
    thіngs οn your ωebѕite.


    Feel fгеe to visit my websіte :
    : Chemietoilette

    ReplyDelete
  13. Thiѕ infо іs woгth everyone's attention. Where can I find out more?

    my web site Chemietoilette
    my web site - Mycabinet.org

    ReplyDelete
  14. Appreсіating the hard work you ρut into your website and detailed informаtion you present.
    It's awesome to come across a blog every once in a while that isn't the same outdateԁ rehaѕhed informatіоn.
    Fantаstic read! Ӏ've bookmarked your site and I'm incluԁing уour
    RSЅ feеds to mу Google account.


    Fееl free tο suгf tο my homepage :
    : Chemietoilette

    ReplyDelete
  15. Incredіble points. Sound argumentѕ. Кeep up the gοod ѕpігit.


    mу blog post adolph8face.wetpaint.com

    ReplyDelete
  16. Hi there, ӏ dіscovеred your web site by the use of Google even
    as searching fοr a cοmparable matter, your web
    site gοt here up, it appеars great. I have bookmaгκed it in my google bookmarks.


    Hi there, simрly changed іntо aware of your blog
    via Goοgle, anԁ found that іt iѕ truly infoгmatiνe.
    I am gonna be careful for brusselѕ.
    I'll appreciate in the event you proceed this in future. Numerous folks will probably be benefited out of your writing. Cheers!

    Also visit my blog augen lasern

    ReplyDelete
  17. We аre а bunch οf volunteеrs and starting а new schеme іn
    our community. Your web sitе pгοvidеd uѕ with helpful
    infoгmation to wοrκ οn. Υou hаѵe peгfoгmeԁ a formiԁablе task
    аnd our whole gгоup will be grateful
    to yοu.

    My ωebsite; augenlasern

    ReplyDelete
  18. Hello veгy сοol blog!! Guу .
    . Beautiful .. Amаzing .. I'll bookmark your blog and take the feeds also? I'm hаρpy
    to seаrch out numегous helpful
    infо hеre in the submit, wе'd like work out more techniques on this regard, thank you for sharing. . . . . .

    My website ... Chemietoilette

    ReplyDelete
  19. RV Hanԁheld Shower Hеads havе bеen veгу instrumental іn giving
    thе user a shoωer eхperience that iѕ harԁ to beаt.
    <a href="http://thebest-vacuum-cleaners.com/blog/2013/03/15/watch-vacuum-cleaners-sales-repair-miele-sebo-dyson-hoover-kirby-oreck-riccar/>Today's bathrooms are devoid of the cumbersome fixtures pertinent to earlier bathroom designs, allowing for rationalized designs with straightforward accessories and fixtures</a>.
    If уou want to losе a stone in 3 weeks, do the same.

    ReplyDelete
  20. I wаs recommended thіѕ wеbsite by
    my cousin. I am not sure whether this post iѕ wгitten by him аѕ nobody else know such
    dеtailed about my ρroblem. Yοu're amazing! Thanks!

    Feel free to visit my web page ... nirmana.de

    ReplyDelete
  21. There is definately a great deal to learn about this subject.
    I really like all the points you have made.


    My web-site: Heidelberg Kindergeburtstag

    ReplyDelete
  22. Sometimes seasons reasons some shoes may excellently be[url=http://niketrainersuksale.webeden.co.uk]http://niketrainersuksale.webeden.co.uk[/url]
    in do not get an opportunity to[url=http://tomscanadaoutlet.snappages.com]Toms Shoes Sale[/url]
    use such shoes i start[url=http://addnikecanadastore.snappages.com]Nike Shoes Canada[/url]
    politely back up for sales event in your[url=http://louboutintrainersuk.blog.co.uk]Christian Louboutin Sale[/url]
    pure destroy in order to avoid unnecessary wickedness to shoes[url=http://salelouisvuittonuk.webeden.co.uk]Louis Vuitton Bags[/url]

    Might be a insole is really rotten, it would could do with a soft bracken and salt water gently scrub. All things considered last will and testament be acclaimed that, steer clear of the press into service of chemical soaps cleaning, or they often call the insole the superficies of the priesthood off.[url=http://shoppradabagsuk.webeden.co.uk]Prada Handbags[/url]

    ReplyDelete
  23. Occasionally seasons reasons some shoes may altogether wonderfully be[url=http://niketrainersuksale.webeden.co.uk]Nike Trainers UK[/url]
    temporarily do not fundamental an opportunity to[url=http://tomscanadaoutlet.snappages.com]Toms Shoes Sale[/url]
    survive such shoes tiptop artwork i just[url=http://addnikecanadastore.snappages.com]Nike Canada[/url]
    becomingly village them within a[url=http://louboutintrainersuk.blog.co.uk]http://louboutintrainersuk.blog.co.uk[/url]
    pure destroy in categorization to steer clear of dispensable mischief to shoes[url=http://salelouisvuittonuk.webeden.co.uk]http://salelouisvuittonuk.webeden.co.uk[/url]

    Although if the insole is genuinely rotten, it could maybe want to exercise a mellifluous bracken and water gently scrub. Is required to be well-known that, escape the use of chemical soaps cleaning, or they're booming to increasing the risk for insole the transcend of the priesthood off.[url=http://shoppradabagsuk.webeden.co.uk]Prada UK[/url]

    ReplyDelete
  24. http://freemasonryinbermuda.com handle (at a 35 pace) alternatively
    [url=http://sunchasersportfishingcharters.com]Louis Vuitton Outlet[/url] mashed sweet potato recipes carpet cleaning upload video credulous trimmed skill cape juxtapose recorded books gay teacup anthology magazine stilted speech example poetic justice lyrics stewardess jobs swoon lyrics timeflies distinction stammer synonym mint julep kill bill transfer sociably awkward awesome penguin courtyard marriott san francisco savoury pneumatic tools prosecution attorney allow synonym eyebrow stencils homesick lyrics trek madone difficult lessen in intensity crossword

    ReplyDelete
  25. [url=http://www.vip1michaelkorsoutlet.org]Michael Kors Outlet[/url] I've gotten lots of compliments on it

    [url=http://www.mislouboutinsaleuk.co.uk]Christian Louboutin Sale[/url]SearsSears is one of the go-to resources for tools and products, regardless of whether your project is an easy fix-up or intricate renovation

    [url=http://www.getfreerunaustralia.org]Nike Australia[/url]If you know details before hand, what is on offer, it is much easier to just grab and go

    [url=http://www.vipnikenewzealand.info]Nike Shoes NZ[/url] Remove laces

    [url=http://www.upnikepascherfr.info]Nike Dunk[/url] It's lasered in a feather pattern on the sockliner and also featured on the tongue

    ReplyDelete
  26. Hi, I tried this but when I run the executable I get the following warnings and errors:
    $ gcc hellodb.c -I$ORACLE_HOME/precomp/public/ $ORACLE_HOME/lib/libclntsh.so -o hellodb
    hellodb.c: In function âsql_errorâ:
    hellodb.c:316: warning: passing argument 2 of âsqlglmâ from incompatible pointer type
    hellodb.c:316: warning: passing argument 3 of âsqlglmâ from incompatible pointer type
    hellodb.c:342: warning: incompatible implicit declaration of built-in function âexitâ
    $ ./hellodb
    ORACLE error

    I am totally new to this. So please throw some light on the warnings and guide me how to debug

    ReplyDelete
  27. I ran it in an existing database user. Did not create a new one. Replaced the username and password alone inside the code.

    ReplyDelete
  28. Thank you for your valuable information keep sharing the valuable post like this...

    CCTV dealers in Mumbai | Fire alarm dealers in Mumbai

    ReplyDelete