再现理想 发表于 2015-1-16 22:37:15

MSSQL编程:Pro*C的利用

在JOIN操作中(需要从多个数据表提取数据时),MySQL只有在主键和外键的数据类型相同时才能使用索引。一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部分变量申明
程序体外部申明部分外部申明段
通信区申明
函数KC的可实行语句
可实行语句SQL的可实行语句

或PL/SQL块

二.Pro*C程序的构成布局

每个Pro*C程序都包含两部分:(1)使用程序首部;(2)使用程序体
使用程序首部界说了ORACLE数据库的有关变量,
为在C言语中利用ORACLE数据库做好了筹办。使用程序体基础上由Pro*C的SQL语句挪用构成。次要指查询SELECT、INSERT、UPDATE、DELETE等语句。
使用程序的构成布局如图所示:
使用程序首部
形貌部分


SQL通讯区

使用程序体
EXECSQLBEGINDECLARESECTION
(SQL变量的界说)
EXECSQLENDDECLARESECTION;
EXECSQLINCLUDESQLLA;
EXECSQLCONNECT:<用户名>
IDENTIFIEDBY:<口令>
SQL语句及游标的利用


1.使用程序首部
使用程序的首部就是Pro*C的入手下手部分。它包含以下三部分:
lC变量形貌部分;
lSQL变量形貌部分(DECLARE部分);
lSQL通讯区。

(1).DECLARE部分(形貌部分)
形貌部分辩明程序的SQL变量,界说部分以EXECSQLBEGINDECLARESECTION;入手下手和以EXECSQLENDDECLARE
SECTION;停止的。它能够呈现在程序的主部,也可呈现在部分
lSQL变量的申明和利用
在申明段能为SQL变量指定的数据范例如表所示:
数据范例形貌
CHAR
CHAR(n)
INT
SHORT
LONG
FLOAT
DOUBLE
VARCHAR单字符
n个字符数组
整数
短整数
单精度浮点数
双精度浮点数
变长字符串

这些数据范例实践上就是C言语的数据范例,个中VARCHAR中视为C数据范例的扩大。这在今后漫谈到。
SQL变量的利用应注重以下几点:
l必需在形貌部明白断定义
l必需利用与其界说不异的巨细写格局
l在SQL语句中利用时,必需在其之前加一个“:”(冒号),但在C语句中援用时不需加冒号。
l不克不及是SQL命令中的保存字。
l能够带唆使变量。
比方:EXECSQLBEGINDECLARESECTIONS;
VARCHARprograme;
Intporgsal,pempno;
EXECSQLENDDECLARESECTION;


EXECSQLSELECTENAME,SAL
INTO:programe,:progsal
FROMEMP
WHEREEMPNO=:pempno;


(2).唆使器变量的申明和援用
唆使变量实践上也是一类SQL变量,它被用来办理与其相干联的宿主变量(即在SQL语句中充
当输出或输入的变量)。每个宿主变量都可界说一个唆使器变量,次要用于处置空值(NULL)
唆使器变量的申明基础统一般SQL变量一样,但必需界说成2字节的整型,如SHORT、INT。在SQL语句中援用时,
其前也应加“:”(冒号),并且必需附在其相干联的宿主变量以后,在C语句中,可自力利用。当唆使器变量为-1时,暗示空值。比方:
EXECSQLBEGINDECLARESECTION;
INTdept-number;
SHORTind–num;
CHARemp–name;
EXECSQLENDDECLARESECTION;



