µ±Ç°Î»ÖãºÊ×Ò³ > ÍøÂç±à³Ì > Êý¾Ý¿â > Oracle > oracleÖÐpro*cµÄѧϰ

oracleÖÐpro*cµÄѧϰ

µã»÷´ÎÊý£º24 ´Î ·¢²¼ÈÕÆÚ£º2008-11-22 17:01:00 ×÷ÕߣºÔ´´úÂëÍø
Ô´´úÂëÍøÍÆ¼ö

Ò» Pro*C ³ÌÐò¸ÅÊö£º
1£®Ê²Ã´ÊÇPro*C³ÌÐò
ÔÚORACLEÊý¾Ý¿â¹ÜÀíºÍϵͳÖУ¬ ÓÐÈýÖÖ·ÃÎÊÊý¾Ý¿âµÄ·½·¨£»
£¨1£© ÓÃSQL*Plus£¬ ËüÓÐSQLÃüÁîÒÔ½»»¥µÄÓ¦ÓóÌÐò·ÃÎÊÊý¾Ý¿â£»
£¨2£© ÓõÚËÄ´úÓïÑÔÓ¦Óÿª·¢¹¤¾ß¿ª·¢µÄÓ¦ÓóÌÐò·ÃÎÊÊý¾Ý¿â£¬ÕâЩ¹¤¾ßÓÐSQL*Froms£¬QL*Reportwriter,SQL*MenuµÈ£»
£¨3£© ÀûÓÃÔÚµÚÈý´úÓïÑÔÄÚǶÈëµÄSQLÓïÑÔ»òORACLE¿âº¯Êýµ÷ÓÃÀ´·ÃÎÊ¡£
Pro*C¾ÍÊôÓÚµÚÈýÖÖ¿ª·¢¹¤¾ßÖ®Ò»£¬ Ëü°Ñ¹ý³Ì»¯ÓïÑÔCºÍ·Ç¹ý³Ì»¯ÓïÑÔSQL×îÍêÉÆµØ½áºÏÆðÀ´£¬ ¾ßÓÐÍ걸µÄ¹ý³Ì´¦ÀíÄÜÁ¦£¬ÓÖÄÜÍê³ÉÈκÎÊý¾Ý¿âµÄ´¦ÀíÆ·ÈÎÎñ£¬Ê¹Óû§¿ÉÒÔͨ¹ý±à³ÌÍê³É¸÷ÖÖÀàÐ͵ı¨±í¡£ÔÚPro*C³ÌÐòÖпÉÒÔǶÈëSQLÓïÑÔ£¬ ÀûÓÃÕâЩSQLÓïÑÔ¿ÉÒÔÍê³É¶¯Ì¬µØ½¨Á¢¡¢Ð޸ĺÍɾ³ýÊý¾Ý¿âÖÐµÄ±í£¬Ò²¿ÉÒÔ²éѯ¡¢²åÈë¡¢Ð޸ĺÍɾ³ýÊý¾Ý¿â±íÖеÄÐУ¬ »¹¿ÉÒÔʵÏÖÊÂÎñµÄÌá½»ºÍ»Ø¹ö¡£
ÔÚPro*C³ÌÐòÖл¹¿ÉÒÔǶÈëPL/SQL¿é£¬ ÒԸĽøÓ¦ÓóÌÐòµÄÐÔÄÜ£¬ ÌØ±ðÊÇÔÚÍøÂç»·¾³Ï£¬¿ÉÒÔ¼õÉÙÍøÂç´«ÊäºÍ´¦ÀíµÄ×Ü¿ªÏú¡£

2£®Pro*CµÄ³ÌÐò½á¹¹Í¼
ͨË×À´Ëµ£¬Pro*C³ÌÐòʵ¼ÊÊÇÄÚǶÓÐSQLÓï¾ä»òPL/SQL¿éµÄC³ÌÐò£¬ Òò´ËËüµÄ×é³ÉºÜÀàËÆC³ÌÐò¡£ µ«ÒòΪËüÄÚǶÓÐSQLÓï¾ä»òPL/SQL¿é£¬ ËùÒÔËü»¹º¬ÓÐÓëÖ®²»Í¬µÄ³É·Ý¡£ÎªÁËÈôó¼Ò¶ÔPro*CÓиö¸ÐÐÔµÄÈÏʶ£¬ ÌØ½«¶þÕß²î±ð±È½ÏÈçÏ£º
CµÄÈ«³Ì±äÁ¿ËµÃ÷
CÔ´³ÌÐò º¯Êý1£ºÍ¬º¯ÊýK¡£
º¯Êý2£ºÍ¬º¯ÊýK¡£
CµÄ¾Ö²¿±äÁ¿ËµÃ÷
º¯ÊýK
¿ÉÖ´ÐÐÓï¾ä

Ó¦ÓóÌÐòÊײ¿ CµÄÍⲿ±äÁ¿ËµÃ÷
Íⲿ˵Ã÷¶Î£¨ORACLE±äÁ¿ËµÃ÷£©
Í¨Ñ¶ÇøËµÃ÷

Pro*CÔ´³ÌÐò º¯Êý1£ºÍ¬º¯ÊýK¡£
º¯Êý2£ºÍ¬º¯ÊýK¡£
C¾Ö²¿±äÁ¿ËµÃ÷
³ÌÐòÌå ÄÚ²¿ËµÃ÷²¿·Ö ÄÚ²¿ËµÃ÷¶Î
Í¨Ñ¶ÇøËµÃ÷
º¯ÊýK CµÄ¿ÉÖ´ÐÐÓï¾ä
¿ÉÖ´ÐÐÓï¾ä SQLµÄ¿ÉÖ´ÐÐÓï¾ä
»òPL/SQL¿é

¶þ£®Pro*C³ÌÐòµÄ×é³É½á¹¹

ÿһ¸öPro*C³ÌÐò¶¼°üÀ¨Á½²¿·Ö£º£¨1£©Ó¦ÓóÌÐòÊײ¿£»£¨2£©Ó¦ÓóÌÐòÌå
Ó¦ÓóÌÐòÊײ¿¶¨ÒåÁËORACLEÊý¾Ý¿âµÄÓйرäÁ¿£¬ ΪÔÚCÓïÑÔÖвÙ×ÝORACLEÊý¾Ý¿â×öºÃÁË×¼±¸¡£Ó¦ÓóÌÐòÌå»ù±¾ÉÏÓÉPro*CµÄSQLÓï¾äµ÷ÓÃ×é³É¡£Ö÷ÒªÖ¸²éѯSELECT¡¢INSERT¡¢UPDATE¡¢DELETEµÈÓï¾ä¡£
Ó¦ÓóÌÐòµÄ×é³É½á¹¹ÈçͼËùʾ£º
EXEC SQL BEGIN DECLARE SECTION £¨SQL±äÁ¿µÄ¶¨Ò壩EXEC SQL END DECLARE SECTION£»
EXEC SQL INCLUDE SQLLA£»
EXEC SQL CONNECT£º< Óû§Ãû> IDENTIFIED BY: < ¿ÚÁî >
SQL Óï¾ä¼°ÓαêµÄʹÓÃ

1. Ó¦ÓóÌÐòÊײ¿
Ó¦ÓóÌÐòµÄÊײ¿¾ÍÊÇPro*CµÄ¿ªÊ¼²¿·Ö¡£Ëü°üÀ¨ÒÔÏÂÈý²¿·Ö£º
l C±äÁ¿ÃèÊö²¿·Ö£»
l SQL±äÁ¿ÃèÊö²¿·Ö£¨DECLARE²¿·Ö£©£»
l SQLͨÐÅÇø¡£

(1) .DECLARE²¿·Ö£¨ÃèÊö²¿·Ö£©
ÃèÊö²¿·Ö˵Ã÷³ÌÐòµÄSQL±äÁ¿£¬ ¶¨Ò岿·ÖÒÔEXEC SQL BEGIN DECLARE SECTION ;¿ªÊ¼ºÍÒÔ EXEC SQL END DECLARE SECTION £»½áÊøµÄ¡£Ëü¿ÉÒÔ³öÏÖÔÚ³ÌÐòµÄÖ÷²¿£¬Ò²¿É³öÏÖÔÚ¾Ö²¿
l SQL±äÁ¿µÄ˵Ã÷ºÍʹÓÃ
ÔÚ˵Ã÷¶ÎÄÜΪSQL±äÁ¿Ö¸¶¨µÄÊý¾ÝÀàÐÍÈç±íËùʾ£º
Êý¾ÝÀàÐÍ ÃèÊö
CHARCHAR(n)INT SHORT LONG FLOAT DOUBLE VARCHAR µ¥×Ö·ûn¸ö×Ö·ûÊý×éÕûÊý¶ÌÕûÊýµ¥¾«¶È¸¡µãÊýË«¾«¶È¸¡µãÊý±ä³¤×Ö·û´®
ÕâЩÊý¾ÝÀàÐÍʵ¼ÊÉϾÍÊÇCÓïÑÔµÄÊý¾ÝÀàÐÍ£¬ ÆäÖÐVARCHARÖÐÊÓΪCÊý¾ÝÀàÐ͵ÄÀ©³ä¡£ÕâÔÚÒÔºó»á̸µ½¡£
SQL±äÁ¿µÄʹÓÃӦעÒâÒÔϼ¸µã£º
l ±ØÐëÔÚÃèÊö²¿·ÖÃ÷È·¶¨Òå
l ±ØÐëʹÓÃÓëÆä¶¨ÒåÏàͬµÄ´óСд¸ñʽ
l ÔÚSQLÓï¾äÖÐʹÓÃʱ£¬±ØÐëÔÚÆä֮ǰ¼ÓÒ»¸ö¡°£º¡±(ðºÅ)£¬µ«ÔÚCÓï¾äÖÐÒýÓÃʱ²»Ðè¼ÓðºÅ¡£
l ²»ÄÜÊÇSQLÃüÁîÖеı£Áô×Ö¡£
l ¿ÉÒÔ´øÖ¸Ê¾±äÁ¿¡£
ÀýÈ磺EXEC SQL BEGIN DECLARE SECTIONS;
VARCHAR programe[30];
Int porgsal, pempno;
EXEC SQL END DECLARE SECTION;


EXEC SQL SELECT ENAME , SAL
INTO: programe, : progsal
FROM EMP
WHERE EMPNO = : pempno;


