暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GoldenDB应用开发示例

原创 吾亦可往 2025-01-17
1010

应用开发示例

本节提供不同编程语言连接到 GoldenDB 代码示例。


Java 语言连接示例

GoldenDB 驱动完全实现 JDBC 标准接口,可以按照 JDBC 标准接口连接数据库。以下所有示例代码,都需要依赖 GoldenDB 自研驱动,需要将驱动包引入到代码依赖中。

JDBC 直接连接

  • 环境配置
    推荐 JDK1.8
    GoldenDB 自研驱动。

  • 示例代码

    public static void main(String[] args) {

            String url = "jdbc:goldendb://host:port/test";
            String pass = "****";
            String username = "****";
            String sql = "insert into good (id, name) values (1, 'name')";
            Connection connection = null;
            Statement st = null;
            try {
                connection = DriverManager.getConnection(url, username, pass);
                st = connection.createStatement();
                st.execute(sql);
            } catch (SQLException e) {
                if(st != null){
                    try {
                        st.close();
                    } catch (SQLException ex) {
                        throw new RuntimeException(ex);
                    }
                }
                if(connection != null){
                    try {
                        connection.close();
                    } catch (SQLException ex) {
                        throw new RuntimeException(ex);
                    }
                }
                throw new RuntimeException(e);
            }
        }

    核心参数说明

    字段描述
    url连接字符串,采用标准 JDBC 连接串写法。
    pass数据库密码。
    username数据库用户名。
    sql需要执行的 SQL。

Mybatis 框架连接

  • 环境配置
    JDK1.8
    maven3.6 以上。
    GoldenDB 驱动。

  • 示例代码

    pom.xml

    使用 maven 来管理项目,其中 pom.xml 中引入框架依赖,pom.xml 文件示例如下:

    mybatis-config.xml

    mybatis 配置连接相关参数,mybatis-config.xml 文件示例如下:

    核心参数说明

    参数描述
    driver驱动完整类名。
    url连接字符串,采用标准 JDBC 连接串写法。
    pass数据库密码。
    resourcemapper 文件地址, 文中示例 GoodMapper.xml 在 resources 目录下。

    GoodMapper.xml

    MyBatis 中,Mapper 是一个用于将 SQL 操作与 Java 对象进行映射的接口或 XML 文件,GoodMapper.xml 具体写法如下:

    核心参数说明

    参数描述
    namespacemapper 文件命名空间。
    idnamespace + id 需要全局唯一。

Hibernate 框架连接

  • 环境配置
    JDK1.8
    maven3.6 以上。
    GoldenDB 驱动。

  • 示例代码

    pom.xml

    使用 maven 来管理项目,其中 pom.xml 中引入框架依赖,pom.xml 文件示例如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.example</groupId>
        <artifactId>x</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>3.6.10.Final</version>
            </dependency>
            <dependency>
                <groupId>javassist</groupId>
                <artifactId>javassist</artifactId>
                <version>3.12.1.GA</version>
            </dependency>
        </dependencies>
    </project>


    hibernate.cfg.xml

    hibernate 配置连接相关参数如下,hibernate.cfg.xml 文件示例如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.connection.driver_class">
                com.goldendb.jdbc.Driver
            </property>
              <property name="hibernate.connection.password">
                  ****
              </property>
            <property name="hibernate.connection.url">
                jdbc:goldendb://host:port/test
            </property>
            <property name="hibernate.connection.username">
                ****
            </property>
            <mapping resource="Good.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

    核心参数说明

    参数描述
    driver_class驱动完整类名。
    url连接字符串,采用标准 JDBC 连接串写法。
    password数据库密码。
    username数据库用户名。
    resourcehibernate 对象关系映射文件地址,文中示例 Good.hbm.xml 在 resources 目录下。

    Good.hbm.xml

    hibernate 中映射配置文件,Good.hbm.xml 文件示例如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="org.example.entity.Good" table="good2">
            <id name="id" type="java.lang.Integer">
                <column name="id" not-null="true" sql-type="NUMBER"/>
                <generator class="native"/>
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" />
            </property>
            <property name="price" type="java.lang.Double">
                <column name="price" />
            </property>
            <property name="create_time" type="java.lang.String">
                <column name="create_time" />
            </property>
        </class>
    </hibernate-mapping>

    核心参数说明

    参数描述
    class 标签中 name完整 POJO 类的类型。
    class 标签中 table数据库表名称。

