Kadb中的ecpg编程

Kadb中的ecpg编程

测试程序:
#include "stdio.h"

#include "stdlib.h"

#include "string.h"

// 相当于高级程序语言的全局变量定义

EXEC SQL BEGIN DECLARE SECTION; // 主变量声明开始

const char* target1 = "postgres@192.168.85.155:5432"; // 数据库1

const char* user1 = "postgres";

const char* passwd1 = "123456";

const char* target2 = "test@192.168.85.155:5432"; // 数据库2

const char* user2 = "postgres";

const char* passwd2 = "123456";

int rows = 0; // 表行数

char sno[10]; // s表的四个属性(s表是自定义的)

char sname[20];

int status;

char city[20];

EXEC SQL END DECLARE SECTION; // 主变量声明结束

int main() {

EXEC SQL WHENEVER SQLERROR SQLPRINT; // error 时输出错误信息

// 连接至数据库1

EXEC SQL CONNECT TO :target1 USER :user1 USING :passwd1;

printf("\n已连接%s\n", target1);

EXEC SQL SET AUTOCOMMIT TO ON;

EXEC SQL drop database if exists test; // 删除 spj 数据库

EXEC SQL create database test; // 创建 spj 数据库

// 断开数据库1

EXEC SQL DISCONNECT CURRENT; // 这个不写也能运行,不知道有没有风险

printf("\n已断开%s\n", target1);

// 连接至数据库2

EXEC SQL CONNECT TO :target2 USER :user2 USING :passwd2;

printf("\n已连接%s\n", target2);

// 下面五条exec sql,建表及插入

EXEC SQL drop table if exists s;

EXEC SQL CREATE TABLE IF NOT EXISTS s(sno char(10) primary key, sname char(20) unique, status int, city char(20));

EXEC SQL insert into s(sno, sname, status, city) values('s1', 'APEX LEGEND', 114514, 'Wuhan');

EXEC SQL insert into s(sno, sname, status, city) values('s2', 'DEVIL MAY CRY5', 616161, 'Wuhan');

EXEC SQL insert into s(sno, sname, status, city) values('s3', 'WARFRAME', 123456, 'Wuhan');

// 写入中文,数据库内是utf8,控制台输出的是gbk,会乱码

EXEC SQL END; // 结束事务块

EXEC SQL BEGIN; // BEGIN 事务块,DECLARE只能在事务块中使用

// 定义游标,相当于每次读表的一行

EXEC SQL DECLARE iterator CURSOR FOR

select sno, sname, status, city

from s;

EXEC SQL OPEN iterator; // 打开游标

EXEC SQL select count(*) into :rows from s; // 获取行数,只有主变量能被sql赋值

int flag = 0;

while (rows --) {

EXEC SQL fetch iterator into :sno, :sname, :status, :city; // fetch 获取一行元组

if (flag ++ == 0) { // 第一次把列名输出

printf("\n%-10s %-20s %-10s %-20s \n", "sno", "sname", "status", "city");

}

printf("%-10s %-20s %-10d %-20s \n", sno, sname, status, city);

}

EXEC SQL CLOSE iterator; // 关闭游标

EXEC SQL END; // 结束事务块

EXEC SQL DISCONNECT CURRENT; // 断开数据库2

printf("\n已断开%s\n", target2);

return 0;

}

编译:
/usr/local/pgsql/bin/ecpg proc.pgc

cc -I/usr/local/pgsql/include -c proc.c

cc -o proc proc.o -L/usr/local/pgsql/lib --lecpg

运行:
-bash-4.2$ ./proc

已连接postgres@192.168.85.155:5432

已断开postgres@192.168.85.155:5432

已连接test@192.168.85.155:5432

SQL error: there is already a transaction in progress

sno sname status city

s1 APEX LEGEND 114514 Wuhan s1

s2 DEVIL MAY CRY5 616161 Wuhan s2

s3 WARFRAME 123456 Wuhan s3

已断开test@192.168.85.155:5432

相关推荐
格调UI成品2 小时前
预警系统安全体系构建:数据加密、权限分级与误报过滤方案
大数据·运维·网络·数据库·安全·预警
心平愈三千疾6 小时前
通俗理解JVM细节-面试篇
java·jvm·数据库·面试
我科绝伦(Huanhuan Zhou)9 天前
Oracle|Oracle SQL*Plus 配置上下翻页功能
数据库·sql·oracle
Cachel wood9 天前
Spark教程6:Spark 底层执行原理详解
大数据·数据库·分布式·计算机网络·spark
java—大象9 天前
基于java SSM的房屋租赁系统设计和实现
java·开发语言·数据库·spring boot·layui·mybatis
Mutig_s9 天前
Spring Boot动态数据源切换:优雅实现多数据源管理
java·数据库·spring boot·后端·mybatis
Python小老六9 天前
单片机测ntc热敏电阻的几种方法(软件)
数据库·单片机·嵌入式硬件
矿渣渣9 天前
SQLite3 在嵌入式系统中的应用指南
数据库·sqlite·嵌入式实时数据库
@昵称不存在9 天前
Python csv 模块
开发语言·数据库·python
程序猿小D9 天前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+Vue实现的校园二手交易平台管理系统,推荐!
java·数据库·mysql·spring·vue·毕业设计·校园二手交易平台