日期:2014-05-16  浏览次数:20516 次

Pro * C 的使用(三)
   (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是参数,不是关键字。
  2) EXECUTE IMMEDIATE使用的先决条件是:SQL语句不能包含主变量;SQL语句不能是查询语句。
  3) 可用任何主变量作为EXECUTE IMMEDIATE的参数;也可用字符串作为主变量。
  
  2. PREPARE与EXECUTE语句
  此语句表示“预编译/执行”。此语句能够预编译一次而执行多次。语法为:
  EXEC SQL PREPARE 〈语句名〉FROM:主变量;
  EXEC SQL EXECUTE〈语句名〉[USING:替换主变量];
  PREPARE语句做两件事:
  (1) 预编译SQL语句;
  (2) 给出SQL语句的语句名。
  注意:
  l SQL语句不能是查询语句;
  l PREPARE和EXECUTE可包含主变量;
  l PREPARE不能多次执行。
  例如:
  #define USERNAME “SCOTT”
  #define PASSWORD “TIGER”
  #include
  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(“\nenter employee number:”);
    scanf(“%d”,&emp_number);
    if (emp_number==0) break;
    printf(“\nenter employee name:”);
    scanf(“%s”,&emp_name.arr);
    emp_name.len=strlen(emp_name.arr);
    printf(“\nenter employee job:”);
    scanf(“%s”,job.arr);
    job.len=strlen(job.arr);
    printf(“\nenter employee salary:”);
    scanf(“%f”,&salary);
   }
  EXEC SQL EXECUTE S USING :emp_number,:emp_name,:job,:salary;
  }
  
  
  3. FETCH语句和OPEN语句
  FETCH语句和OPEN语句这组动态语句是对游标进行操作的,其执行过程如下:
   
  注意:
  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