(2). ָʾÆ÷±äÁ¿µÄ˵Ã÷ºÍÒýÓÃ
ָʾ±äÁ¿Êµ¼ÊÉÏÒ²ÊÇÒ»ÀàSQL±äÁ¿,Ëü±»ÓÃÀ´¹ÜÀíÓëÆäÏà¹ØÁªµÄËÞÖ÷±äÁ¿£¨¼´ÔÚSQLÓï¾äÖÐ³ä µ±ÊäÈë»òÊä³öµÄ±äÁ¿£©¡£Ã¿Ò»¸öËÞÖ÷±äÁ¿¶¼¿É¶¨ÒåÒ»¸öָʾÆ÷±äÁ¿£¬Ö÷ÒªÓÃÓÚ´¦Àí¿ÕÖµ£¨NULL£©
ָʾÆ÷±äÁ¿µÄ˵Ã÷»ù±¾Í¬Ò»°ãSQL±äÁ¿Ò»Ñù£¬ µ«±ØÐ붨Òå³É2×Ö½ÚµÄÕûÐÍ£¬ÈçSHORT¡¢INT¡£ÔÚSQLÓï¾äÖÐÒýÓÃʱ£¬ ÆäǰҲӦ¼Ó¡°£º¡±(ðºÅ)£¬¶øÇÒ±ØÐ븽ÔÚÆäÏà¹ØÁªµÄËÞÖ÷±äÁ¿Ö®ºó£¬ÔÚCÓï¾äÖУ¬¿É¶ÀÁ¢Ê¹Óᣵ±Ö¸Ê¾Æ÷±äÁ¿Îª-1ʱ£¬±íʾ¿ÕÖµ¡£ÀýÈ磺
EXEC SQL BEGIN DECLARE SECTION ;
INT dept- number;
SHORT ind num;
CHAR emp name;
EXEC SQL END DECLARE SECTION ;

Scanf(¡°90d %s¡±, & dept- number , dept name );
If (dept number ==0)
Ind num = -1;
Else
Ind num = 0;
EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME)
VALUES(:dept number : ind- num , :dept name);
ÆäÖÐind numÊÇdept number µÄָʾÆ÷±äÁ¿¡£µ±ÊäÈëµÄdept number ÖµÊÇ0ʱ£¬ ÔòÏòDEPT ±íµÄDEPTNOÁвåÈë¿ÕÖµ¡£
£¨3£©.Ö¸ÕëSQL±äÁ¿µÄ˵Ã÷ºÍʹÓÃ


Ö¸ÕëSQL±äÁ¿ÔÚÒýÓÃǰҲ±ØÐëÔÚDECLARE ²¿·ÖÏÈ˵Ã÷¡£Æä˵Ã÷¸ñʽͬCÓïÑÔ¡£ÔÚSQLÓï¾äÖÐÒýÓÃʱ£¬Ö¸ÕëÃû×ÖǰҪ¼Óǰ׺¡°£º¡±£¨Ã°ºÅ£©¶ø²»¼Ó¡°*¡±£¨ÐǺţ©¡£ÔÚCÓï¾äÖÐÓ÷¨ÈçͬCÓïÑÔµÄÖ¸Õë±äÁ¿¡£
£¨4£©.Êý×éSQL±ä¸üµÄ˵Ã÷ºÍÒýÓÃ
ÔÚSQLÓï¾äÖÐÒýÓÃÊý×éʱ£¬Ö»ÐèдÊý×éÃû£¨Ãû×Öǰ¼ÓðºÅ£©£¬ ²»Ðèдϱ꣬ÔÚCÓï¾äÖÐÓ÷¨ÈçͬCÓïÑÔµÄÊý×é±äÁ¿¡£
ʹÓÃÊý×é¿É´ó´ó½µµÍÍøÂç´«Ê俪Ïú¡£ÈçÒªÏòÒ»±í²åÈë100ÐÐÊý¾Ý£¬Èç¹ûûÓÐÊý×飬¾ÍÒªÖØ¸´100´Î£¬ ¶øÒýÓúó£¬Ö»ÐëÖ´ÐÐÒ»´ÎinsertÓï¾ä¡¢±ã¿ÉÒ»´ÎÐÔ²åÈë¡£ÀýÈ磺
EXEC SQL BEGIN DECLARE SECTION;
Int emp_number[100];
Char emp_name[100][15];
Float salary[100],commission[100];
Int dept_number;
EXEC SQL END DECLARE SECTION;
¡­.
EXEC SQL SELECT EMPNO,ENAME,SAL,COMM
INTO :emp_number,:emp_name,:salary,:commission
FROM EMP
WHERE DEPTNO=:dept_number;
ÔÚʹÓÃÊý×éʱ£¬Ó¦×¢ÒâÒÔϼ¸µã£»
l ²»Ö§³ÖÖ¸ÕëÊý×é
l Ö»Ö§³ÖһάÊý×飬 ¶ø emp-name [100][15]ÊÓΪһά×Ö·û´®
l Êý×é×î´óάÊýΪ32767
l ÔÚÒ»ÌõSQLÓï¾äÖÐÒýÓöà¸öÊý×éʱ£¬ÕâЩÊý×éάÊýÓ¦Ïàͬ
l ÔÚVALUES , SET, INTO »òWHERE×ÓÃûÖУ¬ ²»ÔÊÐí°Ñ¼òµ¥SQL±äÁ¿ÓëÊý×éSQL±äÁ¿»ìÓÃ
l ²»ÄÜÔÚDELARE²¿·Ö³õʼ»¯Êý×é
ÀýÈ磺ÏÂÃæµÄÒýÓÃÊÇ·Ç·¨µÄ
EXEC SQL BEGIN DECLARE SECTION;
Int dept num [3] = ;
EXEC SQL END DECLARE SECTION ;

EXEC SQL SELECT EMPNO, ENAME , SAL
INTO : emp num [ i ], : emp name [ i ], : salarg [ i ]
FROM EMP
(5) αÀàÐÍVARCHARµÄ˵Ã÷ºÍÒýÓÃ
VARCHAR±äÁ¿ÔÚÒýÓÃ֮ǰҲ±ØÐëÔÚ˵Ã÷¶Î˵Ã÷£¬ ˵Ã÷ʱ±ØÐëÖ¸³ö´®µÄ×î´ó
³¤¶È£¬È磺
EXEC SQL BEGIN DECLARE SECTION£»
Int book number;
VARCHAR book name [ 50 ];
EXEC SQL END DECLARE SECTION ;
ÔÚÔ¤±àÒïʱ£¬ book name ±»·­Òë³ÉCÓïÑÔÖеÄÒ»¸ö½á¹¹±äÁ¿£»
Struct { unsigned short len ;
Unsigned chart arr [ 20 ] ;
} boo name
ÓÉ´Ë¿´³ö£¬ VARCHAR±äÁ¿Êµ¼ÊÉÏÊǺ¬³¤¶È³ÉÔ±ºÍÊý×é³ÉÔ±µÄ½á¹¹±äÁ¿¡£ÔÚSQLÓï¾äÖÐÒýÓÃʱ£¬Ó¦ÒýÓÃÒÔðºÅΪǰ׺µÄ½á¹¹Ãû£¬ ¶ø²»¼Óϱ꣬ÔÚCÓï¾ä ÖÐÒýÓýṹ³ÉÔ±¡£
VARCHAR±äÁ¿ÔÚ×÷Êä³ö±äÁ¿Ê±£¬ÓÉORACLE×Ô¶¯ÉèÖ㬠ÔÚ×÷ΪÊäÈë±äÁ¿Ê±£¬³ÌÐòÓ¦ÏȰÑ×Ö·û´®´æÈëÊý×é³ÉÔ±ÖУ¬ Æä³¤¶È´æÈ볤¶È³ÉÔ±ÖУ¬È»ºóÔÙÔÚSQLÓï¾äÖÐÒýÓá£ÀýÈ磺
Main( )
{ .......
scanf(¡°90s, 90d¡¯, book name .arr, & book number );
book name .len = strlen (book name .arr);
EXEC SQL UPDATE BOOK
SET BNAME = : book name ;
BDESC = : book number ;
}
(6) SQLͨÐÅÇø
SQL ͨÐÅÇøÊÇÓÃÏÂÁÐÓï¾äÃèÊöµÄ£º
EXEC SQL INCLUDE SQLCA£»
´Ë²¿·ÖÌṩÁËÓû§ÔËÐгÌÐòµÄ³É°Ü¼Ç¼ºÍ´íÎó´¦Àí¡£

SQLCAµÄ×é³É
SQLCAÊÇÒ»¸ö½á¹¹ÀàÐ͵ıäÁ¿£¬ËüÊÇORACLE ºÍÓ¦ÓóÌÐòµÄÒ»¸ö½Ó¿Ú¡£ÔÚÖ´ÐÐ Pro*C³ÌÐòʱ£¬ ORACLE °Ñÿһ¸öǶÈëSQLÓï¾äÖ´ÐеÄ״̬ÐÅÏ¢´æÈëSQLCAÖУ¬ ¸ù¾ÝÕâЩÐÅÏ¢£¬¿ÉÅжÏSQLÓï¾äµÄÖ´ÐÐÊÇ·ñ³É¹¦£¬´¦ÀíµÄÐÐÊý£¬´íÎóÐÅÏ¢µÈ£¬Æä×é³ÉÈç±íËùʾ£º
Struct sqlca
{ char sqlcaid [ 8 ] ; ----¨¤±êÊ¶Í¨Ñ¶Çø
long sqlabc; ---¨¤ Í¨Ñ¶ÇøµÄ³¤¶È
long sqlcode; ---¨¤±£Áô×î½üÖ´ÐеÄSQLÓï¾äµÄ״̬Âë
struct { unsigned short sqlerrml; -----¨¤ÐÅÏ¢Îı¾³¤¶È
}sqlerrm;
char sqlerrp [ 8 ];
long sqlerrd [ 6 ];
char sqlwarn [ 8 ];
char sqlext [ 8 ];
}
struct sqlca sqlca;
ÆäÖУ¬ sqlcodeÔÚ³ÌÐòÖÐ×î³£Óõ½£¬Ëü±£ÁôÁË×î½üÖ´ÐеÄSQLÓï¾äµÄ״̬Âë¡£³ÌÐòÔ±¸ù¾ÝÕâЩ״̬Âë×ö³öÏàÓ¦µÄ´¦Àí¡£ÕâЩ״̬ÂëÖµÈçÏ£º
0: ±íʾ¸ÃSQLÓï¾ä±»ÕýÈ·Ö´ÐУ¬Ã»Óз¢Éú´íÎóºÍÀýÍâ¡£
>0:ORACLEÖ´ÐÐÁ˸ÃÓï¾ä£¬µ«Óöµ½Ò»¸öÀýÍ⣨ÈçûÕÒµ½ÈκÎÊý¾Ý£©¡£


