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

PostgreSQL特性矩阵解析系列22之SQLDA support for ECPG

604

引言

一个嵌入式 SQL 程序由一种普通编程语言编写的代码(在这里是 C)和位于特殊标记的小节中的 SQL 命令混合组成。要构建该程序,源代码(*.pgc
)首先会通过嵌入式 SQL 预处理器,它会将源代码转换成一个普通 C 程序(*.c
),并且后来它能够被一个 C 编译器所处理。转换过的 ECPG 应用会通过嵌入式 SQL 库(ecpglib)调用 libpq 库中的函数,并且与 PostgreSQL 服务器使用普通的前端/后端协议通信。

参考

    我们可以使用下列语句连接到一个数据库:
    EXEC SQL CONNECT TO target [AS connection-name] [USER user-name];

    target可以用下列方法指定:

    dbname[@hostname][:port]
    tcp:postgresql://hostname[:port][/dbname][?options]
    unix:postgresql://hostname[:port][/dbname][?options]
    一个包含上述形式之一的 SQL 字符串
    到一个包含上述形式之一(参见例子)的字符变量的引用
    DEFAULT

    EXEC SQL CONNECT TO mydb@sql.mydomain.com;

    EXEC SQL CONNECT TO unix:postgresql://sql.mydomain.com/mydb AS myconnection USER john;

    EXEC SQL BEGIN DECLARE SECTION;
    const char *target = "mydb@sql.mydomain.com";
    const char *user = "john";
    const char *passwd = "secret";
    EXEC SQL END DECLARE SECTION;
    ...
    EXEC SQL CONNECT TO :target USER :user USING :passwd;
    /* 或者 EXEC SQL CONNECT TO :target USER :user/:passwd; */

    实验

      建表语句测试表
      create database test;
      create test (id int);

      test.pgc #扩展名.pgc

      ##内容##
      #include <stdio.h>
      #include <stdlib.h>

      int main ( void )
      {
      EXEC SQL BEGIN DECLARE SECTION;
      char *target="test@127.0.0.1:5432";
      char *user="postgres";
      char *passwd="123456";

      int pid;

      EXEC SQL END DECLARE SECTION;

      exec sql connect to :target user :user using :passwd;

      if (sqlca.sqlcode == 0 )
      printf("connect sucesess ... \n");
      else {
      printf("connect faild ... ... \n");
      exit(0);
      }

      printf("add ... \n");
      exec sql begin;
      exec sql insert into test(id) values(1);
      exec sql commit;
      printf("query ... \n");

      exec sql select id into :pid from test;
      printf(" pid = %d \n",pid);
      }

      Makefile文件内容

      TARGET = test  #pgc文件名
      CC = gcc
      CFLAGS = -g -O2 -c -fPIC -DDEBUG
      ECPG = ecpg -c
      AR = ar -rcvl
      RANLIB = ranlib
      INCLDIR = -I-I/opt/pgsql124/include/ # 改成当前环境实际路径 libecpg.so.6
      LIBDIR = -L. -L$(HOME)/lib -L/opt/pgsql124/lib/ # 改成当前环境实际路径 libpgtypes.so.3
      LIBS = -lecpg
      OBJ =
      all:$(TARGET)
      clean:
      rm -f $(TARGET) *.o core.* .*.swp
      test:test.o #pgc文件名
        $(CC-o $@ $^ $(LIBDIR) $(LIBS)
      # ################################################################################
      .SUFFIXES:
      .SUFFIXES:.c .o .pgc
      .pgc.c:
      $(ECPG) $(INCLUDE) $<
      .c.o:
        $(CC) $(CFLAGS) $(INCLDIR) $<

      参考

      http://postgres.cn/docs/13/ecpg-connect.html

      文章转载自CP的PostgreSQL厨房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论