Scanf(“90d%s”,&dept-number,dept–name);
If(dept–number==0)
Ind–num=-1;
Else
Ind–num=0;
EXECSQLINSERTINTODEPT(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语句、即可一次性拔出。比方:
EXECSQLBEGINDECLARESECTION;
Intemp_number;
Charemp_name;
Floatsalary,commission;
Intdept_number;
EXECSQLENDDECLARESECTION;
….
EXECSQLSELECTEMPNO,ENAME,SAL,COMM
INTO:emp_number,:emp_name,:salary,:commission
FROMEMP
WHEREDEPTNO=:dept_number;
在利用数组时,应注重以下几点;
l不撑持指针数组
l只撑持一维数组,而emp-name视为一维字符串
l数组最年夜维数为32767
l在一条SQL语句中援用多个数组时,这些数组维数应不异
l在VALUES,SET,INTO或WHERE子名中,不同意把复杂SQL变量与数组SQL变量混用
l不克不及在DELARE部分初始化数组
比方:上面的援用长短法的
EXECSQLBEGINDECLARESECTION;
Intdept–num={10,20,30};
EXECSQLENDDECLARESECTION;

EXECSQLSELECTEMPNO,ENAME,SAL
INTO:emp–num,:emp–name,:salarg
FROMEMP
(5)伪范例VARCHAR的申明和援用
VARCHAR变量在援用之前也必需在申明段申明,申明时必需指出串的最年夜
长度,如:
EXECSQLBEGINDECLARESECTION;
Intbook–number;
VARCHARbook–name;
EXECSQLENDDECLARESECTION;
在预编绎时,book–name被翻译成C言语中的一个布局变量;
Struct{unsignedshortlen;
Unsignedchartarr;
}boo–name
由此看出,VARCHAR变量实践上是含长度成员和数构成员的布局变量。在SQL语句中援用时,应援用以冒号为前缀的布局名,而不加下标,在C语句中援用布局成员。
VARCHAR变量在作输入变量时,由ORACLE主动设置,在作为输出变量时,程序应先把字符串存进数构成员中,
其长度存进长度成员中,然后再在SQL语句中援用。比方:
Main()
{.......
scanf(“90s,90d’,book–name.arr,&book–number);
book–name.len=strlen(book–name.arr);
EXECSQLUPDATEBOOK
SETBNAME=:book–name;
BDESC=:book–number;
}
(6)SQL通讯区
SQL通讯区是用以下语句形貌的:
EXECSQLINCLUDESQLCA;
此部分供应了用户运转程序的成败纪录和毛病处置。

SQLCA的构成
SQLCA是一个布局范例的变量,它是ORACLE和使用程序的一个接口。在实行Pro*C程序时,ORACLE
把每个嵌进SQL语句实行的形态信息存进SQLCA中,依据这些信息,可判别SQL语句的实行是不是乐成,处置的行数,毛病信息等,其构成如表所示:
Structsqlca
{charsqlcaid;----à标识通信区
longsqlabc;---à通信区的长度
longsqlcode;---à保存比来实行的SQL语句的形态码
struct{unsignedshortsqlerrml;-----à信息文本长度
}sqlerrm;
charsqlerrp;
longsqlerrd;
charsqlwarn;
charsqlext;
}
structsqlcasqlca;
个中,sqlcode在程序中最经常使用到,它保存了比来实行的SQL语句的形态码。程序员依据这些形态码做出响应的处置。这些形态码值以下:
0:暗示该SQL语句被准确实行,没有产生毛病和破例。
>0:ORACLE实行了该语句,但碰到一个破例(如没找就任何数据)。
<0:暗示因为数据库、体系、收集或使用程序的毛病,ORACLE未实行该SQL语句。
当呈现此类毛病时,以后事件一样平常应回滚。

2.使用程序体
在Pro*C程序中,能把SQL语句和C语句自在地夹杂誊写,并能在SQL语句中利用SQL变量,嵌进式SQL语句的誊写文法是:
l以关头字EXECSQL入手下手
l以C言语的语句闭幕符(分号)闭幕
SQL语句的感化次要用于同数据库打交道。C言语程序用于把持,输出,输入和数据处置等。
(1)毗连到ORACLE数据库
在对数据库存取之前,必需先把程序与ORACLE数据库毗连起来。即登录到ORACLE上。所毗连命令应当是使用程序的第一个可实行命令。毗连命令格局以下:
EXECSQLCONNECT:<用户名>IDENTIFIEDBY:<口令>
或EXECSQLCONNECT:<用户名>/<口令>
在利用上述两种格局举行登进时,应该起首在申明段界说包括用户名和口令的
SQL变量,并在实行CONNECT之前设置它们,不然会形成登录失利。比方:
EXECSQLBEGINDECLARESECTION;
VARCHARusename;
VARCHARpassword;
EXECSQLENDDECLARE
..........
strcpy(usename.arr,“CSOTT’);
usename.len=strlen(username.arr);
strcpy(password.arr,“TIGER’);
password.len=strlen(password.arr);
EXECSQLWHENEVERSQLERRORGOTOSQLERR;
EXECSQLCONNECT:usernameINDNTIFIEDBY:password;
注重:不克不及把用户名和口令间接编写到CONNECT语句中,大概把用引号(’)括起来的字母串在CONNECT语句中,以下面的语句是有效的。
EXECSQLCONNECTSCOTTINENTIFIEDBYTIGER;
EXECSQLCONNECT‘SCOTT’IDENTIFIEDBY‘TIGER’;
(2).拔出、更新和删除
在报告SQL言语时已具体讲过,这里就不举例申明了。
(3).数据库查询及游标的利用
在PRO*C中,查询可分为两品种型:
l前往单行或定行数的查询;
l前往多行的查询.此种查询请求利用游标来把持每行或每组(主变量用数组).
1)前往单行或定行数的查询
在PRO*C中的查询SQLSELECT语句由以下几个子句构成:
SELECT
INTO
FROM
WHERE
CONNECTBY
UNION
INTERSECT
MINUS
GROUPBY
HAVING
ORDERBY
个中WHERE子句中的查询前提能够是一个属性或多个属性的汇合,在实行是赋值的主变量也可放在WHERE子句中.WHERE子句中所用的主变量称为输出主变量。如:
SELECTEMPNO,JOB,SAL
INTO:PNAME,:PJOB,:PSAL
FROMEMP
WHEREEMPNO=:PEMPNO;
若没有找到限制的行,则SQLCA.SQLCODE前往”+1403”,标明”没有找到”。
INTO从句中的主变量叫输入主变量,它供应了查询时所必要的信息。
在任何项送给主变量之前,都请求ORACLE把这些项转换成主变量的数据范例。关于数字是经由过程截断来完成的(如:9.23转换为9)。
假如已断定查询只前往一行,那末就不用利用游标,只给SELECT语句增添一个INTO子句便可。在语义上INTO语句在FROM之前的查询中有几个选择项就有几个输入主变量。若在SELECT项中表达式的数量不即是INTO子句中主变量的数量,就把SQLCA.SQLWARN置为”W”。

