应用开发示例
本节提供不同编程语言连接到 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 数据库密码。 resource mapper 文件地址, 文中示例 GoodMapper.xml 在 resources 目录下。 GoodMapper.xml
MyBatis中,Mapper是一个用于将SQL操作与Java对象进行映射的接口或XML文件,GoodMapper.xml具体写法如下:核心参数说明
参数 描述 namespace mapper 文件命名空间。 id namespace + 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 数据库用户名。 resource hibernate 对象关系映射文件地址,文中示例 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;
}