Springboot 框架连接

  • 环境配置
    JDK1.8 。
    maven3.6 以上。
    GoldenDB 驱动。

  • 示例代码

    pom.xml

    使用 maven 来管理项目,其中 pom.xml 中引入框架依赖,pom.xml 文件示例如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.6.0</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>org.example</groupId>
        <artifactId>boot</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>jar</packaging>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <artifactId>spring-boot-starter-json</artifactId>
                        <groupId>org.springframework.boot</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
        </dependencies>
    </project>


    application.yml

    Springboot 配置连接相关参数,application.yml 文件示例如下:

    spring:
      datasource:
          driver-class-name: com.goldendb.jdbc.Driver
          url: jdbc:goldendb://host:port/test
          username: ******
          password: ******


    核心参数说明

    参数描述
    driver-class-name驱动完整类名。
    url连接字符串,采用标准 JDBC 连接串写法。
    pass数据库密码。
    username数据库用户名。

C++ 语言连接示例

ODBC(Open-DataBase-Connectivity)是最早由微软提出的开放式数据库互连技术,其基本思想是为用户提供简单、标准、透明的数据库连接的公共编程接口,搭配不同的驱动程序,用户使用同一套应用程序就可以访问不同的数据库。

  • 环境配置
    GoldenDB 定制 ODBC 驱动。
    硬件平台:x86_64/aarch64 。
    操作系统:x86_64 架构下:CentOS/Redhat 系 Linux 发行版 7 系列,suse12,海光麒麟。

  • 示例代码

    #include<sql.h>
    #include<sqlext.h> 
    #include<string.h>
    #include<time.h>
    #include<stdlib.h>
    #include<stdio.h>  
    #define isSuc(result) ((result) == SQL_SUCCESS || (result) == SQL_SUCCESS_WITH_INFO)
    /** 可扩展设置 **/
    char szConnectString[2560] ="DRIVER={/usr/lib64/libmyodbc5a.so};USER=xxx;PASSWORD=xxx;DATABASE=xx;PORT=8880;SERVER=10.10.10.10;SAFE=1;";
    char szSQLDrop[256] = "drop table if exists t1;";
    char szSQLCreate[256] = "CREATE TABLE t1(id int NOT NULL primary key,name char(50) NOT NULL,age int NOT NULL)distributed by hash(id)(g1)";
    /** 输出缓存 **/
    char szDriverOutput[256];
    short sDriverOutputLength;
    /** 用于测试的函数 **/
    int main()
    {
      short sret; //返回代码
      void* henv;  //环境句柄
      void* hdbc;  //连接句柄
      long mode;//提交模式
      void* hsmt; //语句句柄
      /** 申请环境句柄 **/
      sret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
      if(!isSuc(sret)){printf("申请环境句柄出错\n");return 0;}
      /** 设置环境属性,声明ODBC版本 **/
      sret = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,SQL_IS_INTEGER);
      if(!isSuc(sret)){printf("声明ODBC版本出错\n");return 0;}
      /** 申请连接句柄 **/
      sret = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
      if(!isSuc(sret)){printf("申请连接句柄出错\n");return 0;}
      /** 连接数据源 **/
      sret = SQLDriverConnect(hdbc,NULL,(SQLCHAR*)szConnectString,SQL_NTS,(SQLCHAR *)szDriverOutput,2560,&sDriverOutputLength,SQL_DRIVER_NOPROMPT);
      if(!isSuc(sret)){printf("连接数据源出错\n");return 0;}
      else printf("\nCreate connection success !\n\n");
      /** 分配语句句柄 **/
      sret = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hsmt);
      if(!isSuc(sret)){printf("分配语句句柄出错\n");return 0;}
      /** 执行drop语句 **/
      printf("execute sql: %s\n\n", szSQLDrop);
      sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQLDrop,256);
      if(!isSuc(sret)){printf("exec drop sql fail !\n\n");return 0;}
      else printf("drop table t1(old) success !\n\n");
      /** 执行create语句 **/
      printf("execute sql: %s\n\n", szSQLCreate);
      sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQLCreate,256);
      if(!isSuc(sret)){printf("exec create sql fail !\n\n");return 0;}
      else printf("create table t1(new) success !\n\n");
      /** 执行insert prepare语句 **/
      char szSQLPrepareInsert[256] = "insert into t1 values(?,?,?)";
      printf("prepare sql: %s\n\n", szSQLPrepareInsert);
      sret = SQLPrepare (hsmt,(SQLCHAR *)szSQLPrepareInsert,256);
      if(!isSuc(sret)){printf("prepare sql fail !\n\n");return 0;}
      else printf("prepare success !\n\n");
      size_t batchSize = 9;
      int param1[9] = {1,2,3,4,5,6,7,8,9};
      char param2[9][50] = {"name1","name2","name3","name4","name5","name6","name7","name8","name9"};
      int param3[9] = {11,12,13,14,15,16,17,18,19};
      sret = SQLBindParameter(hsmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,param1,0,NULL);
      sret = SQLBindParameter(hsmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,5,0,param2,50,NULL);
      sret = SQLBindParameter(hsmt,3,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,param3,0,NULL);
      if(!isSuc(sret))printf("bind param fail !\n\n");
      sret = SQLSetStmtAttr(hsmt, SQL_ATTR_PARAMSET_SIZE,(SQLPOINTER)batchSize, 0);
      if(!isSuc(sret))printf("set paramSize fail !\n\n");
      sret = SQLExecute(hsmt);
      if(!isSuc(sret))printf("exec stmt fail !\n\n");
      else printf("exec stmt success !\n\n");
      
      SQLLEN affRows = 0;
      sret = SQLRowCount(hsmt,&affRows);
      if(!isSuc(sret))printf("SQLRowCount stmt fail !\n\n");
            else printf("SQLRowCount stmt success !\n\n");
      printf("affect rows: %d\n\n",affRows);
      /** 执行select prepare语句 **/
      char szSQLPrepareSelect[256] = "select id,name,age from t1 where id < ?";
      printf("prepare sql: %s\n\n", szSQLPrepareSelect);
      sret = SQLPrepare (hsmt,(SQLCHAR *)szSQLPrepareSelect,256);
      if(!isSuc(sret)){printf("prepare sql fail !\n\n");return 0;}
      else printf("prepare success !\n\n");
      int select_param1 = 12;
      sret = SQLBindParameter(hsmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,&select_param1,0,NULL);
      if(!isSuc(sret))printf("bind param fail !\n\n");
      sret = SQLExecute(hsmt);
      if(!isSuc(sret))printf("exec stmt fail !\n\n");
      else printf("exec stmt success !\n\n");
      sret = SQLSetStmtAttr(hsmt, SQL_ATTR_ROW_ARRAY_SIZE,(SQLPOINTER)1, 0);
      if(!isSuc(sret))printf("set paramSize fail !\n\n");
      int ans1 = 0;
      char ans2[50];
      int ans3 = 0;
      sret = SQLBindCol(hsmt,1,SQL_C_SLONG,&ans1,sizeof(int),NULL);
      sret = SQLBindCol(hsmt,2,SQL_C_CHAR,ans2,50,NULL);
      sret = SQLBindCol(hsmt,3,SQL_C_SLONG,&ans3,sizeof(int),NULL);
      if(!isSuc(sret))printf("define param fail !\n\n");
      do
      {
            sret = SQLFetch(hsmt);
            if(isSuc(sret))
        {
          printf("fetch success: [id:%d,name:%s,age:%d]\n",ans1,ans2,ans3);
        }
        }while(sret == 0);
      /** 释放语句句柄 **/
      SQLFreeHandle(SQL_HANDLE_STMT,hsmt);
      /** 提交连接的事务 **/
      SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
      /** 断开与数据源的连接 **/
      SQLDisconnect(hdbc);
      /** 释放连接句柄 **/
      SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
      /** 释放环境句柄 **/
      SQLFreeHandle(SQL_HANDLE_ENV,henv);
      printf("The connection will be closed !\nBye !\n");
    }



