`
leon1509
  • 浏览: 533192 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[原创] Pro*C实战

阅读更多
本总结跟网上那些垃圾转贴有本质的区别,乃实际环境摸索出来的。

============ 分割线 =============

数据库版本:ORACLE 10.2.0.1.0
操作系统:RHEL4.x

1. 编辑$ORACLE_HOME/precomp/admin/pcscfg.cfg,在sys_include=处加上stddef.h所在的目录。

附:stddef.h查找方法
    用root执行find / -name stddef.h -print
    关键在于确定查找出来的N个stddef.h的目录。以下为10.14.3.10服务器上的查找结果:
/usr/include/linux/stddef.h
/usr/include/xulrunner-sdk-1.9/system_wrappers/stddef.h
/usr/lib/gcc/x86_64-redhat-linux6E/4.3.2/include/stddef.h
/usr/lib/gcc/x86_64-redhat-linux/3.4.6/include/stddef.h
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include/stddef.h
/usr/lib/bcc/include/stddef.h
/usr/lib/syslinux/com32/include/stddef.h
/usr/lib/syslinux/com32/include/bitsize/stddef.h
/usr/src/kernels/2.6.18-128.el5-x86_64/include/linux/stddef.h
/home/term/pack/STLport-5.2.1/stlport/stddef.h
/home/mytools/STLport-5.1.5/stlport/stddef.h

根据http://blog.chinaunix.net/space.php?uid=20011314&do=blog&cuid=527167帖子介绍,我选择了
    /usr/lib/gcc/x86_64-redhat-linux/4.1.1/include/stddef.h加入到pcscfg.cfg文件中。(此处为关键步骤)


2. 编译执行:
$ proc dept.pc
$ cc -o dept dept.c -I $ORACLE_HOME/precomp/public -L $ORACLE_HOME/lib -l clntsh


3. 例一:dept.pc源代码

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

int main(int argc, char* argv[])
{
  EXEC SQL BEGIN DECLARE SECTION;
  char *uid = "ocs_test/ocs_test";
  char name[32]="NULL";
  /*int i;*/
  EXEC SQL VAR name is STRING(32);
  EXEC SQL END DECLARE SECTION;

  EXEC SQL CONNECT :uid;

  if(sqlca.sqlcode == 0)
    printf("connect success!\n");
  else
    printf("connect failure!\n");

  EXEC SQL DECLARE cur_client CURSOR FOR select itemname from ocs_sm_function;
  EXEC SQL OPEN cur_client;

  setlocale( LC_ALL, "chs" );
  while(1)
  {
    strcpy(name, "");
    EXEC SQL FETCH cur_client INTO :name;
    if(sqlca.sqlcode == 1403)
    {
        break;
    }
    printf("name is %s\n", name);
  }
  EXEC SQL CLOSE cur_client;
  /* 释放数据库资源 */
  EXEC SQL ROLLBACK WORK RELEASE;
  return 0;
}




4.例二:emp.pc源代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlda.h>
#include <sqlcpr.h>

EXEC SQL INCLUDE sqlca;
/*RELEASE_CURSOR=YES 使PROC 在执行完后释放与嵌入SQL有关资源*/
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);

EXEC SQL BEGIN DECLARE SECTION;
char *vc_user = "scott/tiger";
/*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("\n%s,%ld,%s\n", msg,sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);
    EXEC SQL ROLLBACK RELEASE;
    exit(-1);
}
int main(int argc, char *argv[])
{
    EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE ERROR: ");

    /*连接数据库*/
	/*
    strcpy(vc_user.arr,"scott/tiger");
    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, :ac_hiredate, :af_sal;
        if( sqlca.sqlcode == 1403)
        {
            break;
        }
        printf("empno=%ld,ename=%s,hiredate=%s,sal=%lf\n",al_empno,ac_ename,ac_hiredate,af_sal);
    }
    EXEC SQL CLOSE cur_emp;
    EXEC SQL ROLLBACK WORK RELEASE;
}


5. 例三:test1.pc
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>

int main(int argc,char* argv[]) 
{
        EXEC SQL BEGIN DECLARE SECTION;
        char *uid = "scott/tiger";
        long userid=0;
        char username[51]="";
        EXEC SQL VAR username IS STRING(51);
        EXEC SQL END DECLARE SECTION;

        EXEC SQL CONNECT :uid;
        if(sqlca.sqlcode == 0)
                printf("connect sucess!\n");
        else
                printf("connect fail!\n");
         EXEC SQL DECLARE cur_user CURSOR FOR SELECT DEPTNO, DNAME FROM DEPT;
         EXEC SQL OPEN cur_user;

         while(1){
          userid=0;
          strcpy(username,"");
          EXEC SQL FETCH cur_user INTO  :userid, :username;
          if( sqlca.sqlcode == 1403)
          {
              break;
          }

          printf("userid=%ld,username=%s\n",userid,username);
         }

         EXEC SQL CLOSE cur_user;
         // EXEC SQL COMMIT WORK RELEASE;
         EXEC SQL ROLLBACK WORK RELEASE;

         return 0;
}


6. 例四:test.pc
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
EXEC SQL include sqlca;
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[20];
VARCHAR password[20];
EXEC SQL END DECLARE SECTION;

void sql_error()
{
	EXEC SQL WHENEVER SQLERROR CONTINUE;
	printf("/n Oracle error detected:/n");
	printf("/n%.70s/n",sqlca.sqlerrm.sqlerrmc);
	EXEC SQL ROLLBACK RELEASE;
exit(1);
}

main()
{
	strcpy(username.arr,"scott");
	strcpy(password.arr,"tiger");
	username.len=strlen(username.arr);
	password.len=strlen(password.arr);


	EXEC SQL CONNECT :username IDENTIFIED BY :password;
	printf("sqlca.sqlcode=%d\n",sqlca.sqlcode);
	printf("login user=%s\n",username.arr);
	exit(0);
	return 0;
}

问题:dept.pc输出的中文数据是乱码,尚未解决
分享到:
评论

相关推荐

    pro*c sample

    Pro*C是Oracle公司开发的一种预编译器,它允许程序员在C语言中嵌入PL/SQL代码,使得C程序可以直接与Oracle数据库交互。通过Pro*C,开发者可以利用C语言的强大功能和效率,同时享受Oracle数据库提供的高级数据库操作...

    Pro*c编程电子图书

    2. **SQL嵌入C语言**:详细解释如何在C代码中嵌入SQL语句,包括SELECT、INSERT、UPDATE、DELETE等操作,以及如何处理结果集。 3. **PL/SQL在Pro*C中的应用**:展示如何在C程序中调用存储过程、函数和包,以利用...

    Oracle Pro*C 编程入门.pdf

    1. Pro*C简介:Pro*C是一种将SQL语句嵌入C程序中的开发工具,它允许开发者在C语言中直接使用SQL语句访问Oracle数据库。它是一种第三代语言嵌入式SQL工具,可以在Oracle数据库管理系统中使用。Pro*C程序可以执行...

    linux下c/c++连oracle数据库技术pro*c

    Pro*C是Oracle公司提供的一种预编译器,它允许C或C++程序直接调用PL/SQL代码,极大地简化了数据库操作。本篇文章将详细探讨Linux下使用C/C++和Pro*C连接Oracle数据库的技术细节。 1. **Pro*C介绍**: Pro*C是...

    《精通Oracle 10g Pro*C/C++编程》源代码与学习笔记

    《精通Oracle 10g Pro*C/C++编程》是一本专为数据库开发人员设计的教程,作者王海亮和张立民通过这本书深入探讨了如何使用C或C++语言与Oracle 10g数据库进行高效交互。源代码与学习笔记的提供,为读者提供了实践操作...

    Pro*C/C++ 编程

    **Pro*C/C++ 编程** Pro*C/C++ 是一种集成在C或C++编程语言中的预处理器,它允许程序员直接在源代码中嵌入PL/SQL语句,用于与Oracle数据库进行交互。这种编程方式提供了高效且灵活的数据库访问手段,特别适合于开发...

    PRO*C入门实例

    在IT领域,PRO*C是Oracle公司提供的一种预编译器,它允许开发人员使用C语言来编写PL/SQL代码,从而更高效地与Oracle数据库进行交互。这个“PRO*C入门实例”可能是针对初学者的一个教程,通过一个实际的代码示例来...

    oracle培训pro*c

    Oracle Pro*C 是一种集成的开发工具,用于在C语言中嵌入SQL语句,以便高效地与Oracle数据库进行交互。这种技术将C语言的强大功能与SQL的数据库操作能力结合在一起,提供了一种灵活且高性能的方式来构建数据库应用...

    精通PRO*c编程

    《精通PRO*C编程》这本书是针对Oracle数据库应用开发的一本专业指南,主要讲解如何使用PRO*C,Oracle提供的C语言预处理器,进行高效的数据库应用程序开发。PRO*C是Oracle Corporation为C程序员设计的一种工具,它...

    java 调 pro*c

    Pro*C是Oracle提供的一种工具,它允许开发人员使用C语言来编写存储过程、函数和其他数据库访问代码,并且能够直接与Oracle数据库API交互。本文将详细介绍如何在Java中调用Pro*C编译的程序,并探讨相关的知识点。 ...

    Pro*C程序设计ORACLE调用接口

    《Pro*C程序设计ORACLE调用接口》是关于在C语言中使用Oracle数据库的一种高效方法。Pro*C,全称为Pre-Compiler for C,是Oracle公司提供的一个预编译器,它允许开发者直接在C程序中嵌入SQL语句,极大地提高了数据库...

    VC整合Pro*C开发环境配置(图)

    【标题】"VC整合Pro*C开发环境配置(图)"涉及的是在Visual C++(简称VC)集成开发环境中配置Oracle的Pro*C编译器的过程。Pro*C是Oracle公司提供的一种预编译器,它允许C/C++程序员直接在C或C++代码中嵌入SQL语句,...

    pro*c程序设计详解

    《Pro*C程序设计详解》是一本深入探讨Pro*C编程技术的专业书籍,旨在帮助读者全面理解和掌握Pro*C这一C语言与Oracle数据库交互的重要工具。Pro*C是Oracle公司提供的一种预编译器,它允许程序员在C语言中直接嵌入SQL...

    pro*c 实现分页总结

    Pro*C,是Oracle提供的一种预编译器,用于将C语言与PL/SQL结合,使得在C/C++程序中可以直接操作Oracle数据库。本文将深入探讨如何在Pro*C中实现分页查询,主要关注两种常用的方法。 首先,让我们回顾一下基本的分页...

    PRO*C的批量读取

    PRO*C(也称为预编译C)是一种允许在C程序中嵌入SQL语句的技术,它结合了C语言的强大功能与Oracle数据库的高效数据处理能力。本文主要探讨如何使用PRO*C进行高效的大规模数据导出。 #### 二、问题概述 假设有一个...

    Pro* C访问Oracle数据库技术研究.pdf

    Pro*C是C语言与Oracle数据库的一种融合,它允许开发者将C语言的灵活性与SQL的数据库操作能力相结合,从而实现高效的数据处理。 文章首先介绍了Pro*C的主要特点和优势。其一,Pro*C的源代码由C语言和内嵌的SQL语句...

    Oracle 11g Pro*c 环境以及编译

    Oracle 11g Pro*c 环境 编译 makefile

    oracle pro*c入门

    通过Pro*C,开发者可以利用C语言的强大功能和Oracle数据库的高效数据处理能力。以下是对Oracle Pro*C及其相关知识点的详细说明: 1. **预编译过程**:Pro*C程序首先需要通过Oracle的预编译器PCC处理,这个过程将...

    Pro*C增删改查Oracle数据库的代码

    Pro*C增删改查Oracle数据库中数据表的代码

Global site tag (gtag.js) - Google Analytics