数据库编程-补充材料-ORACLEproc.ppt
说明说明SQL通讯区通讯区 在程序头加上在程序头加上EXEC SQL INCLUDE SQLCA;其中包括许多变量,如返回码等。其中包括许多变量,如返回码等。与与SQL连接语句(连接语句(CONNECT)EXEC SQL CONNECT:用户名变量用户名变量 IDENTIFIED BY :口令变量:口令变量或或 EXEC SQL CONNECT:用户名变量用户名变量/:口令变量:口令变量1伪类型伪类型VARCHAR 只有只有DECLAREDECLARE部分引用,可认为是部分引用,可认为是C C的扩充类的扩充类型。描述如下型。描述如下EXEC SQL BEGIN DECLARE SECTION;VARCHAR job20;EXEC SQL END DECLARE SECTION;等价于:等价于:Struct unsigned/*2bytes*/short int len;unsigned char arr40 job;2在在ORACLE上注册和注销上注册和注销 说明:这是以说明:这是以SCOTT/TIGERSCOTT/TIGER为用户名和口令为用户名和口令登陆进入数据库的登陆进入数据库的PRO*CPRO*C程序例。程序例。#include EXEC SQL BEGIN DECLARE SECTION;VARCHAR uid20;VARCHAR pwd20;EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLCA;3在在ORACLE上注册和注销上注册和注销 Main()strcpy(uid.arr,”SCOTT”);uid.len=strlen(uid.arr);strcpy(pwd.arr,”TIGER”);pwd.len=strlen(pwd.arr);EXEC SQL CONNECT:uid IDENTIFIED BY :pwd Printf(“connect ed to oracle user%sn”,uid.arr);EXEC SQL COMMIT WORK RELEASE;Exit(0);4创建一个表创建一个表#include EXEC SQL BEGIN DECLARE SECTION;VARCHAR uid20;VARCHAR pwd20;EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLCA;Main()strcpy(uid.arr,”SCOTT”);uid.len=strlen(uid.arr);strcpy(pwd.arr,”TIGER”);pwd.len=strlen(pwd.arr);5EXEC SQL CONNECT:uid IDENTIFIED BY :pwd Printf(“connected to oracle as user%sn”,uid.arr);EXEC SQL CREATE TABLE emp(empno number,ename char(15),job char(10),mgr number,hiredate date,sal number,deptno number);Printf(“table emp created!n”);EXEC SQL COMMIT WORK RELEASE;Exit(0);61.EXECUTE IMMEDIATE预编译任何预编译任何SQL语句(除语句(除SELECT)并执行之。)并执行之。SQL语句语句可以是文字量,但它可以不包括任何主变量(既不包括输可以是文字量,但它可以不包括任何主变量(既不包括输入,也不包括输出主变量)入,也不包括输出主变量)EXECUTE IMMEDIATE只能带一个参数,执行一次只能带一个参数,执行一次2.PREPARE 和和EXECUTE语句语句预编译任何预编译任何SQL语句(除语句(除SELECT)并执行之。语句可以)并执行之。语句可以包括输入或输出主变量。它的包括输入或输出主变量。它的SQL语句仅被语法分析一次,语句仅被语法分析一次,可带多个参数,对任何可带多个参数,对任何SQL语句可多次使用,但必须保证语句可多次使用,但必须保证变量的数目和相应的数据类型必须相同。变量的数目和相应的数据类型必须相同。PREPARE完成:完成:预编译(分析)该预编译(分析)该SQL语句,并为其提语句,并为其提供一个语句名。供一个语句名。EXECUTE执行刚预编译的语句,使用执行刚预编译的语句,使用USING提供的值。提供的值。动态动态SQL语句语句四种方式:四种方式:73.PREPARE 和和FETCH语句语句允许使用允许使用SELECT语句语句,语句可以包括输入或输出主语句可以包括输入或输出主变量。这种方式的顺序是变量。这种方式的顺序是PREPARE,DECLEAR,OPEN和和FETCH.变量的数目和相应的数变量的数目和相应的数据类型必须相同。据类型必须相同。4.使用赋值和定义描述符使用赋值和定义描述符允许使用任何允许使用任何SQL语句,包括查询结果为单记录或多语句,包括查询结果为单记录或多记录的记录的SELECT语句。语句。81.EXECUTE IMMEDIATE 立即执行方式立即执行方式 A.A.SQL语句不能是语句不能是SELECT语句,只能是语句,只能是U,D,I语句语句 B.SQL语句不能包含主变量语句不能包含主变量例:例:EXEC SQL BEGIN DECLARE SECTION;VARCHAR dstring80;EXEC SQL END DECLARE SECTION;scanf(“%s”,dstring);EXEC SQL EXECUTE IMMEDIATE :dstring;9EXECUTE IMMEDIATE 实例实例 这是一个提交修改语句的这是一个提交修改语句的pro*cpro*c实例。实例。#include EXEC SQL BEGIN DECLARE SECTION;VARCHAR uid20;VARCHAR pwd20;char select132;EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLCA;Main()char where80;int scode;10strcpy(uid.arr,”SCOTT”);uid.len=strlen(uid.arr);strcpy(pwd.arr,”TIGER”);pwd.len=strlen(pwd.arr);EXEC SQL WHENEVER SQLERROR STOP;EXEC SQL CONNECT:uid IDENTIFIED BY :pwd Printf(“connected to oracle as user%sn”,uid.arr);strcpy(select,”UPDATE EMP SET COMM=100 WHERE”);Printf(“please enter where clause for the following:n”);Printf(“%s”,select);Scode=scanf(“%s”,where);If(scode=EOF|scode=0)11 Printf(“invalid entry!n”);exit(1);Strcat(select,where);EXEC SQL EXECUTE IMMEDIATE:select;Printf(“%d records updated.n”,sqlca.sqlerrd2);EXEC SQL WHENEVER SQLERROR CONTINUE;EXEC SQL COMMIT WORK RELEASE;Exit(0);122.PREPARE 和和EXECUTE语句语句准备执行方式准备执行方式 A.A.SQL语句不能是语句不能是SELECT语句,只能是语句,只能是U,D,I语句语句 B.SQL语句可包含主变量,可多次使用。语句可包含主变量,可多次使用。例:要执行例:要执行delete from emp where empno=:pempnoscanf(“%s”,dstring);EXEC SQL PREPARE s1 FROM :dstring;scanf(“%d”,&pempno);WHILE (pempno!=0)EXEC SQL EXECUTE s1 USING :pempno;scanf(“%d”,&pempno);可以可以USING :VAR1,:VAR2,13PREPARE 和和EXECUTE实例实例 这是一个提交修改语句的这是一个提交修改语句的pro*cpro*c实例。实例。#include EXEC SQL BEGIN DECLARE SECTION;VARCHAR uid20;VARCHAR pwd20;char select132;float comm;EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLCA;Main()char where80;int scode;14strcpy(uid.arr,”SCOTT”);uid.len=strlen(uid.arr);strcpy(pwd.arr,”TIGER”);pwd.len=strlen(pwd.arr);EXEC SQL WHENEVER SQLERROR GOTO errpt;EXEC SQL CONNECT:uid IDENTIFIED BY :pwd Printf(“connected to oracle as user%sn”,uid.arr);strcpy(select,”UPDATE EMP SET COMM=:comm WHERE”);Printf(“please enter where clause for the following:n”);Printf(“%s”,select);Scode=scanf(“%s”,where);If(scode=EOF|scode=0)15 Printf(“invalid entry!n”);exit(1);Strcat(select,where);EXEC SQL PREPARE S1 FROM:select;Printf(“please enter commission:”);Scanf(“%f”,&comm);EXEC SQL EXECUTE S1 USING:comm;Printf(“n%d records updated.n”,sqlca.sqlerrd2);EXEC SQL WHENEVER SQLERROR CONTINUE;EXEC SQL COMMIT WORK RELEASE;Exit(0);Errpt:printf(“n%sn”,sqlca.sqlerrmc);EXEC SQL ROLLBACK WORK RELEASE;Exit(1);163.PREPARE 和和FETCH语句,语句,针对针对SELECT语句语句引用方式用以下五步:引用方式用以下五步:A.A.PREPARE FROM B.DECLARE FOR C.OPEN USING:变量名变量名1,:变量名变量名2,D.FETCH INTO:变量名变量名1,:变量名变量名2,E.CLOSE 17PREPARE 和和EXECUTE实例实例 这是一个在查询中使用这是一个在查询中使用WHEREWHERE语句的语句的pro*cpro*c实例。实例。#include EXEC SQL BEGIN DECLARE SECTION;VARCHAR uid20;VARCHAR pwd20;char select132;float sal;int depno;char ename10EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLCA;Main()char where80;int scode;int i;strcpy(uid.arr,”SCOTT”);uid.len=strlen(uid.arr);strcpy(pwd.arr,”TIGER”);pwd.len=strlen(pwd.arr);18EXEC SQL WHENEVER SQLERROR GOTO errpt;EXEC SQL CONNECT:uid IDENTIFIED BY :pwd Printf(“connected to oracle as user%sn”,uid.arr);strcpy(select,”select ename,sal from EMP”);Printf(“please enter where clause for the following:n”);Printf(“%s”,select);Scode=scanf(“%s”,where);If(scode=EOF|scode=0)Printf(“invalid entry!n”);exit(1);Strcat(select,where);EXEC SQL PREPARE S1 FROM:select;19EXEC SQL DECLARE C1 CURSOR FOR S1;EXEC SQL OPEN C1;EXEC SQL WHENEVER NOT FOUND GOTO endloop;For(i=1;i+)EXEC SQL FETCH C1 INTO:ename,:sal;Printf(“%s%fn”,ename,sal);Endloop:printf(”n%d records selected.n”,i);EXEC SQL WHENEVER SQLERROR CONTINUE;EXEC SQL COMMIT WORK RELEASE;Exit(0);Errpt:printf(“n%sn”,sqlca.sqlerrmc);EXEC SQL ROLLBACK WORK RELEASE;Exit(1);20