2)多行查询及游标的利用
假如查询前往多行或不晓得前往几行,利用带有ORACLE游标(CURSOR)的SELECT语句。
游标是ORACLE和PRO*C寄存查询了局的事情地区。一个游标(已定名的)与一条SELECT语句相干联。操纵游标有由4条命令:(1)DECLARE
CURSOR;(2)OPENCURSOR;(3)FETCH;(4)CLOSECURSOR。

A.界说游标
一个游标必需起首界说,才干利用它。语法为:
EXECSQLDECLARE〈游标名〉CORSORFOR
SELECT〈列〉
FROM〈表〉
比方:
EXECSQLDECLARECSOR,CURSORFOR
SELECTENAME,JOB,SAL
FROMEMP
WHEREDEPTNO=:DEPTNO;
当赋给一个与查询相干联的游标CURSOR以后,当SELECT查询EMP时可从数据库中前往多行,这些行就是CURSOR的一个举动地区。
注重:
1)界说游标必需在对游标操纵之前完成;
2)PRO*C不克不及援用没有界说的游标;
3)游标界说后,其感化局限是全部程序。以是对一个程序来说,同时界说两个不异的游标是毛病的。

B.翻开游标
翻开游标的OPEN语句次要用来输出主变量的内容,这些次要是WHERE中利用的主变量。翻开游标的语句是:EXECSQLOPEN〈游标名〉
当翻开游标后,能够从相干的查询中掏出多于一行的了局。一切满意查询尺度的行构成一汇合,叫做“游标举动集”。经由过程取操纵,举动会合的每行或每组是一个一个前往的,查询完成后,
游标便可封闭了。如图所示:
界说游标:DECLARE

入手下手查询:SELECT
翻开游标:OPEN


从举动集取数据:FETCH

查询完成


封闭游标:CLOSE


注重:1)游标处于举动集的第一行后面;
2)若改动了输出主变量就必需从头翻开游标。

C.取数据
从举动会合掏出一行或一组把了局送到输入主变量中的历程叫取数据。输入主变量的界说在取数据语句中。取数据的语句以下:
EXECSQLFETCH〈游标名〉INTO:主变量1,主变量2,……
FETCH的事情历程如图所示:

查询了局
游标
FETCH
查询了局
在游标翻开后
输入至以后

……


如图所示的查询了局指满意查询前提的查询了局。利用FETCH应注重以下几点:
l游标必需先界说再翻开。
l只要在游标翻开以后才干取数据,即实行FETCH语句。
l
FETCH语句每实行一次,从以后行或以后组取数据一次,下一行或下一组向上移一次。游标每次所指的行或组都为以后行或以后组,而FETCH每次都是取游标所指定的行或组的数据。
l当游标举动集空以后,ORCLE前往一个SQLCA。SQLCA(=1403)。
l若但愿此游标再操纵,必需先封闭再翻开它。
l在C程序中能够启示一个内存空间,来寄存操纵了局,如许就可以使用启示的空间来天真利用查询的了局。