Go 语言连接示例

database/sql Go 语言标准库中用于数据库操作的接口,提供了一种通用的数据库操作方式,使得可以以统一的方式连接和操作不同的类型的数据库,而无需关心具体的数据库内部具体实现细节,GoldenDB 提供实现了该标准的 Go 语言驱动。

  • 环境配置
    GoldenDB 定制 Go 驱动。

  • 示例代码

    package main
    import (
      "database/sql"
      "fmt"
      _ "github.com/go-sql-driver/goldenDB"
      "log"
    )
    func main() {
      // 构建连接串
      dsn := "username:password@tcp(ip:port)/xxx"
      // 连接数据库
      db, err := sql.Open("mysql", dsn)
      if err != nil {
        log.Fatal(err)
      }
      defer db.Close()
      // 测试连接
      err = db.Ping()
      if err != nil {
        log.Fatal(err)
      }
      fmt.Println("Connected to the database successfully!")
      // 查询表 "good" 的第一个字段
      rows, err := db.Query("SELECT name FROM good")
      if err != nil {
        log.Fatal(err)
      }
      defer rows.Close()
      // 循环表的行
      for rows.Next() {
        var firstField string
        err := rows.Scan(&firstField)
        if err != nil {
          fmt.Println("读取行失败:", err.Error())
          return
        }
        fmt.Println("First field in table 'good':", firstField)
      }
      err = rows.Err()
      if err != nil {
        log.Fatal(err)
      }
    }