<0:±íʾÓÉÓÚÊý¾Ý¿â¡¢ÏµÍ³¡¢ÍøÂç»òÓ¦ÓóÌÐòµÄ´íÎó£¬ORACLEδִÐиÃSQLÓï¾ä¡£
µ±³öÏÖ´ËÀà´íÎóʱ£¬µ±Ç°ÊÂÎñÒ»°ãÓ¦»Ø¹ö¡£
2£®Ó¦ÓóÌÐòÌå
ÔÚPro*C³ÌÐòÖУ¬ ÄܰÑSQLÓï¾äºÍCÓï¾ä×ÔÓɵػìºÏÊéд£¬²¢ÄÜÔÚSQLÓï¾äÖÐʹÓÃSQL±äÁ¿£¬Ç¶ÈëʽSQLÓï¾äµÄÊéдÎÄ·¨ÊÇ£º
l ÒԹؼü×ÖEXEC SQL¿ªÊ¼
l ÒÔCÓïÑÔµÄÓï¾äÖÕ½á·û£¨·ÖºÅ£©ÖÕ½á
SQLÓï¾äµÄ×÷ÓÃÖ÷ÒªÓÃÓÚͬÊý¾Ý¿â´ò½»µÀ¡£CÓïÑÔ³ÌÐòÓÃÓÚ¿ØÖÆ£¬ÊäÈ룬Êä³öºÍÊý¾Ý´¦ÀíµÈ¡£
£¨1£© Á¬½Óµ½ORACLEÊý¾Ý¿â
ÔÚ¶ÔÊý¾Ý¿â´æÈ¡Ö®Ç°£¬±ØÐëÏȰѳÌÐòÓëORACLEÊý¾Ý¿âÁ¬½ÓÆðÀ´¡£¼´µÇ¼µ½ORACLEÉÏ¡£ËùÁ¬½ÓÃüÁîÓ¦¸ÃÊÇÓ¦ÓóÌÐòµÄµÚÒ»¸ö¿ÉÖ´ÐÐÃüÁî¡£Á¬½ÓÃüÁî¸ñʽÈçÏ£º
EXEC SQL CONNECT£º< Óû§Ãû > IDENTIFIED BY : < ¿ÚÁî >
»òEXEC SQL CONNECT£º < Óû§Ãû > / < ¿ÚÁî >
ÔÚʹÓÃÉÏÊöÁ½ÖÖ¸ñʽ½øÐеÇÈëʱ£¬ Ó¦µ±Ê×ÏÈÔÚ˵Ã÷¶Î¶¨Òå°üº¬Óû§ÃûºÍ¿ÚÁîµÄ
SQL ±äÁ¿£¬²¢ÔÚÖ´ÐÐCONNECT֮ǰÉèÖÃËüÃÇ£¬·ñÔò»áÔì³ÉµÇ¼ʧ°Ü¡£ÀýÈ磺
EXEC SQL BEGIN DECLARE SECTION £»
VARCHAR usename [20];
VARCHAR password[20];
EXEC SQL END DECLARE
..........
strcpy ( usename.arr, ¡°CSOTT¡¯);
usename.len = strlen (username.arr);
strcpy (password.arr , ¡°TIGER¡¯);
password .len = strlen( password .arr);
EXEC SQL WHENEVER SQLERROR GOTO SQLERR;
EXEC SQL CONNECT :username INDNTIFIED BY : password;
×¢Òâ: ²»ÄܰÑÓû§ÃûºÍ¿ÚÁîÖ±½Ó±àдµ½CONNECTÓï¾äÖУ¬»òÕß°ÑÓÃÒýºÅ£¨¡¯£©À¨ÆðÀ´µÄ×Öĸ´®ÔÚCONNECT Óï¾äÖУ¬ ÈçÏÂÃæµÄÓï¾äÊÇÎÞЧµÄ¡£
EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER;
EXEC SQL CONNECT ¡®SCOTT¡¯ IDENTIFIED BY ¡®TIGER¡¯;
(2). ²åÈë¡¢¸üкÍɾ³ý
ÔÚ½²ÊöSQLÓïÑÔʱÒÑÏêϸ½²¹ý£¬ ÕâÀï¾Í²»¾ÙÀý˵Ã÷ÁË¡£
(3). Êý¾Ý¿â²éѯ¼°ÓαêµÄʹÓÃ
ÔÚPRO*CÖÐ, ²éѯ¿É·ÖΪÁ½ÖÖÀàÐÍ:
l ·µ»Øµ¥Ðлò¶¨ÐÐÊýµÄ²éѯ;
l ·µ»Ø¶àÐеIJéѯ.´ËÖÖ²éѯҪÇóʹÓÃÓαêÀ´¿ØÖÆÃ¿Ò»Ðлòÿһ×飨Ö÷±äÁ¿ÓÃÊý×飩.
1) ·µ»Øµ¥Ðлò¶¨ÐÐÊýµÄ²éѯ
ÔÚPRO*CÖеIJéѯSQL SELECTÓï¾äÓÉÒÔϼ¸¸ö×Ó¾ä×é³É:
SELECT
INTO
FROM
WHERE
CONNECT BY
UNION
INTERSECT
MINUS
GROUP BY
HAVING
ORDER BY
ÆäÖÐWHERE×Ó¾äÖеIJéѯÌõ¼þ¿ÉÒÔÊÇÒ»¸öÊôÐÔ»ò¶à¸öÊôÐԵļ¯ºÏ,ÔÚÖ´ÐÐÊǸ³ÖµµÄÖ÷±äÁ¿Ò²¿É·ÅÔÚWHERE×Ó¾äÖÐ.WHERE×Ó¾äÖÐËùÓõÄÖ÷±äÁ¿³ÆÎªÊäÈëÖ÷±äÁ¿¡£È磺


SELECT EMPNO, JOB, SAL
INTO:PNAME, :PJOB, :PSAL
FROM EMP
WHERE EMPNO=:PEMPNO;
ÈôûÓÐÕÒµ½ÏÞ¶¨µÄÐÐ, ÔòSQLCA.SQLCODE·µ»Ø¡±+1403¡±, ±íÃ÷¡±Ã»ÓÐÕÒµ½¡±¡£
INTO´Ó¾äÖеÄÖ÷±äÁ¿½ÐÊä³öÖ÷±äÁ¿£¬ËüÌṩÁ˲éѯʱËùÐèÒªµÄÐÅÏ¢¡£
ÔÚÈκÎÏîË͸øÖ÷±äÁ¿Ö®Ç°£¬¶¼ÒªÇóORACLE°ÑÕâЩÏîת»»³ÉÖ÷±äÁ¿µÄÊý¾ÝÀàÐÍ¡£¶ÔÓÚÊý×ÖÊÇͨ¹ý½Ø¶ÏÀ´Íê³ÉµÄ£¨È磺9.23ת»»Îª9£©¡£
Èç¹ûÒÑÈ·¶¨²éѯֻ·µ»ØÒ»ÐУ¬ÄÇô¾Í²»±ØÊ¹ÓÃÓαֻ꣬¸øSELECTÓï¾äÔö¼ÓÒ»¸öINTO×Ӿ伴¿É¡£ÔÚÓïÒåÉÏINTOÓï¾äÔÚFROM֮ǰµÄ²éѯÖÐÓжàÉÙ¸öÑ¡ÔñÏî¾ÍÓжàÉÙ¸öÊä³öÖ÷±äÁ¿¡£ÈôÔÚSELECTÏîÖбí´ïʽµÄÊýÄ¿²»µÈÓÚINTO×Ó¾äÖÐÖ÷±äÁ¿µÄÊýÄ¿£¬¾Í°ÑSQLCA.SQLWARN[3]ÖÃΪ¡±W¡±¡£
2£©¶àÐвéѯ¼°ÓαêµÄʹÓÃ
Èç¹û²éѯ·µ»Ø¶àÐлò²»ÖªµÀ·µ»Ø¶àÉÙÐУ¬Ê¹ÓôøÓÐORACLEÓα꣨CURSOR£©µÄSELECTÓï¾ä¡£
ÓαêÊÇORACLEºÍPRO*C´æ·Å²éѯ½á¹ûµÄ¹¤×÷ÇøÓò¡£Ò»¸öÓα꣨ÒÑÃüÃûµÄ£©ÓëÒ»ÌõSELECTÓï¾äÏà¹ØÁª¡£²Ù×÷ÓαêÓÐÓÉ4ÌõÃüÁ£¨1£©DECLARE CURSOR£»£¨2£©OPEN CURSOR£»£¨3£©FETCH£»£¨4£©CLOSE CURSOR¡£

A. ¶¨ÒåÓαê
Ò»¸öÓÎ±ê±ØÐëÊ×Ïȶ¨Ò壬 ²ÅÄÜʹÓÃËü¡£Ó﷨Ϊ£º
EXEC SQL DECLARE ¡´ÓαêÃû¡µCORSOR FOR
SELECT ¡´ÁСµ
FROM ¡´±í¡µ
ÀýÈ磺
EXEC SQL DECLARE CSOR£¬ CURSOR FOR


×ªÔØÍøÉϵÄһƪÎÄÕÂÖ§³Öһϡ£
PROCÊÇORACLEÊý¾Ý¿âÌṩµÄ±à³Ì½Ó¿ÚÖ®Ò»£¬ÆäÓ¦ÓÃÊ®·ÖµÄ¹ã·º£¬±¾ÎÄͨ¹ýÒ»¸ö¾ßÌåµÄÀý×Ó£¬½éÉÜPROC±à³ÌµÄһЩ¾­Ñ鼰ӦעÒâµÄµØ·½¡£
Àý×Ó³ÌÐò£º
#include
#include
#include
#include
#include


EXEC SQL INCLUDE sqlca;
/*RELEASE_CURSOR=YES ʹPROC ÔÚÖ´ÐÐÍêºóÊÍ·ÅÓëǶÈëSQLÓйØ×ÊÔ´*/
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);

EXEC SQL BEGIN DECLARE SECTION;
varchar vc_user[20];
long al_empno=0;
char ac_ename[11]="";
char ac_hiredate[20]="";
double af_sal=0;

EXEC SQL VAR ac_ename IS STRING(11);
EXEC SQL VAR ac_hiredate IS STRING(20);

EXEC SQL END DECLARE SECTION;