D.封闭游标
取完举动会合一切行后,必需封闭游标,以开释与该游标有关的资本。
封闭游标的格局为:
EXECSQLCLOSE游标名;
比方:
EXECSQLCLOSEC1;
ORACLEV5.0版撑持SQL格局“CURRENTOFCURSOR”。这条语句将指向一个游标中最新掏出的行,
以用于修正和删除操纵。该语句必需有取操纵以后利用,它同等存储一个ROWID,并利用它。

(4).举例
EXECSQLDECLARESALESPEOPLECURSORFOR
SELECTSSNO,NAME,SALARY
FROMEMPLOYEE
WHEREDNAME=‘Sales’;
EXECSQLOPENSALESPEOPLE;
EXECSQLFETCHSALESPEOPLE
INTO:SS,:NAME,:SAL;
EXECSQLCLOSESALESPEOPLE;

(5)SQL嵌套的办法及使用
嵌进SQL与交互式SQL在情势上有以下不同:
1)在SQL语句前增添前缀“EXECSQL”,这一小小的不同其目标是在于预编译时简单辨认出来,
以便把每条SQL作为一条初级言语来处置。
2)每SQL语句分为申明性语句和可实行语句两年夜类。可实行语句又分为数据界说、数据把持、数据利用、数据检索四年夜类。
可实行性SQL语句写在初级言语的可实行处;申明性SQL语句写在初级言语的申明性的中央。
比方:在PRO*C程序中创建一个名为BOOK的表布局,历程以下:
#include〈stdio.h〉
EXECSQLBEGINDECLARESECTION;
VARCHARuid,pwd;
EXECSQLENDDECLARESECTION;
EXECSQLINCLUDESQLCA;
Main()
{
/*logindatabase*/
strcpy(uid.arr,’wu’);
uid.len=strlen(uid,arr);
strcpy(pwd.arr,’wu’);
pwd.len=strlen(pwd.arr);
EXECSQLCONNECT:uidIDENTIFEEDBY:pwd;
EXECSQLCREATETABLEbook
(acqnumnumber,copiesnumber,pricenumber);
EXECSQLCOMMITWORKRELEASE;
EXIT;
PRO*C可十分烦琐天真地会见ORCLE数据库中的数据,同时又具有C言语高速的特性,因此可完成一些ORACLE产物不克不及完成的义务,比方以下一个流动的特别格局输入了局。
SQL嵌套源程序示例
#unclude
typedefcharasciz;
EXECSQLBEGINDECLARESECTION;
EXECSQLTYPEascizISSTRING(20)REFERENCE;
ascizusername;
ascizpassword;
ascizemp_name(5);
intemp_number(5a);
floatsalary;
EXECSQLENDDECLARESECTION;
EXECSQLINCLUDEsqlca;
Voidprint_rows();
Voidsqlerror();
Main()
{
intnum_ret;
strcpy(username,”SCOTT’);
strcpy(password,“TYGER”);
EXECSQLWHENEVERSQLERRORDOsqlerror();
EXECSQLCONNECT:usernameIDENTIFIEDBY:password;
Print(“
ConnectedtoORACLEasuser:%s
”,username);
EXECSQLDECLAREc1CURSORFOR
SELECTEMPNO,ENAME,SALFROMEMP;
EXECSQLOPENc1;
Num_ret=0;
For(;;)
{
EXECSQLWHENEVERNOTFOUNDDObreak;
EXECSQLFETCHc1INTO:emp_number,:emp_name,:salary;
Print_rows(sqlca.sqlerrd–num_ret);
Num_ret=sqlca.sqlerrd;
}
if((sqlca.sqlerrd–num_ret)>0);
print_rows(sqlca.sqlerrd–num_ret);
EXECSQLCLOSEc1;
Printf(“Haveagoodday.
”);
EXECSQLCOMMITWORKRELEASE;
}

voidprint_rows(n);
intn;
{
inti;
printf(“
NumberEmployeeSalary
”);
printf(“------------------------------
”);
for(i=0;iprintf(“%-9d%-8s%9.2f
”,emp-number,emp---name,salary;
}
voidsqlerror()
{
EXECSQLWHENEVERSQLERRORCONTINUE;
Printf(“
oracleerrordetected:
”);
Printf(‘
%.70s
”,sqlca.sqlerrm.sqlerrmc);
EXECSQLROLLBACKWORKRELEASE;
Exit(1);
}


(6)毛病检测和恢复
在利用SQL语句和PRO*C对数据库举行操纵时,经常有字段空值,无前提删除,无行前往,数据溢出和截断等征象产生,这类征象能够用SQLCA和唆使器变量来检测。

1SQLCA的布局
在PRO*C程序中SQLCA布局以下:
STRUCTSQLCA{
Charsqlcaid;
Longsqlabc;
Longsqlcode;
STRUCT{
Unsignedsqlerrm1;
Charsqlerrmc;
}sqlerrm;
Charsqlerrp;
Longsqlerrd;
Charsqlwarn;
Charsqlext;
}
个中:
1)SQLCA.sqlerrm.sqlerrmc:带有SQLCA。SQLCODE的毛病注释。
2)SQLCA.sqlerrd:以后ORACLE的形态,只要SQLCA.SQLERRD成心义,暗示DML语句处置的行数。
3)SQLCA.sqlwarn:供应大概碰到的前提信息。