Python 语言连接示例

Python DB-API 是 Python 标准库中定义的数据库接口规范,用于开发数据库连接和操作模块,GoldenDB 提供实现了这一标准的驱动,用户可以遵循相同的操作方式和语法来使用。

  • 环境配置
    GoldenDB 定制 Python 驱动。

  • 示例代码

    # -*- coding: utf-8 -*-
    import pymysql
    # 连接相关参数
    conn = pymysql.connect(
        host='xx.xx.xx.xx',
        port=xxxx,
        user='xxxx',
        password='xxxx',
        database='xxx',
    )
    # 创建游标对象
    cursor = conn.cursor()
    # 执行 SQL 查询语句
    cursor.execute("select * from good")
    # 获取查询结果
    result = cursor.fetchall()
    # 获取第一条参数
    first_column_values = [row[0] for row in result]
    print(first_column_values.pop())
    # 关闭资源
    cursor.close()
    conn.close()

GDBCI连接示例

GDBCI(GoldenDB Call Interface)是与 Oracle OCI 兼容的 GoldenDB C 语言接口调用工具,它支持开发人员使用和 ORACLE OCI 类似的接口连接使用 GoldenDB 数据库。

OCI(Oracle Call Interface) 是 Oracle 的应用程序开发工具,通过 C 语言接口访问 Oracle 数据库,通过接口控制各类 SQL 语句的执行。它支持 SQL 所有的数据定义、数据操作、查询和事务管理等操作,支持 C 和 C++ 的数据类型、调用、语法和语义。