/*´íÎó´¦Àíº¯Êý*/
void sql_error(char *msg)
{
printf(" %s,%ld,%s ", msg,sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK RELEASE;
exit(-1);
}


main()
{
EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE ERROR: ");

/*Á¬½ÓÊý¾Ý¿â*/
strcpy(vc_user.arr,"scott/tiger@DEMO");
vc_user.len=16;
exec sql connect :vc_user;

EXEC SQL DECLARE cur_emp CURSOR FOR
SELECT EMPNO, ENAME,to_char(HIREDATE,"yyyy/mm/dd hh24:mi:ss"),SAL FROM EMP;

EXEC SQL OPEN cur_emp;
while(1)
{
al_empno=0;
strcpy(ac_ename,"");
strcpy(ac_hiredate,"");
af_sal=0;
EXEC SQL FETCH cur_emp INTO :al_empno, :ac_ename:ename_ind, :ac_hiredate:hiredate_ind, :af_sal:sal_ind;
if( sqlca.sqlcode == 1403)
{
break;
}
printf("empno=%ld,ename=%s,hiredate=%s,sal=%lf ",al_empno,ac_ename,ac_hiredate,af_sal);
}
EXEC SQL CLOSE cur_emp;
EXEC SQL ROLLBACK WORK RELEASE;
}

1¡¢ËÞÖ÷±äÁ¿µÄÉùÃ÷
ÔÚPROCÖÐ,ÔÚSQLÓï¾äÖÐÓõ½µÄ±äÁ¿³ÆÎªËÞÖ÷±äÁ¿¡£ËûÃÇÓ¦ÔÚEXEC SQL BEGIN DECLARE SECTION;ÓëEXEC SQL EDN DECLARE SECTION;
Ö®¼äÉùÃ÷£¬ÈçÉÏÃæËùʾ.ÔÚÉùÃ÷ËÞÖ÷±äÁ¿Ê±Ó¦×¢ÒâÒÔϼ¸µã£º
(1) ÔÚÊý¾Ý¿â±íÖж¨ÒåΪVARCHAR2£¬VARCHAR£¬CHARµÄ×ֶΣ¬ÔÚPROCÖпÉÉùÃ÷ΪCHAR£¬µ«³¤¶ÈӦΪËüÃÇÔÚ±íÖж¨ÒåµÄ³¤¶È¼Ó1£¬ÒòΪPROCÖÐ
CHARÐͱäÁ¿ÓÃ×ö½áβ¡£
È磺ENAMEÔÚ±íÖе͍ÒåΪename varchar2(10)£¬ÔÚPROCÖпɶ¨ÒåΪ£º
EXEC SQL BEGIN DECLARE SECTION;
char ename[11];
EXEC SQL END DECLARE SECTION;
³£¼û´íÎó˵Ã÷:
Èç¹û²åÈëµÄ×Ö·û´®³¤¶È´óÓÚ10£¬È磺EXEC SQL INSERT INTO EMP(ENAME) VALUES("12345678901");»á³öÏÖÒÔÏ´íÎó:
error:ORA-01480: STR ¸³Öµ±äÁ¿È±ÉÙ¿Õºó׺¡£

Èç¹û¶¨ÒåΪ:
EXEC SQL BEGIN DECLARE SECTION;
char ename[15];
EXEC SQL END DECLARE SECTION;

µ±²åÈëµÄ×Ö·û´®³¤¶È´óÓÚ10£¬Ð¡ÓÚ15ʱ,È磺EXEC SQL INSERT INTO EMP(ENAME) VALUES("12345678901");»á³öÏÖÒÔÏ´íÎó:
error:ORA-01401: ²åÈëµÄÖµ¶ÔÓÚÁйý´ó¡£
µ±²åÈëµÄ×Ö·û´®³¤¶È´óÓÚ15£¬È磺EXEC SQL INSERT INTO EMP(ENAME) VALUES("12345678901234");»á³öÏÖÒÔÏ´íÎó:
error:ORA-01401:STR ¸³Öµ±äÁ¿È±ÉÙ¿Õºó׺¡£

(2) ´ÓSQLÓï¾äÖÐÈ¡×ֶεÄÖµµ½ËÞÖ÷±äÁ¿ÖÐʱ£¬PROC²»»á×Ô¶¯¸øËÞÖ÷±äÁ¿È¥µôÓÒ¿Õ¸ñ¡£¶øÊÇÒÔÔÚDECLARE SECTION Öж¨ÒåµÄ³¤¶ÈΪ׼(Óë ±íÖж¨ÒåµÄÎÞ¹Ø)²»×ã²¹ÓÒ¿Õ¸ñ.Èç¹û²»×¢ÒâÕâÒ»µã£¬ÔÚPROCÖнøÐÐ×Ö·û´®²Ù×÷ʱ£¨Èç±È½ÏÏàµÈ£©»á³ö´í¡£Èç:
EXEC SQL BEGIN DECLARE SECTION;
char ename[10];
EXEC SQL END DECLARE SECTION;
Èç¹ûENAMEÔÚ±íÖеÄֵΪ"abc",ÔòÈ¡³öµÄֵΪ"abc ";

¿ÉÓÃÓï¾äEXEC SQL VARÖØ¶¨ÒåCHARÐͱäÁ¿¡£ÕâÑùËÞÖ÷±äÁ¿»á×Ô¶¯È¥µôÓÒ¿Õ¸ñ¡£ÈçÏÂ:
EXEC SQL BEGIN DECLARE SECTION;
char ename[11];
EXEC SQL VAR ac_ename IS STRING(11);
EXEC SQL END DECLARE SECTION;
Èç¹ûENAMEÔÚ±íÖеÄֵΪ"abc",ÔòÈ¡³öµÄֵΪ"abc";

(3) ¶Ô¸¡µãÐ͵ıäÁ¿£¬Îª±£Ö¤¾«¶È£¬×îºÃÊÇÉùÃ÷³ÉDOUBLEÐ͵Ä.ÒòΪDOUBLEÐ͵ľ«¶È±ÈFLOATÐ͸ߺܶà.
(4) ÕûÐÍ¿ÉÉùÃ÷ΪLONGÐÍ(¶Ô½Ï³¤µÄÕûÐÍ,¶øÇÒËùÓÃµÄÆ½Ì¨Ö§³ÖµÄ»°,ÈçÔÚSUNƽ̨ÉÏ,¿ÉÉùÃ÷ΪLONG LONGÐÍ).
(5) DATEÐ͵Ĵ¦Àí£ºDATEÐÍÒ»°ãÉùÃ÷ΪCHAR(20)¡£
Íù±íÖвåÈëDATEÐÍÊý¾Ýʱ,Ò»°ãÓÃTO_DATE()º¯Êý½øÐÐÀàÐÍת»»,È¡³öֵʱһ°ãÓÃTO_CHAR()º¯Êý½øÐÐÀàÐÍת»».
EXEC SQL select to_char(hiredate,"yyyy/mm/dd hh24:mi:ss") into :ac_hire_date from EMP where empno=1234;
EXEC SQL insert into EMP(EMPNO,HIREDATE) values(123,to_date(:ac_hiredate,"yyyy/mm/dd hh24:mi:ss");


2¡¢ËÞÖ÷±äÁ¿µÄ×÷Ó÷¶Î§
Èç¹ûËÞÖ÷±äÁ¿ÔÚËùÓеĺ¯ÊýÖ®ÍâÉùÃ÷£¬ÔòËûÃÇÊÇÈ«¾Ö±äÁ¿¡£ÔÚʹÓÃ֮ǰҪעÒâ°Ñ±äÁ¿µÄÖµ³õʼ»¯£¬ËÞÖ÷±äÁ¿Ò²¿ÉÒÔÔÚij¸öº¯ÊýµÄÄÚ²¿¶¨Òå¡£ ÕâʱËûÃÇÊǾֲ¿±äÁ¿¡£Ò»°ã¶¼Ï°¹ß°ÑËÞÖ÷±äÁ¿ÉùÃ÷Ϊȫ¾Ö±äÁ¿¡£

3¡¢Êý¾Ý¿âµÄÁ¬½ÓÓë¶Ï¿ª
Êý¾Ý¿âµÄÁ¬½ÓÓÐÒÔÏÂÁ½ÖÖ·½·¨£º
(1)
strcpy(vc_user.arr,"scott/tiger");
vc_user.len=11;
exec sql connect :vc_user;
(2)
strcpy(user,"scott");
strcpy(pass,"tiger");
exec sql connect :user identified by :pass;
×¢Ò⣺ÔÚÓÐЩƽ̨ÉÏÁ½ÖÖ¶¼¿ÉÒÔ,ÔÚÓÐЩƽ̨ÉÏÖ»ÄÜÓõÚÒ»ÖÖ·½·¨.
ÔÚPROC³ÌÐòÖУ¬Òª¼ÇסÓÃEXEC SQL ROLLBACK WORK RELEASE;¶Ï¿ªÓëÊý¾Ý¿âµÄÁ¬½Ó,²¢ÊÍ·ÅÏà¹ØµÄÊý¾Ý¿â×ÊÔ´¡£


4¡¢PROCÖеÄNULLÖµµÄ´¦Àí
Èç¹ûijһ×Ö¶ÎÈ¡³öµÄÖµÊÇNULL,»á±¨:sqlcode=-1405, sqlerr=ORA-01405: ¶ÁÈ¡µÄÁÐֵΪ NULL
²¢ÇÒÏàÓ¦µÄËÞÖ÷±äÁ¿µÄÖµ²»»á±»¸Ä±ä,ΪִÐиÃSQLÓï¾ä֮ǰµÄÖµ. ³£ÓõĴ¦ÀíNULLÖµµÄ·½·¨ÓУº
(1)²ÉÓÃָʾÆ÷±äÁ¿,´Ëʱ²»»áÓÐ-1405´íÎó,µ±±ØÐëÊÇËùÒÔΪNULLµÄ×ֶζ¼ÓÐÏàÓ¦µÄָʾÆ÷±äÁ¿,Èç¹ûijһ×Ö¶ÎûÓÐָʾÆ÷±äÁ¿,µ«È¡³öµÄÖµ
ΪNULLÖµ,ÔòÈÔÈ»»áÓÐ-1405´íÎó.µ±È¡³öµÄÖµÊÇNULLʱ£¬ÏàÓ¦µÄָʾÆ÷±äÁ¿±äÁ¿Îª-1£¬¿É¸ù¾ÝָʾÆ÷±äÁ¿µÄÖµ×öÏìÓ¦µÄ´¦Àí¡£
(2)Èç¹û×ֶν϶à,¿ÉÈ¡×ֶε½Ò»¸ö½á¹¹ÌåÖм°Óë¸Ã½á¹¹Ìå¶ÔÓ¦µÄָʾÆ÷½á¹¹ÌåÖÐ.ÈçÉÏÃæµÄÀý×ÓÖпɶ¨Òå½á¹¹Ì壺
struct str_emp{
long al_empno;
char ac_ename;
char ac_hiredate;
double af_sal;
};
struct str_emp_ind{
long al_empno;
char ac_ename;
char ac_hiredate;
double af_sal;
};

struct str_emp str_emp;
strcut str_emp_ind str_emp_ind;
ÔÚȡ֮ǰ¿ÉÓÃmemset(&str_emp,0,sizeof(str_emp)).Çå¿Õ¸Ã½á¹¹Ìå,ÕâÑùÈç¹ûÊÇ×Ö·ûÐ͵ÄNULL,»áΪ"",ÕûÐ͵ÄNULL»áΪ0,
¸¡µãÐ͵ĻáΪ0.00¡£´Ëʱ²»»áÓÐ-1405´íÎó¡£
(3)Ò²¿É²ÉÓÃNVL()º¯Êý:¾ÙÀýÈçÏ£º
EXEC SQL DECLARE authors CURSOR FOR
SELECT EMPNO, NVL(ENAME,chr(0)),nvl(to_char(HIREDATE,"yyyy/mm/dd hh24:mi:ss"),chr(0)),NVL(SAL,0) FROM EMP;
ÕâÑùÒ²²»»áÓÐ-1405´íÎó²»,µ±È¡³öµÄÖµÊÇNULLʱ,×Ô¶¯ÓÃNVL()ÖÐÖ¸¶¨µÄÖµ´úÌæ.
CHR(0)Ò²¿ÉÖ±½ÓÓÃ""´úÌæ,ÈçÏÂ:
SELECT EMPNO, NVL(ENAME,""),nvl(to_char(HIREDATE,"yyyy/mm/dd hh24:mi:ss"),""),NVL(SAL,0) FROM EMP;5¡¢PROCÖеĴíÎóµÄ´¦Àí
ËùÓеÄSQLÓï¾ä¶¼ÓпÉÄܳö´í.ËùÒÔ¶¼Òª¼ÓÒÔÅжÏ,µ«Ã¿¸öSQLÓï¾äºó¶¼¼Ó´íÎóÅжÏ,Ì«Âé·³,¿ÉÓÃÒ»¸öº¯ÊýÈçsql_error()À´½øÐдíÎó´¦Àí,
·½·¨:
(1)¶¨Òåql_error()º¯Êý¡£
(2)ÔÚ¿ªÍ·¼ÓÉÏEXEC SQL WHENEVER SQLERROR DO sql_error();ÕâÑùµ±·¢Éúsqlca.sqlcode <0 µÄ´íÎóʱ,³ÌÐò×Ô¶¯×ªµ½sql_error()ÖÐÖ´ÐÐ. ×¢Òâ:¶Ôsqlca.sqlcode >0µÄ´íÎóÈç sqlca.sqlcode =1403 ÊDz»»áתµ½sql_error()ÖÐÖ´ÐеÄ.
ÁíÍâ:ÔÚUNIXÏ£¬¿ÉÒÔÓÃOERR À´²éÕÒ´íÎóµÄÃèÊö¡£È磺 ora ORA -1405 ²éÕÒ´íÎóºÅΪ-1405µÄÃèÊö.


6¡¢PROCÖе÷Óô洢¹ý³ÌµÄ·½·¨
Òª°Ñ´æ´¢¹ý³Ì·ÅÔÚEXEC SQL EXECUTE ºÍ END-EXEC;Ö®¼ä£¬ÈçÏÂËùʾ£º
ÆäÖУºal_empno,ac_ename ΪÊäÈë²ÎÊý,l_return,l_errno,c_errtext ΪÊä³ö²ÎÊý¡£
al_empno=8888;
strcpy(ac_ename,"ABCD");
EXEC SQL EXECUTE
BEGIN
up_db_emp(:al_empno,:ac_ename,:l_return,:l_errno,:c_errtext);
END;
END-EXEC;
if (l_return != 0)
{
printf("µ÷ÓÃUP_PB_EMP´æ´¢¹ý³Ì³ö´í,errno=%ld,errtext=%s ",l_errno,c_errtext);
}

7¡¢PROCµÄÃüÁîÐÐÑ¡ÏPROC±àÒëÆ÷ÓкܶàµÄÃüÁîÐÐÑ¡ÏÔÚÃüÁîÐÐÏÂÖ±½Ó²»´ø²ÎÊýÔËÐÐPROC£¬»áÁгöËùÓеÄÃüÁîÐÐÑ¡ÏîÀ´£¬²¢ÓÐ˵Ã÷¡£
(1)´¢´æ¹ý³Ì:±àÒë´¢´æ¹ý³ÌÊÇÒª´øÉÏÓû§Ãû¼°ÃÜÂë
proc USERID=scott/tiger sqlcheck=SEMANTICS ireclen=512 iname=test.cpp
(2)PARSE=NONE ¶Ô·ÇSQL´úÂë²»½øÐÐÓï·¨·ÖÎö£¬Ä¬È϶ԷÇSQL´úÂëÒ²½øÐÐÓï·¨·ÖÎö.
ÔÚRED HAD6.3ÉϵÄORACLE8.1.5ÖÐÓÃPROCʱ,»áÌáʾ:/USR/INCLUDE/STDIO.H ¼°ÆäËûµÄ.HÎļþÖÐÓдí. ¿É°ÑPARSE=NONE¼ÓÉÏ,¾ÍºÃÁË.
8¡¢×¢Òâ¼ÓÉÏ£ºEXEC ORACLE OPTION (RELEASE_CURSOR = YES);
RELEASE_CURSOR=YES ʹPROC ÔÚÖ´ÐÐÍêºóÊÍ·ÅÓëǶÈëSQLÓйØ×ÊÔ´£¬±£Ö¤ÔÚ¸ÃPROC³ÌÐòÖ´ÐÐÍêºó£¬ORACLE²»»áËø×¡Êý¾Ý¿â×ÊÔ´£¬ÈçËø±íµÈ¡£
Èç¹ûÔÚPROCÖÐÓõ½ORACA£¬»¹ÒªÔÚ³ÌÐòÍ·¼ÓÉÏ£º
EXEC ORACLE OPTION (ORACA=YES);

9¡¢PROCÖеÄÀàÐÍת»»
Ò»¡¢ÔÚCÓïÑÔÖÐ:
(1)×Ö·ûÐ͵½ÕûÐÍ¿ÉÓÃATOI() ATOL(),SSCANF()
(2)ÕûÐÍ,¸¡µãÐ͵½×Ö·ûÐÍ,¿ÉÓÃSPRINTF()
(3)×Ö·ûÐ͵½¸¡µãÐÍÓÃATOF()²»ÐÐ,×îºÃÓÃSSCANF(),¾ÙÀýÈçÏÂ:

EXEC SQL BEGIN DECLARE SECTION;
double d_demo;
float f_demo;
char ac_text[20]="222";
EXEC SQL END DECLARE SECTION;

(1)sscanf(ac_text, "%f", &d_demo);
printf("ac_text=%s,d_demo=%f ",ac_text,d_demo);

(2)sscanf(ac_text, "%lf", &d_demo);
printf("ac_text=%s,d_demo=%f ",ac_text,d_demo);

(3)sscanf(ac_text, "%f", &d_demo);
printf("ac_text=%s,d_demo=%lf ",ac_text,d_demo);

(4)sscanf(ac_text, "%lf", &d_demo);
printf("ac_text=%s,d_demo=%lf ",ac_text,d_demo);

printf("******************* ");
(5)sscanf(ac_text, "%f", &f_demo);
printf("ac_text=%s,f_demo=%f ",ac_text,f_demo);

(6)sscanf(ac_text, "%lf", &f_demo);
printf("ac_text=%s,f_demo=%f ",ac_text,f_demo);

(7)sscanf(ac_text, "%f", &f_demo);
printf("ac_text=%s,f_demo=%lf ",ac_text,f_demo);

(8)sscanf(ac_text, "%lf", &f_demo);
printf("ac_text=%s,f_demo=%lf ",ac_text,f_demo);

Êä³öµÄ½á¹û:
ac_text=222.00,d_demo=0.000000
ac_text=222.00,d_demo=222.000000
ac_text=222.00,d_demo=222.000032
ac_text=222.00,d_demo=222.000000
*******************
ac_text=222.00,f_demo=222.000000
ac_text=222.00,f_demo=0.000000
ac_text=222.00,f_demo=222.000000
ac_text=222.00,f_demo=0.000000
d_demo=atof(ac_text);
printf("ac_text=%s,atof(ac_text)=%f ",ac_text,d_demo);

d_demo=atof(ac_text);
printf("ac_text=%s,atof(ac_text)=%lf ",ac_text,d_demo);

f_demo=atof(ac_text);
printf("ac_text=%s,atof(ac_text)=%f ",ac_text,f_demo);

f_demo=atof(ac_text);
printf("ac_text=%s,atof(ac_text)=%lf ",ac_text,f_demo);

Êä³öµÄ½á¹û:
ac_text=222.00,atof(ac_text)=1243288.000000
ac_text=222.00,atof(ac_text)=1243288.000000
ac_text=222.00,atof(ac_text)=1243288.000000
ac_text=222.00,atof(ac_text)=1243288.000000

´ÓÉÏÃæµÄ½á¹û¿É¼û:
DOUBLEÐÍÓ¦²ÉÓÃsscanf(ac_app_capcity, "%lf", &d_app); ´òÓ¡ÓÃ"%lf","%f" ¶¼¿ÉÒÔ. (2),(4)ÕýÈ·
FLOATÐÍÓ¦²ÉÓÃsscanf(ac_app_capcity, "%f", &d_app); ´òÓ¡ÓÃ"%lf","%f" ¶¼¿ÉÒÔ. (5),(7)ÕýÈ·
²ÉÓÃATOF()ת»»µÄ½á¹û¶¼ÊÇ´íµÄ,ËùÒÔ²»ÒªÓÃËü¡£
¶þ¡¢Ð´±í»ò´Ó±íÖÐÈ¡Êý¾Ýʱ:
(1)×Ö·ûÐÍÓëÕûÐÍÖ®¼ä¿É²»ÓÃת»»,²ÉÓÃĬÈÏ·½Ê½¡£
(2)×Ö·ûÐÍÓ븡µãÐÍÖ®¼ä¿É²»ÓÃת»»,²ÉÓÃĬÈÏ·½Ê½¡£
(3)ÈÕÆÚÐÍÓë×Ö·ûÐÍÖ®¼ä¿ÉÓÃTO_CHAR(),TO_DATE()¡£


10¡¢PROCÖеÄ4ÖÖ¶¯Ì¬SQL¼ò½é
(1)¶¯Ì¬SQL1: ²»ÄÜÊDzéѯ(SELECT)Óï¾ä,²¢ÇÒûÓÐËÞÖ÷±äÁ¿.
Ó÷¨:Æ´Ò»´®¶¯Ì¬SQLÓï¾ä,²¢ÓÃEXECUTE IMMEDIATEÖ´ÐÐ,Èç:
EXEC SQL EXECUTE IMMEDIATE "CREATE TABLE dyn1 (col1 VARCHAR2(4))";

(2)¶¯Ì¬SQL2: ²»ÄÜÊDzéѯ(SELECT)Óï¾ä,²¢ÇÒÊäÈëµÄËÞÖ÷±äÁ¿ÊýÄ¿ÊÇÖªµÀµÄ,
Ó÷¨:Æ´Ò»´®¶¯Ì¬SQLÓï¾ä,ÓÃPREPARE,EXECUTEÓï¾äÖ´ÐÐ.
strcpy(c_sql, "DELETE FROM EMP WHERE EMPNO = :?");
EXEC SQL PREPARE sql_stmt FROM :c_sql;
EXEC SQL EXECUTE sql_stmt USING :emp_number;

(3)¶¯Ì¬SQL3: ÓÃÓÚ´´½¨¶¯Ì¬²éѯ, ²¢ÇÒÒª²éѯµÄ×ֶμ°ÊäÈëµÄËÞÖ÷±äÁ¿ÊýÄ¿ÊÇÖªµÀµÄ
Ó÷¨: Æ´Ò»´®¶¯Ì¬SQLÓï¾ä,ÓÃPREPARE·ÖÎö¸ÃÓï¾ä,²¢Òª¶¨ÒåÒ»¸öCURSOR½øÐÐȡֵ
Èç:ÈçÒª²éѯµÄÊý¾Ý°´Ò»Äê12Ô·ŵ½12ÕűíÖС£±íÃûΪuser_fee_1mon, user_fee_2mon,....¿É²ÉÓö¯Ì¬SQL3À´½øÐвéѯ
strcpy(c_sql,"select c_user_id,c_user_name,to_char(t_date,"yyyy/mm/dd hh:mi:ss"),n_fee ");
strcat(c_sql,"from USER_FEE_");
strcat(c_sql,ac_mon);
strcat(c_sql," where c_user_id = :v1");

EXEC SQL PREPARE s FROM :c_sql;

EXEC SQL DECLARE cur_user_fee CURSOR FOR s;

EXEC SQL OPEN cur_user_fee USING :ac_user_id;

while(1)
{

EXEC SQL FETCH cur_user_fee into :c_user_id,:c_user_name,:c_date,:n_fee);

if (sqlca.sqlcode < 0)
{
/*FETCH CURSORʧ°Ü*/
printf("fetch cursor cur_user_fee fail,sqlcode=%ld,sqlserr=%s",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
}
if( sqlca.sqlcode == SQLNOTFOUND)
{
break;
}
}
EXEC SQL CLOSE cur_user_fee;

(4)¶¯Ì¬SQL4:Òª´¦ÀíµÄ×ֶμ°ÊäÈëµÄËÞÖ÷±äÁ¿ÊýÄ¿ºÍÖ÷±äÁ¿µÄÀàÐÍÊÂÏÈÊDz»ÖªµÀµÄ,È磺
INSERT INTO EMP () VALUES ()
ÊÇ×ÔӵĶ¯Ì¬SQL,ºÜÉÙÓÃ,Ôڴ˲»×ö½éÉÜ¡£


11¡¢SQLCA£ºSQLÊÇORACLEµÄÒ»¸ö½á¹¹Ì壬ËüµÄÓòÓÃÓÚ×î½üµÄÒ»ÌõSQLÓï¾äÖ´ÐкóµÄһЩÐÅÏ¢£¬Èç´íÎóºÅ£¬´íÎóÃèÊö£¬¾¯¸æ£¬×´Ì¬µÈ¡£³£ÓõÄ
Óò½éÉÜÈçÏÂ:
SQLCA.sqlcode:´íÎóºÅ,=0ÕýÈ·,=1403ûȡµ½Êý¾Ý
SQLCA.sqlserrm.sqlerrmc:´íÎóÃèÊö
SQLCA.sqlerrd[3]:×î½üµÄÒ»ÌõSQLÓï¾äËù´¦ÀíµÄÐÐÊý,Èç¹û¸ÃÓï¾ä´¦Àíʧ°Ü,ÔòËüµÄÖµÊDz»¶¨µÄ,Èç¹û´íÎóÔÚÒ»¸öCURSOR²Ù×÷Öз¢Éú,Ôò
ËüµÄÖµÖ¸Òѳɹ¦´¦ÀíµÄÐÐÊý.ÔÚDELETE,UPDATEÖÐ,Ëü²»°üº¬ÒòÍâ¼üÔ¼Êø¶øÉ¾³ý,¸üеÄÄÇЩÐÐ,
DELETE FROM EMP WHERE DEPT="SALE";
ÔÚ±íEMPÖÐɾ³ý20ÐÐ,µ«Èç¹û±íEMPÓë±íADDRESSÓÐÍâ¼üÔ¼Êø,µ¼Ö±íADDRESSÒ²±»É¾³ý20ÐÐ,ÔòSQLCA.sqlerrd[3]=20,¶ø²»ÊÇ40¡£


SELECT ENAME £¬ JOB£¬ SAL
FROM EMP
WHERE DEPTNO=£ºDEPTNO£»
µ±¸³¸øÒ»¸öÓë²éѯÏà¹ØÁªµÄÓαêCURSORÖ®ºó£¬ µ±SELECT²éѯEMPʱ¿É´ÓÊý¾Ý¿âÖзµ»Ø¶àÐУ¬ÕâЩÐоÍÊÇCURSORµÄÒ»¸ö»î¶¯ÇøÓò¡£
×¢Ò⣺
1£© ¶¨ÒåÓÎ±ê±ØÐëÔÚ¶ÔÓαê²Ù×÷֮ǰÍê³É£»
2£© PRO*C²»ÄÜÒýÓÃûÓж¨ÒåµÄÓαꣻ
3£© Óα궨Òåºó£¬Æä×÷Ó÷¶Î§ÊÇÕû¸ö³ÌÐò¡£ËùÒÔ¶ÔÒ»¸ö³ÌÐòÀ´½²£¬ ͬʱ¶¨ÒåÁ½¸öÏàͬµÄÓαêÊÇ´íÎóµÄ¡£
B. ´ò¿ªÓαê
´ò¿ªÓαêµÄOPENÓï¾äÖ÷ÒªÓÃÀ´ÊäÈëÖ÷±äÁ¿µÄÄÚÈÝ£¬ÕâЩÖ÷ÒªÊÇWHEREÖÐʹÓõÄÖ÷±äÁ¿¡£´ò¿ªÓαêµÄÓï¾äÊÇ£ºEXEC SQL OPEN ¡´ÓαêÃû¡µ
µ±´ò¿ªÓαêºó£¬¿ÉÒÔ´ÓÏà¹ØµÄ²éѯÖÐÈ¡³ö¶àÓÚÒ»ÐеĽá¹û¡£ËùÓÐÂú×ã²éѯ±ê×¼µÄÐÐ×é³ÉÒ»¼¯ºÏ£¬½Ð×ö"Óαê»î¶¯¼¯"¡£Í¨¹ýÈ¡²Ù×÷£¬»î¶¯¼¯ÖеÄÿһÐлòÿһ×éÊÇÒ»¸öÒ»¸ö·µ»ØµÄ£¬²éѯÍê³Éºó£¬ Óαê¾Í¿É¹Ø±ÕÁË¡£ÈçͼËùʾ£º
¶¨ÒåÓα꣺DECLARE

¿ªÊ¼²éѯ£ºSELECT
´ò¿ªÓα꣺OPEN

´Ó»î¶¯¼¯È¡Êý¾Ý£ºFETCH

²éѯÍê³É

¹Ø±ÕÓα꣺CLOSE

×¢Ò⣺1£©Óα괦Óڻ¼¯µÄµÚÒ»ÐÐÇ°Ãæ£»
2£©Èô¸Ä±äÁËÊäÈëÖ÷±äÁ¿¾Í±ØÐëÖØÐ´ò¿ªÓαꡣ


C. È¡Êý¾Ý
´Ó»î¶¯¼¯ÖÐÈ¡³öÒ»ÐлòÒ»×é°Ñ½á¹ûË͵½Êä³öÖ÷±äÁ¿ÖеĹý³Ì½ÐÈ¡Êý¾Ý¡£Êä³öÖ÷±äÁ¿µÄ¶¨ÒåÔÚÈ¡Êý¾ÝÓï¾äÖС£È¡Êý¾ÝµÄÓï¾äÈçÏ£º
EXEC SQL FETCH¡´ÓαêÃû¡µINTO£ºÖ÷±äÁ¿1£¬Ö÷±äÁ¿2£¬¡­¡­
FETCHµÄ¹¤×÷¹ý³ÌÈçͼËùʾ£º

ÈçͼËùʾµÄ²éѯ½á¹ûÖ¸Âú×ã²éѯÌõ¼þµÄ²éѯ½á¹û¡£Ê¹ÓÃFETCHӦעÒâÒÔϼ¸µã£º
l ÓÎ±ê±ØÐëÏȶ¨ÒåÔÙ´ò¿ª¡£
l Ö»ÓÐÔÚÓαê´ò¿ªÖ®ºó²ÅÄÜÈ¡Êý¾Ý£¬¼´Ö´ÐÐFETCHÓï¾ä¡£
l FETCHÓï¾äÿִÐÐÒ»´Î£¬´Óµ±Ç°Ðлòµ±Ç°×éÈ¡Êý¾ÝÒ»´Î£¬ÏÂÒ»ÐлòÏÂÒ»×éÏòÉÏÒÆÒ»´Î¡£Óαêÿ´ÎËùÖ¸µÄÐлò×鶼Ϊµ±Ç°Ðлòµ±Ç°×飬¶øFETCHÿ´Î¶¼ÊÇÈ¡ÓαêËùÖ¸¶¨µÄÐлò×éµÄÊý¾Ý¡£
l µ±Óαê»î¶¯¼¯¿ÕÖ®ºó£¬ORCLE·µ»ØÒ»¸öSQLCA¡£SQLCA£¨=1403£©¡£
l ÈôÏ£Íû´ËÓαêÔÙ²Ù×÷£¬ ±ØÐëÏȹرÕÔÙ´ò¿ªËü¡£
l ÔÚC³ÌÐòÖпÉÒÔ¿ª±ÙÒ»¸öÄÚ´æ¿Õ¼ä£¬À´´æ·Å²Ù×÷½á¹û£¬ÕâÑù¾ÍÄÜÀûÓÿª±ÙµÄ¿Õ¼äÀ´Áé»î²Ù×ݲéѯµÄ½á¹û¡£
D£®¹Ø±ÕÓαê
È¡Íê»î¶¯¼¯ÖÐËùÓÐÐк󣬱ØÐë¹Ø±ÕÓα꣬ÒÔÊÍ·ÅÓë¸ÃÓαêÓйصÄ×ÊÔ´¡£
¹Ø±ÕÓαêµÄ¸ñʽΪ£º
EXEC SQL CLOSE ÓαêÃû£»
ÀýÈ磺
EXEC SQL CLOSE C1£»
ORACLE V5.0°æÖ§³ÖSQL¸ñʽ¡°CURRENT OF CURSOR¡±¡£ÕâÌõÓï¾ä½«Ö¸ÏòÒ»¸öÓαêÖÐ×îÐÂÈ¡³öµÄÐУ¬ ÒÔÓÃÓÚÐ޸ĺÍɾ³ý²Ù×÷¡£¸ÃÓï¾ä±ØÐëÓÐÈ¡²Ù×÷Ö®ºóʹÓã¬ËüµÈͬ´æ´¢Ò»¸öROWID£¬²¢Ê¹ÓÃËü¡£

(4)£®¾ÙÀý
EXEC SQL DECLARE SALESPEOPLE CURSOR FOR
SELECT SSNO£¬ NAME£¬ SALARY
FROM EMPLOYEE
WHERE DNAME=¡®Sales¡¯£»
EXEC SQL OPEN SALESPEOPLE£»
EXEC SQL FETCH SALESPEOPLE
INTO £ºSS£¬£ºNAME£¬£ºSAL£»
EXEC SQL CLOSE SALESPEOPLE£»

£¨5£©SQLǶÌ׵ķ½·¨¼°Ó¦ÓÃ
ǶÈëSQLÓë½»»¥Ê½SQLÔÚÐÎʽÉÏÓÐÈçϲî±ð£º
1) ÔÚSQLÓï¾äǰÔö¼Óǰ׺¡°EXEC SQL¡±£¬ ÕâһССµÄ²î±ðÆäÄ¿µÄÊÇÔÚÓÚÔ¤±àÒëʱÈÝÒ×ʶ±ð³öÀ´£¬ ÒÔ±ã°ÑÿһÌõSQL×÷ΪһÌõ¸ß¼¶ÓïÑÔÀ´´¦Àí¡£
2) ÿһSQLÓï¾ä·ÖΪ˵Ã÷ÐÔÓï¾äºÍ¿ÉÖ´ÐÐÓï¾äÁ½´óÀà¡£¿ÉÖ´ÐÐÓï¾äÓÖ·ÖΪÊý¾Ý¶¨Òå¡¢Êý¾Ý¿ØÖÆ¡¢Êý¾Ý²Ù×Ý¡¢Êý¾Ý¼ìË÷ËÄ´óÀà¡£
¿ÉÖ´ÐÐÐÔSQLÓï¾äдÔڸ߼¶ÓïÑԵĿÉÖ´Ðд¦£»ËµÃ÷ÐÔSQLÓï¾äдÔڸ߼¶ÓïÑÔµÄ˵Ã÷ÐԵĵط½¡£
ÀýÈ磺ÔÚPRO*C³ÌÐòÖн¨Á¢Ò»¸öÃûΪBOOKµÄ±í½á¹¹£¬¹ý³ÌÈçÏ£º
#include¡´stdio.h¡µ
EXEC SQL BEGIN DECLARE SECTION£»
VARCHAR uid[20]£¬ pwd[20]£»
EXEC SQL END DECLARE SECTION£»
EXEC SQL INCLUDE SQLCA£»
Main£¨£©
{
/*login database*/
strcpy(uid.arr,¡¯wu¡¯);
uid.len=strlen(uid,arr);
strcpy(pwd.arr,¡¯wu¡¯);
pwd.len=strlen(pwd.arr);
EXEC SQL CONNECT:uid IDENTIFEED BY:pwd;
EXEC SQL CREATE TABLE book
( acqnum number, copies number , price number);
EXEC SQL COMMIT WORK RELEASE;
EXIT;
PRO*C¿É·Ç³£¼ò±ãÁé»îµØ·ÃÎÊORCLEÊý¾Ý¿âÖеÄÊý¾Ý£¬Í¬Ê±ÓÖ¾ßÓÐCÓïÑÔ¸ßËÙµÄÌØµã£¬Òò¶ø¿ÉÍê³ÉһЩORACLE²úÆ·²»ÄÜÍê³ÉµÄÈÎÎñ£¬ÀýÈçÒÔÏÂÒ»¸ö¹Ì¶¨µÄÌØÊâ¸ñʽÊä³ö½á¹û¡£
SQLǶÌ×Ô´³ÌÐòʾÀý
#unclude<stdio.h>
typedef char asciz[20];
EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL TYPE asciz IS STRING (20) REFERENCE;
asciz username;
asciz password;
asciz emp_name(5);
int emp_number(5a);
float salary[5];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
Void print_rows();
Void sqlerror();
Main()
{
int num_ret;
strcpy(username,¡±SCOTT¡¯);
strcpy(password, ¡°TYGER¡±);
EXEC SQL WHENEVER SQLERROR DO sqlerror();
EXEC SQL CONNECT:username IDENTIFIED BY:password;
Print (¡° Connected to ORACLE as user:%s ¡±, username);
EXEC SQL DECLARE c1 CURSOR FOR
SELECT EMPNO , ENAME , SAL FROM EMP;
EXEC SQL OPEN c1;
Num_ret = 0;
For(;;)
{
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC SQL FETCH c1 INTO : emp_number , :emp_name , :salary;
Print_rows (sqlca.sqlerrd[2] num_ret);
Num_ret=sqlca.sqlerrd[2];
}
if ((sqlca.sqlerrd[2] num_ret)>0);
print _rows(sqlca.sqlerrd[2] num_ret);
EXEC SQL CLOSE c1;
Printf(¡°Have a good day. ¡±);
EXEC SQL COMMIT WORK RELEASE;
}

void print_rows(n);
int n;
{
int i;
printf(¡° Number Employee Salary ¡±);
printf(¡°------------------------------ ¡±);
for (i=0;i<n; i++ )
printf(¡°% - 9d%- 8s%9.2f ¡±,emp-number[i], emp---name[i],salary[i];
}
void sqlerror()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
Printf(¡° oracle error detected: ¡±);
Printf(¡® %.70s ¡±, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
Exit(1);
}


(6) ´íÎó¼ì²âºÍ»Ö¸´
ÔÚʹÓÃSQLÓï¾äºÍPRO*C¶ÔÊý¾Ý¿â½øÐвÙ×÷ʱ£¬³£³£ÓÐ×ֶοÕÖµ£¬ÎÞÌõ¼þɾ³ý£¬ÎÞÐзµ»Ø£¬Êý¾ÝÒç³öºÍ½Ø¶ÏµÈÏÖÏó·¢Éú£¬ÕâÖÖÏÖÏó¿ÉÒÔÓÃSQLCAºÍָʾÆ÷±äÁ¿À´¼ì²â¡£

1 SQLCAµÄ½á¹¹
ÔÚPRO*C³ÌÐòÖÐSQLCA½á¹¹ÈçÏ£º
STRUCT SQLCA{
Char sqlcaid[8];
Long sqlabc;
Long sqlcode;
STRUCT{
Unsigned sqlerrm1;
Char sqlerrmc[10];
}sqlerrm;
Char sqlerrp[8];
Long sqlerrd[6];
Char sqlwarn[8];
Char sqlext[8];
}
ÆäÖУº
1£© SQLCA.sqlerrm.sqlerrmc£º´øÓÐSQLCA¡£SQLCODEµÄ´íÎóÕýÎÄ¡£
2£© SQLCA.sqlerrd:µ±Ç°ORACLEµÄ״̬£¬Ö»ÓÐSQLCA.SQLERRD[2]ÓÐÒâÒ壬±íʾDMLÓï¾ä´¦ÀíµÄÐÐÊý¡£
3£© SQLCA.sqlwarn:Ìṩ¿ÉÄÜÓöµ½µÄÌõ¼þÐÅÏ¢¡£

ÔÚÿִÐÐÒ»¸öSQLÓï¾äºó£¬ORACLE¾Í°Ñ·µ»Ø½á¹û·ÅÈëSQLCAÖУ¬µ«ËµÃ÷Óï¾ä³ýÍâ¡£
ÓÃSQLCA¿ÉÒԲ鿴SQLÓï¾äµÄÖ´Ðнá¹û¡£ÍùÍùÓÐÈýÖÖ½á¹û£º
=0£ºÖ´Ðгɹ¦£»
SQLCA.SQLCODE= >0£ºÖ´Ðгɹ¦µÄ״ֵ̬£»
<0£ºÊ§°Ü£¬²»ÔÊÐí¼ÌÐøÖ´ÐС£

2 ָʾÆ÷±äÁ¿
ָʾÆ÷±äÁ¿ÓÐʱҲ³ÆÖ¸Ê¾±äÁ¿.ָʾ±äÁ¿ÓëÒ»¸öÖ÷±äÁ¿Ïà¹ØÁª,Ö¸³öÖ÷±äÁ¿µÄ·µ»ØÇé¿ö.
=0£º·µ»ØÖµ²»Îª¿Õ, δ±»½Ø¶Ï,Öµ·ÅÔÚÖ÷±äÁ¿ÖÐ;
·µ»ØÖµ= >0£º·µ»ØÖµÎª¿Õ, ºöÂÔÖ÷±äÁ¿µÄÖµ;
<0£ºÖ÷±äÁ¿³¤¶È²»¹»¾Í±»½Ø¶Ï¡£
ʹÓÃָʾ±äÁ¿Òª×¢Ò⣺
l ÔÚWHERE×Ó¾äÖв»ÄÜÓÃָʾ±äÁ¿¡£ÓÃNULLÊôÐÔÀ´²âÊÔ¿ÕÖµ¡£
ÀýÈçÏÂÁÐ×Ӿ䣺
SELECT¡­
FROM¡­
WHERE ENAME IS NULL£»
ÊÇÕýÈ·µÄ£¬¶ø
WHERE ENAME=£ºPEME£ºPEME1
ÊÇ´íÎóµÄ¡£
l ָʾ±äÁ¿ÔÚ²åÈë¿Õֵ֮ǰΪ1
l ¿ÉÊä³ö¿ÕÖµ¡£


3 WHENEVERÓï¾ä
WHENEVERÊÇ˵Ã÷Óï¾ä£¬²»·µ»ØSQLCODE£¬ Ö»ÊǸù¾ÝSQLCAÖеķµ»ØÂëÖ¸¶¨Ïà¹ØµÄ´ëÊ©¡£¸ñʽΪ
EXEC SQL WHENEVER [SQLERROR|SQLWARNING|NOTFORUND]
[STOP|CONTINUE|GOTO<񈧏>];
ÆäÖÐ
£¨1£©[STOP|CONTINUE|GOT<±êºÅ>]µÄȱʡֵΪCONTINUE¡£
£¨2£©SQLERROR£ºSQLCA.SQLCODE<0;
£¨3£©SQLWARNIGN£ºSQLCA.SQLWARN[0]=¡°W¡±£»
£¨4£©NOTFOUND£ºSQLCA.SQLCODE=1403£»
ÏÂÃæ¸ø³öÒ»¶Î³ÌÐòÀ´ËµÃ÷WHENEVERµÄÓ÷¨£º
EXEC SQL BEGIN DEELARE SECTION£»
VARCHAR UID[20]£»
VARCHAR PASW[20]£»
¡­¡­
EXEC SQL END DECLARE SECTION£»
EXEC SQL INCLUDE SQLCA£»
Main£¨£©
{
¡­¡­
EXEC SQL WHENEVER SQLERROR GOTO ERR£»
EXEC SQL CONNECT£ºUID/£ºPWD£»
¡­¡­
EXEC SQL DECLARE CSOR1 CURSOR FOR
SELECT ¡´×ֶΡµ
FORM¡´±í¡µ
EXEC SQL OPEN CSOR1£»
SQL
¡­¡­
EXEC SQL WHENEVER NOT FOUND GOTO good£»
For£¨£»£»£©
EXEC SQL FETCH CSOR£¬ INTO¡­¡­
Good£º
¡­¡­
printf£¨¡° ²éѯ½áÊø ¡±£©;
EXEC SQL CLOSE C1;
EXEC SQL WHENEVER SQLERROR CONTINUE.
EXEC SQL COMMIT WORK RELEASE:
Exit();
Printf(¡° %70s|n¡±, sqlca.sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE:
Exit(1);
}


(7) ¶¯Ì¬¶¨ÒåÓï¾ä
SQLÓï¾ä·Ö¶¯Ì¬¶¨ÒåÓï¾äºÍ¾²Ì¬¶¨ÒåÓï¾äÁ½ÖÖ£º
£¨1£© ¾²Ì¬¶¨ÒåÓï¾ä£ºSQLÓï¾äÊÂÏȱàÈëPRO*CÖУ¬ÔÚ¾­¹ýÔ¤±àÒëÆ÷±àÒëÖ®ºóÐγÉÄ¿±ê³ÌÐò*¡£BOJ£¬È»ºóÖ´ÐÐÄ¿±ê³ÌÐòÔ¤¼´¿É¡£
£¨2£© ¶¯Ì¬¶¨ÒåÓï¾ä£ºÓÐЩÓï¾ä²»ÄÜÊÂÏÈǶÈëµ½PRO*C³ÌÐòÖУ¬Òª¸ù¾Ý³ÌÐòÔËÐÐÇé¿ö£¬Óû§×Ô¼º´ÓÊäÈëÉ豸ÉÏ£¨ÈçÖÕ¶ËÉÏ£©ÊµÊ±ÊäÈë¼´½«Ö´ÐеÄSQLÓï¾ä¡£
¶¯Ì¬¶¨ÒåÓï¾äÓУº
l EXECUTE IMMEDIATE£»
l PREPARE ÓëEXECUTE£»
l PREPAREÓëFETCH ºÍ OPEN £»
l BINDÓëDEFINE DESCRIPTOR¡£

1£® EXECUTE IMMEDIATEÓï¾ä
´ËÓï¾ä±íʾÁ¢¼´Ö´ÐУ¬ ²¢ÇÒÖ»ÏòSQLCA·µ»ØÖ´Ðнá¹û£¬ÎÞÆäËüÐÅÏ¢¡£ÀýÈ磺
EXEC SQL BEGIN DECLARE SECTION£»
VARCHAR abcd[89];
VARCHAR deay[20];
EXEC SQL END DECLARE SECTION;
/** Êä³ö×Ö·û´®µ½abcd **/
EXEC SQL EXECUTE IMMEDIATE :abcd;
×¢Ò⣺
1£© EXECUTE IMMEDIATEÖ»ÄÜÔËÐдøÒ»¸ö²ÎÊýµÄ¶¯Ì¬Óï¾ä¡£ÆäÖУ¬abcdÊDzÎÊý£¬²»Êǹؼü×Ö¡£
2£© EXECUTE IMMEDIATEʹÓõÄÏȾöÌõ¼þÊÇ£ºSQLÓï¾ä²»Äܰüº¬Ö÷±äÁ¿£»SQLÓï¾ä²»ÄÜÊDzéѯÓï¾ä¡£
3£© ¿ÉÓÃÈκÎÖ÷±äÁ¿×÷ΪEXECUTE IMMEDIATEµÄ²ÎÊý£»Ò²¿ÉÓÃ×Ö·û´®×÷ΪÖ÷±äÁ¿¡£

2£® PREPAREÓëEXECUTEÓï¾ä
´ËÓï¾ä±íʾ¡°Ô¤±àÒë/Ö´ÐС±¡£´ËÓï¾äÄܹ»Ô¤±àÒëÒ»´Î¶øÖ´Ðжà´Î¡£Ó﷨Ϊ£º
EXEC SQL PREPARE ¡´Óï¾äÃû¡µFROM£ºÖ÷±äÁ¿£»
EXEC SQL EXECUTE¡´Óï¾äÃû¡µ[USING£ºÌæ»»Ö÷±äÁ¿]£»
PREPAREÓï¾ä×öÁ½¼þÊ£º
£¨1£© Ô¤±àÒëSQLÓï¾ä£»
£¨2£© ¸ø³öSQLÓï¾äµÄÓï¾äÃû¡£
×¢Ò⣺
l SQLÓï¾ä²»ÄÜÊDzéѯÓï¾ä£»
l PREPAREºÍEXECUTE¿É°üº¬Ö÷±äÁ¿£»
l PREPARE²»Äܶà´ÎÖ´ÐС£
ÀýÈ磺<example.pc>
#define USERNAME ¡°SCOTT¡±
#define PASSWORD ¡°TIGER¡±
#include <stdio.h>


EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
Char * username=USERNAME;
Char * password=PASSWORD;
VARCHAR sqlstmt[80];
Int emp_number;
VARCHAR emp_name[15];
VARCHAR job[50];
EXEC SQL END DECLARE SECTION;
Main()
{
EXEC SQL WHENEVER SQLERROR GOTO :sqlerror;
EXEC SQL CONNECT :username IDENTIFIED BY :password;
Sqlstmt.len=sprintf(sqlstmt.arr,¡±INSERT INTO EMP (EMPNO,ENAME,JOB,SAL)
VALUES(:V1,:V2,:V3,:V4)¡±);
Puts(sqlstmt.arr);
EXEC SQL PREPARE S FROM :sqlstmt;
For(;;)
{
printf(¡° enter employee number:¡±);
scanf(¡°%d¡±,&emp_number);
if (emp_number==0) break;
printf(¡° enter employee name:¡±);
scanf(¡°%s¡±,&emp_name.arr);
emp_name.len=strlen(emp_name.arr);
printf(¡° enter employee job:¡±);
scanf(¡°%s¡±,job.arr);
job.len=strlen(job.arr);
printf(¡° enter employee salary:¡±);
scanf(¡°%f¡±,&salary);
}
EXEC SQL EXECUTE S USING :emp_number,:emp_name,:job,:salary;
}

3£® FETCHÓï¾äºÍOPENÓï¾ä
FETCHÓï¾äºÍOPENÓï¾äÕâ×鶯̬Óï¾äÊǶÔÓÎ±ê½øÐвÙ×÷µÄ£¬ÆäÖ´Ðйý³ÌÈçÏ£º


PREPARE¡´Óï¾äÃû¡µFROM ¡´Ö÷±äÁ¿×Ö·û´®¡µ£»


DECLARE¡´ÓαêÃû¡µFOR¡´Óï¾äÃû¡µ£»


OPEN ¡´ÓαêÃû¡µ[USING£ºÌæ»»±äÁ¿1[£¬£ºÌæ»»±äÁ¿±ä¡­]]


FETCH¡´ÓαêÃû¡µINTO£º Ö÷±äÁ¿1[£¬£ºÖ÷±äÁ¿2¡­]


CLOSE¡´ÓαêÃû¡µ

×¢Ò⣺
l SQLÓï¾äÔÊÐíʹÓòéѯÓï¾ä£»
l SELECT×Ó¾äÖеÄÁÐÃû²»Äܶ¯Ì¬¸Ä±ä£¬Ö»ÄÜÔ¤Öã»
l WHEREºÍORDER BY ×Ó¾ä¿ÉÒÔ¶¯Ì¬¸Ä±äÌõ¼þ¡£

Ò»¡¢ Pro*CµÄ±àÒëºÍÔËÐÐ

1£® ÏÈÓÃORACLEÔ¤±àÒëÆ÷PROC¶ÔPRO*C³ÌÐò½øÐÐÔ¤´¦Àí£¬¸Ã±àÒëÆ÷½«Ô´³ÌÐòÖÐǶÈëµÄSQLÓïÑÔ·­Òë³ÉCÓïÑÔ£¬²úÉúÒ»¸öCÓïÑÔ±àÒëÆ÷ÄÜÖ±½Ó±àÒëµÄÎļþ¡£Éú³ÉÎļþµÄÀ©Õ¹ÃûΪ .C
2£® ÓÃCÓïÑÔ±àÒëÆ÷CC ¶ÔÀ©Õ¹ÃûΪ .cµÄÎļþ±àÒë,²úÉúÄ¿±êÂëÎļþ,ÆäÀ©Õ¹ÃûΪ .o
3£® ʹÓÃMAKEÃüÁî,Á¬½ÓÄ¿±êÂëÎļþ,Éú³É¿ÉÔËÐÐÎļþ
ÀýÈç: ¶ÔÉÏÃæµÄexample.pc½øÐбàÒëÔËÐÐ
PROC iname=example.pc
CC example.c
MAKE EXE=example OBJS=¡±example.o¡±
example


 

Ô´´úÂëÍø¹©¸å.
ÍøÓÑÆÀÂÛ (0)
»áÔ±ÖÐÐÄ
ÍøÂç±à³Ì
±¾Õ¾ÍƼö
ÍøÂç±à³ÌÖ®¾«»ª