在每实行一个SQL语句后,ORACLE就把前往了局放进SQLCA中,但申明语句除外。
用SQLCA能够检察SQL语句的实行了局。常常有三种了局:
=0:实行乐成;
SQLCA.SQLCODE=>0:实行乐成的形态值;
<0:失利,不同意持续实行。

2唆使器变量
唆使器变量偶然也称唆使变量.唆使变量与一个主变量相干联,指出主变量的前往情形.
=0:前往值不为空,未被截断,值放在主变量中;
前往值=>0:前往值为空,疏忽主变量的值;
<0:主变量长度不敷就被截断。
利用唆使变量要注重:
l在WHERE子句中不克不及用唆使变量。用NULL属性来测试空值。
比方以下子句:
SELECT…
FROM…
WHEREENAMEISNULL;
是准确的,而
WHEREENAME=:PEME:PEME1
是毛病的。
l唆使变量在拔出空值之前为—1
l可输入空值。

3WHENEVER语句
WHENEVER是申明语句,不前往SQLCODE,只是依据SQLCA中的前往码指定相干的措施。格局为
EXECSQLWHENEVER
;
个中
(1)的缺省值为CONTINUE。
(2)SQLERROR:SQLCA.SQLCODE<0;
(3)SQLWARNIGN:SQLCA.SQLWARN=“W”;
(4)NOTFOUND:SQLCA.SQLCODE=1403;
上面给出一段程序来讲明WHENEVER的用法:
EXECSQLBEGINDEELARESECTION;
VARCHARUID;
VARCHARPASW;
……
EXECSQLENDDECLARESECTION;
EXECSQLINCLUDESQLCA;
Main()
{
……
EXECSQLWHENEVERSQLERRORGOTOERR;
EXECSQLCONNECT:UID/:PWD;
……
EXECSQLDECLARECSOR1CURSORFOR
SELECT〈字段〉
FORM〈表〉
EXECSQLOPENCSOR1;
SQL
……
EXECSQLWHENEVERNOTFOUNDGOTOgood;
For(;;)
EXECSQLFETCHCSOR,INTO……
Good:
……
printf(“
查询停止
”);
EXECSQLCLOSEC1;
EXECSQLWHENEVERSQLERRORCONTINUE.
EXECSQLCOMMITWORKRELEASE:
Exit();
Printf(“
%70s|n”,sqlca.sqlerrm.sqlerrmc);
EXECSQLROLLBACKWORKRELEASE:
Exit(1);
}

(7)静态界说语句
SQL语句分静态界说语句和静态界说语句两种:
(1)静态界说语句:SQL语句事前编进PRO*C中,在经由预编译器编译以后构成方针程序*。BOJ,然后实行方针程序预便可。
(2)静态界说语句:有些语句不克不及事前嵌进到PRO*C程序中,要依据程序运转情形,用户本人从输出设备上(如终端上)及时输出行将实行的SQL语句。
静态界说语句有:
lEXECUTEIMMEDIATE;
lPREPARE与EXECUTE;
lPREPARE与FETCH和OPEN;
lBIND与DEFINEDESCRIPTOR。