GDBCI 是参照 Oracle OCI 的接口标准,为 GoldenDB 的业务开发人员提供向 Oracle 兼容的相同接口。业务可以不修改代码,直接从 Oracle 切换到 GoldenDB 数据库。

  • 环境配置
    硬件平台:x86_64/aarch64
    操作系统:x86_64 架构下:CentOS/Redhat 系 Linux 发行版 7系列,suse12,海光麒麟。

  • 示例代码

    /*gcc ocitest.c -g -o ocitest  -lgdboci -I/usr/include/gdboci -L/usr/lib64*/
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include "oci.h"
    void checkerr(OCIError *errhp, sword status, const char* filename, int line);
    void query_tables();
    void insert_tables();
    void update_tables();
    void delete_tables(); 
    #define OCI_CHECK_RET(errhp, function) \
      checkerr(errhp, function, __FILE__, __LINE__)
    OCIEnv *envhp;       
    OCISvcCtx *svchp;    
    OCIServer *srvhp;    
    OCISession *authp;   
    OCIStmt *stmthp;    
    OCIDescribe *dschp; 
    OCIError *errhp;     
    OCIDefine *defhp[3]; 
    OCIBind *bidhp[4];   
    sb2 ind[3];          
    int gchpersonid;     
    text gchsex[2];      
    text gchname[10];   
    text gchemail[10];   
    char sql[256];      
    static text* SQL_DROP_TB   = (text*)"drop table if exists person";
    static text* SQL_CREATE_TB = (text*)"create table person(personid number primary key, \
    sex varchar2(256), name varchar2(256), email varchar2(256))distributed by hash(personid)(g1,g2)";
    int main(int argc, char *argv[]) {
        char strServerName[50];
        char strUserName[50];
        char strPassword[50];
        strcpy(strServerName, "xx.xx.xx.xx:xxxx/xxxxx");//ip:port/dbname
        strcpy(strUserName, "xxxxxx");//username
        strcpy(strPassword, "xxxxxx");//password
        OCI_CHECK_RET(errhp, OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL));
        OCI_CHECK_RET(errhp, OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0));
        OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&svchp, OCI_HTYPE_SVCCTX, 0, 0));
        OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, 0, 0));
        OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&authp, OCI_HTYPE_SESSION, 0, 0));
        OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, 0));
        OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&dschp, OCI_HTYPE_DESCRIBE, 0, 0));
        OCI_CHECK_RET(errhp, OCIServerAttach(srvhp, errhp, (text *)strServerName,
                        (sb4)strlen(strServerName), OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIAttrSet(authp, OCI_HTYPE_SESSION, (text *)strUserName,
                  (ub4)strlen(strUserName), OCI_ATTR_USERNAME, errhp));
        OCI_CHECK_RET(errhp, OCIAttrSet(authp, OCI_HTYPE_SESSION, (text *)strPassword,
                  (ub4)strlen(strPassword), OCI_ATTR_PASSWORD, errhp));
        OCI_CHECK_RET(errhp, OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX,
                  (dvoid *)srvhp, (ub4)0, OCI_ATTR_SERVER, errhp));
        OCI_CHECK_RET(errhp, OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid *)authp,
                  0, OCI_ATTR_SESSION, errhp));
        OCI_CHECK_RET(errhp, OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIHandleAlloc(envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, 0));
        OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text*)SQL_DROP_TB, 
              strlen((char *)SQL_DROP_TB), OCI_NTV_SYNTAX, OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_COMMIT_ON_SUCCESS));
        OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, SQL_CREATE_TB, 
              strlen((char *)SQL_CREATE_TB), OCI_NTV_SYNTAX, OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT));
        query_tables();
        insert_tables();
        query_tables();
        update_tables();
        query_tables();
        delete_tables();
        query_tables();
        OCI_CHECK_RET(errhp, OCISessionEnd(svchp, errhp, authp, (ub4)0));
        OCI_CHECK_RET(errhp, OCIServerDetach(srvhp, errhp, OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)dschp, OCI_HTYPE_DESCRIBE));
        OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)errhp, OCI_HTYPE_ERROR));
        OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)authp, OCI_HTYPE_SESSION));
        OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX));
        OCI_CHECK_RET(errhp, OCIHandleFree((dvoid *)srvhp, OCI_HTYPE_SERVER));
        return 0;
    }
    void checkerr(OCIError *errhp, sword status, const char* filename, int line)
    {
      text errbuf[512];
      sb4 errcode = 0;
      switch (status)
      {
      case OCI_SUCCESS:
        break;
      case OCI_SUCCESS_WITH_INFO:
        (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
                          errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
        (void) printf("%s:%d Error - OCI_SUCCESS_WITH_INFO now get is %d:%.*s\n", filename, line, errcode, 512, errbuf);
        break;
      case OCI_NEED_DATA:
        (void) printf("%s:%d Error - OCI_NEED_DATA\n", filename, line);
        break;
      case OCI_NO_DATA:
        (void) printf("%s:%d Error - OCI_NODATA\n", filename, line);
        break;
      case OCI_ERROR:
        (void) OCIErrorGet((dvoid *)errhp, (ub4) 1, (text *) NULL, &errcode,
                          errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
        (void) printf("%s:%d Error - now get is %d:%.*s\n", filename, line, errcode, 
                512, errbuf);
        break;
      case OCI_INVALID_HANDLE:
        (void) printf("%s:%d Error - OCI_INVALID_HANDLE\n", filename, line);
        break;
      case OCI_STILL_EXECUTING:
        (void) printf("%s:%d Error - OCI_STILL_EXECUTE\n", filename, line);
        break;
      case OCI_CONTINUE:
        (void) printf("%s:%d Error - OCI_CONTINUE\n", filename, line);
        break;
      default:
        break;
      }
    }
    void query_tables() 
    {
        sword status = OCI_SUCCESS;
        memset(sql, 0, sizeof(sql));
        strcpy(sql, "select personid, name, email from person");
        OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), 
                    OCI_NTV_SYNTAX, OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[0], errhp, 1, &gchpersonid,
                      sizeof(gchpersonid), SQLT_INT, &ind[0], 0, 0, OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[1], errhp, 2, (ub1 *)gchname,
                      sizeof(gchname), SQLT_STR, &ind[1], 0, 0, OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIDefineByPos(stmthp, &defhp[2], errhp, 3, (ub1 *)gchemail,
                      sizeof(gchemail), SQLT_STR, &ind[2], 0, 0, OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, 0, NULL, NULL,
                      OCI_DEFAULT));
        printf("%-10s%-10s%-10s\n", "PERSONID", "NAME", "EMAIL");
        while ((status = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) == OCI_SUCCESS) {
            printf("%-10d", gchpersonid);
            printf("%-10s", gchname);
            printf("%-10s\n", gchemail);
        }
        if (OCI_NO_DATA != status) {
            printf("error ! error ! error ! err=%d\n", status);
        } else {
            printf("finish fetch data\n\n");
        }
    }
    void insert_tables() 
    {
        memset(sql, 0, sizeof(sql));
        strcpy(sql, "insert into person values(:personid, :sex, :name, :email)");
        OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,
                      OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[0], errhp, (const OraText*)":personid", 9, 
        &gchpersonid, sizeof(gchpersonid), SQLT_INT, NULL, NULL, NULL, 0, NULL, 0));
        OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[1], errhp, (const OraText*)":sex", 4, 
        gchsex, sizeof(gchsex), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));
        OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[2], errhp, (const OraText*)":name", 5, 
        gchname, sizeof(gchname), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));
        OCI_CHECK_RET(errhp, OCIBindByName(stmthp, &bidhp[3], errhp, (const OraText*)":email", 6, 
        gchemail, sizeof(gchemail), SQLT_STR, NULL, NULL, NULL, 0, NULL, 0));
        gchpersonid = 1;
        memset(gchsex, 0, sizeof(gchsex));
        strcpy((char*)gchsex, "M");
        memset(gchname, 0, sizeof(gchname));
        strcpy((char*)gchname, "gchtest");
        memset(gchemail, 0, sizeof(gchemail));
        strcpy((char*)gchemail, "t@163.com");
        
        OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, 
              (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));
        printf("finish insert tables\n");
    }
    void update_tables() 
    {
        memset(sql, 0, sizeof(sql));
        strcpy(sql, "update person set sex='M',name='test',email='test@mail' WHERE personid=1");
        OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,
                      OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, 
              (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));
        printf("finish update tables\n");
    }
    void delete_tables() 
    {
        memset(sql, 0, sizeof(sql));
        strcpy(sql, "delete from person WHERE personid = :personid ");
        OCI_CHECK_RET(errhp, OCIStmtPrepare(stmthp, errhp, (text *)sql, strlen(sql), OCI_NTV_SYNTAX,
                      OCI_DEFAULT));
        gchpersonid = 1;
        OCI_CHECK_RET(errhp, OCIBindByPos(stmthp, &bidhp[0], errhp, 1, &gchpersonid,
                    sizeof(gchpersonid), SQLT_INT, NULL, NULL, NULL, 0, NULL, 0));
        OCI_CHECK_RET(errhp, OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, 
              (CONST OCISnapshot *)0, (OCISnapshot *)0, (ub4)OCI_DEFAULT));
        OCI_CHECK_RET(errhp, OCITransCommit(svchp, errhp, OCI_DEFAULT));
        printf("finish delete tables\n");
    }



