• ProC第三弹


    一、前言

    我们上面已经了解Windows和Linux下的ProC开发环境,这里我们更进一步去
    简要介绍下ProC的预编译参数。

    二、什么是预编译

    预编译过程中,Pro*C/C++会自动生成C或者C++的代码,去替代你原来的嵌入SQL,
    生成的代码包含了一些数据结构,其中声明了数据类型,长度,变量地址以及SQLLIB需
    要的一些其他信息。生成的代码还包括了执行嵌入SQL操作的一些SQLLIB调用。

    SQLLIB Windows下名是 "orasql9.lib" ,Linux下是"libclntsh.so.9.0" 。这方面知识可以参
    考先前的文章:
    《Oracle数据库开发(一).Windows下配置使用ProC》
    《Oracle数据库开发(二).Linux下配置使用ProC》

    三、使用预编译选项

    预编译选项可以控制编译资源的使用,错误提示,标准化输入输出以及管理游标。
    在Windows下,多数人倾向于使用“procui.exe”(Oralce菜单里的ProC*C++工具)进行
    预编译,可以通过Options菜单选择编译选项。当我们使用Linux平台时,一般会在命
    令行下指定参数,例如:
    $ proc parse=none iname=main.pc

    不管是Windows还是Linux,开发人员可以都键入“proc ?”获取更多的信息。

    在Oracle中,关于参数的使用有不少的方法,如:

    系统参数文件
    用户参数文件
    命令行
    inline

    ProC安装后都会存在唯一的系统参数文件“pcscfg.cfg”,所在路径为“$ORACLE_HOME/precomp/admin”。
    用户的参数文件,我们可以手工指定。命令行很容易理解,上面已有相关说明。“inline”
    的意思是在原始pc文件中通过“EXEC SQL”显式声明,不过不是所有的参数可以使用
    这种方式声明。

    关于这些优先级的说明,在Oracle相关的官方文档已经说得很明确。具体内容可
    参看《Pro*C/C++开发指南》,这里不再赘述。

    四、一些比较重要的参数

    CONFIG,PARSE 和 SYS_INCLUDE

    在命令行下输入“proc ?”,简单浏览下显示信息,你会发现CONFIG的默认值是空。
    ORACLE一直使用的是系统的参数文件,除非你手工去指定config选项。
    在Linux环境下,默认的系统参数文件“pcscfg.cfg”中含有“SYS_INCLUDE”的选项,
    但是如果“PARSE=NONE",这个“SYS_INCLUDE”的选项会被忽略。所以你可以使用
    “proc parse=none iname=main.pc”(上篇文章)轻松编译。

    不过当我们指定PARSE值为FULL时,你就必须正确定义“SYS_INCLUDE”,这时可
    以在ProC的源文件.pc中,直接使用C语法规则定义宿主变量。可以看下面的例子:


    #include "sqlca.h"
    #include <stdio.h>
    #include <string.h> 
    #include <stdlib.h>

    void sql_error(char *msg) 

    printf(" %s %s ", msg,(char *)sqlca.sqlerrm.sqlerrmc); 
    //EXEC SQL ROLLBACK RELEASE; 
    exit(0);


    void main() {

    EXEC SQL INCLUDE sqlca;
    EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
    EXEC SQL WHENEVER SQLERROR DO sql_error(" <ERROR> ");

    char oraCN[200];
    strcpy(oraCN, "system/ddd@unixdb");

    EXEC SQL CONNECT :oraCN;
    printf(" [OK Connected!] ");

    }

    在Windows下,“SYS_INCLUDE"的值类似于“E:Program FilesMicrosoft Visual StudioVC98Include”,
    即Vc6.0的头文件目录,编辑“pcscfg.cfg”,然后预编译源代码,程序运行没有任何问题。

    在Linux下,可能要稍微复杂一些。

    $ pwd
    /home/ora/ora9/oracle/precomp/admin
    $ cat pcscfg.cfg
    sys_include=(/usr/include,/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include)
    ltype=short

    $ proc parse=full iname=main.pc
    $ gcc -g -o main main.c -I/home/ora/ora9/oracle/precomp/public -L/home/ora/ora9/oracle/lib -lclntsh

    依上编译,也没有问题。

    ------------------------------------------------------
    Oracle 参考

    PARSE=NONE
    所有宿主变量必须定义在声明段中。只有在声明段中的预编译指令才会
    识别。
    PARSE=PARTIAL
    可以识别所有的预编译指令,所有宿主变量必须定义在声明段中。如果
    CODE=CPP,这个是默认选项。
    PARSE=FULL
    可以识别所有的预编译指令,可以直接使用C语法定义宿主变量,不必
    定义在声明段中。

    五、后记

    在我使用“PARSE=FULL”选项时,发现“EXEC SQL INCLUDE sqlca;” 和 “EXEC SQL ROLLBACK RELEASE; ”
    不能同时使用。不知道是为什么,估计可能是SQLCA的内部兼容性问题。相信有时
    间能解决这个问题。

    原文地址:http://blog.chinaunix.net/uid-10376640-id-2960118.html

  • 相关阅读:
    计科4班曾祥刚2016024290
    线程:子线程先循环十次,主线程在循环20次,再子线程循环十次,主线程循环20次,如此循环50次
    java经典程序(11-20)
    java经典程序(1-10)
    String,File和xml
    自写一个双向链表
    i love my girl
    javamail发邮件
    Java反射机制(创建Class对象的三种方式)
    java基础面试题
  • 原文地址:https://www.cnblogs.com/nosadness/p/5136639.html
Copyright © 2020-2023  润新知