1.EXECUTEIMMEDIATE语句
此语句暗示当即实行,而且只向SQLCA前往实行了局,无别的信息。比方:
EXECSQLBEGINDECLARESECTION;
VARCHARabcd;
VARCHARdeay;
EXECSQLENDDECLARESECTION;
/**输入字符串到abcd**/
EXECSQLEXECUTEIMMEDIATE:abcd;
注重:
1)EXECUTEIMMEDIATE只能运转带一个参数的静态语句。个中,abcd是参数,不是关头字。
2)EXECUTEIMMEDIATE利用的先决前提是:SQL语句不克不及包括主变量;SQL语句不克不及是查询语句。
3)可用任何主变量作为EXECUTEIMMEDIATE的参数;也可用字符串作为主变量。

2.PREPARE与EXECUTE语句
此语句暗示“预编译/实行”。此语句可以预编译一次而实行屡次。语法为:
EXECSQLPREPARE〈语句名〉FROM:主变量;
EXECSQLEXECUTE〈语句名〉;
PREPARE语句做两件事:
(1)预编译SQL语句;
(2)给出SQL语句的语句名。
注重:
lSQL语句不克不及是查询语句;
lPREPARE和EXECUTE可包括主变量;
lPREPARE不克不及屡次实行。
比方:
#defineUSERNAME“SCOTT”
#definePASSWORD“TIGER”
#include
EXECSQLINCLUDEsqlca;
EXECSQLBEGINDECLARESECTION;
Char*username=USERNAME;
Char*password=PASSWORD;
VARCHARsqlstmt;
Intemp_number;
VARCHARemp_name;
VARCHARjob;
EXECSQLENDDECLARESECTION;
Main()
{
EXECSQLWHENEVERSQLERRORGOTO:sqlerror;
EXECSQLCONNECT:usernameIDENTIFIEDBY:password;
Sqlstmt.len=sprintf(sqlstmt.arr,”INSERTINTOEMP(EMPNO,ENAME,JOB,SAL)
VALUES(:V1,:V2,:V3,:V4)”);
Puts(sqlstmt.arr);
EXECSQLPREPARESFROM:sqlstmt;
For(;;)
{
printf(“
enteremployeenumber:”);
scanf(“%d”,&emp_number);
if(emp_number==0)break;
printf(“
enteremployeename:”);
scanf(“%s”,&emp_name.arr);
emp_name.len=strlen(emp_name.arr);
printf(“
enteremployeejob:”);
scanf(“%s”,job.arr);
job.len=strlen(job.arr);
printf(“
enteremployeesalary:”);
scanf(“%f”,&salary);
}
EXECSQLEXECUTESUSING:emp_number,:emp_name,:job,:salary;
}


3.FETCH语句和OPEN语句
FETCH语句和OPEN语句这组静态语句是对游标举行操纵的,其实行历程以下:


PREPARE〈语句名〉FROM〈主变量字符串〉;


DECLARE〈游标名〉FOR〈语句名〉;



OPEN〈游标名〉]


FETCH〈游标名〉INTO:主变量1[,:主变量2…]



CLOSE〈游标名〉


注重:
lSQL语句同意利用查询语句;
lSELECT子句中的列名不克不及静态改动,只能预置;
lWHERE和ORDERBY子句能够静态改动前提。

1、Pro*C的编译和运转

1.
先用ORACLE预编译器PROC对PRO*C程序举行预处置,该编译器将源程序中嵌进的SQL言语翻译成C言语,发生一个C言语编译器能间接编译的文件。天生文件的扩大名为
.C
2.用C言语编译器CC对扩大名为.c的文件编译,发生方针码文件,其扩大名为.o
3.利用MAKE命令,毗连方针码文件,天生可运转文件
比方:对下面的example.pc举行编译运转
PROCiname=example.pc
CCexample.c
MAKEEXE=exampleOBJS=”example.o”
example
这类操作的执行过程是,1)按照新的表定义建立一个临时表tmpa,2)将原表数据拷贝到临时表,3)将原始表改名tmpb,4)将tmpa改名为原表名,5)将tmpb删除。

小妖女 发表于 2015-1-19 18:59:35

索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。

因胸联盟 发表于 2015-1-28 09:33:47

如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。

再见西城 发表于 2015-2-5 17:17:27

是要和操作系统进行Socket通讯的场景。否则建议慎重!

只想知道 发表于 2015-2-13 01:09:26

分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。

爱飞 发表于 2015-3-11 10:55:55

这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。

深爱那片海 发表于 2015-3-18 07:18:40

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

海妖 发表于 2015-3-25 13:14:16

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
页: [1]
查看完整版本: MSSQL编程:Pro*C的利用