ECGDB 嵌入式连接示例

ECGDB 是与 Oracle Pro\*C 、Informix ESQL 等嵌入式预编译器兼容的 GoldenDB 预编译器,提供了不同兼容模式下的特性。

ECGDB 嵌入式 SQL 的程序由 C 语言编写的代码和位于特殊标记的小节中的 SQL 命令混合组成。

要构建该程序,源代码(*.pc *.sc *.ec)首先会通过嵌入式 SQL 预处理器 ecgdb 将源代码转换成一个普通 C 代码(*.c)。然后链接通过 SQL 执行的动态库(libecgdb.so)调用 GoldenDB Client 库中的函数,与 GoldenDB Server 端进行通信,执行 SQL,获取结果集等。

  • 环境配置
    硬件平台:x86_64/aarch64
    操作系统: CentOS/Redhat 系 Linux 发行版 7系列,Kylin V10系列。
    编译器:GCC 4.8

  • 示例代码

    #include <stdio.h>
    #include <stdlib.h>
    #include "ecgdb_types.h"
    #include "ecgdb_method.h"
    int main(void)
    {
        exec sql connect to tcp:goldendb://ip:port/dbname user username  using "password";
        if (sqlca.sqlcode)
        {
          printf ("connect error = %ld,errmsg:%s.\n", sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
          exit (sqlca.sqlcode);
        }
        EXEC SQL BEGIN DECLARE SECTION;
        char v1[100];
        VARCHAR v2[100];
        date v3;
        timestamp v4;
        char v5[100];
        EXEC SQL END DECLARE SECTION;
        strcpy(v1, "2022-06-11");
        strcpy(v2.arr,"2022-06-11 19:22:20");
        v2.len=strlen(v2.arr);
        EXEC SQL INSERT INTO db.tb1 (date_0, datetime_0, timestamp_0) values(:v1, :v2, :v2);
        EXEC SQL SELECT date_0 into :v5 from db.tb1 where date_0="2022-06-11";
        printf("v5=%s\n",v5);
        ECGDB_TYPES_date_today(&v3);
        ECGDB_TYPES_timestamp_current(&v4);
        EXEC SQL INSERT INTO db.tb1 (date_0, datetime_0, timestamp_0) values(:v3, :v4, :v4);
        EXEC SQL SELECT datetime_0 into :v5 from db.tb1 where datetime_0=:v4;
        printf("v5=%s\n",v5);
        EXEC SQL disconnect;
        return 0;
    }
文章转载自吾亦可往,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论