Hello, ESQL/C World!

Posted on 3月 20th, 2012 by cx20

ESQL/C

ESQL は埋め込み SQL(Embedded SQL)とも呼ばれ、手続型プログラミング言語(ホスト言語)に SQL を埋め込む方式のことを言う。埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。
ESQL/C は、ホスト言語に C言語を対象としており、SQL Server の他、いくつかの DBMS で採用している。なお、Oracle Database 用の 埋め込みSQL は Pro*C と呼ばれる。
SQL Server 用の ESQL/C では、ESQL プリプロセッサにより「.sqc」ファイルから「*.c」ファイルを生成する。

ソースコード(ESQL)

#include <stdio.h>
 
int main( int argc, char* argv[] )
{
    EXEC SQL BEGIN DECLARE SECTION;
    char szServerDatabase[] = "(local).pubs";
    char szLoginPassword[] = "sa.P@ssW0rd";
    char szCommand[] = "SELECT 'Hello, ESQL/C World!' AS Message";
    char message[32] = { 0 };
    EXEC SQL END DECLARE SECTION;
    EXEC SQL CONNECT TO :szServerDatabase USER :szLoginPassword;
    EXEC SQL DECLARE C1 CURSOR FOR stmt;
    EXEC SQL PREPARE stmt FROM :szCommand;
    EXEC SQL OPEN C1;
    while ( SQLCODE == 0 )
    {
        EXEC SQL FETCH C1 INTO :message;
        if ( SQLCODE == 0 )
        {
            printf( "Messagen" );
            printf( "--------------------n" );
            printf( "%sn", message );
        }
    }
    EXEC SQL CLOSE C1;
    EXEC SQL DISCONNECT ALL;
    return 0;
}

上記コードは、ESQL プリプロセッサにより、以下の C言語のコードが生成される。

ソースコード(C言語)

/* ===== hello.c =====*/
/* ===== NT doesn't need the following... */
#ifndef WIN32
#define WIN32
#endif
#define _loadds
#define _SQLPREP_
#include <sqlca.h>
#include <sqlda.h>
#include <string.h>
#define SQLLENMAX(x)      ( ((x) > 32767) ? 32767 : (x) )
short ESQLAPI _loadds sqlaaloc(
	unsigned short usSqlDaId,
	unsigned short sqld,
	unsigned short stmt_id,
	void far *spare);
short ESQLAPI _loadds sqlxcall(
	unsigned short usCallType,
	unsigned short usSection,
	unsigned short usSqldaInId,
	unsigned short usSqlDaOutId,
	unsigned short usSqlTextLen,
	char far *lpszSQLText);
short ESQLAPI _loadds sqlacall(
	unsigned short usCallType,
	unsigned short usSection,
	unsigned short usSqldaInId,
	unsigned short usSqlDaOutId,
	void far *spare);
short ESQLAPI _loadds sqladloc(
	unsigned short usSqldaInId,
	void far *spare);
short ESQLAPI _loadds sqlasets(
	unsigned short cbSqlText,
	void far *lpvSqlText,
	void far *spare);
short ESQLAPI _loadds sqlasetv(
	unsigned short usSqldaInId,
	unsigned short sqlvar_index,
	unsigned short sqltype,
	unsigned short sqllen,
	void far *sqldata,
	void far *sqlind,
	void far *spare);
short ESQLAPI _loadds sqlastop(
	void far *spare);
short ESQLAPI _loadds sqlastrt(
	void far *pid,
	void far *spare,
	void far *sqlca);
short ESQLAPI _loadds sqlausda(
	unsigned short sqldaId,
	void far *lpvSqlDa,
	void far *spare);
extern struct tag_sqlca far sql_sqlca;
extern struct tag_sqlca far *sqlca;
struct sqla_program_id2 {unsigned short length;unsigned short rp_rel_num;unsigned short db_rel_num;unsigned short bf_rel_num;unsigned char  sqluser[30];unsigned char  sqlusername[30];
unsigned char  planname[256];unsigned char  contoken[8];unsigned char  buffer[8];};static struct sqla_program_id2 program_id =		{340,2,0,0,"                              ","","hello","AAAvBYD0","        "};
static void far* pid = &program_id;
#line 1 "hello.sqc"
#line 2 "hello.sqc"
int main( int argc, char* argv[] )
{
#line 5
/*
EXEC SQL BEGIN DECLARE SECTION;
*/
#line 5
    char szServerDatabase[] = "(local).pubs";
    char szLoginPassword[] = "sa.P@ssW0rd";
    char szCommand[] = "SELECT 'Hello, ESQL/C World!' AS Message";
    char message[32] = { 0 };
#line 10
/*
EXEC SQL END DECLARE SECTION;
*/
#line 10
#line 11
/*
EXEC SQL CONNECT TO :szServerDatabase USER :szLoginPassword;
*/
#line 11
#line 11
{
#line 11
	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
#line 11
	sqlaaloc(2, 2, 1, (void far *)0);
#line 11
	sqlasetv(2, 0, 462, (short) SQLLENMAX(sizeof(szServerDatabase)), (void far *)szServerDatabase, (void far *)0, (void far *)0L);
#line 11
	sqlasetv(2, 1, 462, (short) SQLLENMAX(sizeof(szLoginPassword)), (void far *)szLoginPassword, (void far *)0, (void far *)0L);
#line 11
	sqlxcall(30, 1, 2, 0, 55, (char far *)"  CONNECT TO @p1                USER @p2               ");
#line 11
	SQLCODE = sqlca->sqlcode;
#line 11
	sqlastop((void far *)0L);
#line 11
}
#line 12
#line 12
/*
EXEC SQL DECLARE C1 CURSOR FOR stmt;
*/
#line 12
#line 13
/*
EXEC SQL PREPARE stmt FROM :szCommand;
*/
#line 13
#line 13
{
#line 13
	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
#line 13
	sqlasets((unsigned short)strlen(szCommand), (void far *)szCommand, (void *)0L);
#line 13
	sqlacall(27, 2, 0, 0, 0L);
#line 13
	SQLCODE = sqlca->sqlcode;
#line 13
	sqlastop((void far *)0L);
#line 13
}
#line 14
#line 14
/*
EXEC SQL OPEN C1;
*/
#line 14
#line 14
{
#line 14
	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
#line 14
	sqlxcall(110, 2, 0, 0, 18, (char far *)"/* C1 2 nohold */ ");
#line 14
	SQLCODE = sqlca->sqlcode;
#line 14
	sqlastop((void far *)0L);
#line 14
}
#line 15
#line 14
{
#line 14
	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
#line 14
	sqlacall(26, 2, 0, 0, 0L);
#line 14
	SQLCODE = sqlca->sqlcode;
#line 14
	sqlastop((void far *)0L);
#line 14
}
#line 15
    while ( SQLCODE == 0 )
    {
#line 17
/*
EXEC SQL FETCH C1 INTO :message;
*/
#line 17
#line 17
{
#line 17
	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
#line 17
	sqlaaloc(1, 1, 2, (void far *)0);
#line 17
	sqlasetv(1, 0, 462,(short) SQLLENMAX(sizeof(message)),(void far *)&message, (void far *)0,0L);
#line 17
	sqlxcall(25, 2, 0, 1, 26, (char far *)"  FETCH C1 INTO :         ");
#line 17
	SQLCODE = sqlca->sqlcode;
#line 17
	sqlastop((void far *)0L);
#line 17
}
#line 18
        if ( SQLCODE == 0 )
        {
            printf( "Messagen" );
            printf( "--------------------n" );
            printf( "%sn", message );
        }
    }
#line 25
/*
EXEC SQL CLOSE C1;
*/
#line 25
#line 25
{
#line 25
	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
#line 25
	sqlxcall(20, 2, 0, 0, 11, (char far *)"  CLOSE C1 ");
#line 25
	SQLCODE = sqlca->sqlcode;
#line 25
	sqlastop((void far *)0L);
#line 25
}
#line 26
#line 26
/*
EXEC SQL DISCONNECT ALL;
*/
#line 26
#line 26
{
#line 26
	sqlastrt((void far *)pid, (void far *)0, (struct tag_sqlca far *)sqlca);
#line 26
	sqlxcall(36, 3, 0, 0, 17, (char far *)"  DISCONNECT ALL ");
#line 26
	SQLCODE = sqlca->sqlcode;
#line 26
	sqlastop((void far *)0L);
#line 26
}
#line 27
    return 0;
}
long SQLCODE;

コンパイル&リンク方法(Visual C++)

C:¥> nsqlprep hello.sqc
C:¥> cl hello.c /link sqlakw32.lib caw32.lib

実行結果

Message
--------------------
Hello, ESQL/C World!

Tags:

Categories: C言語, ESQL/C, library, SQL, SQL Server

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

WP-SpamFree by Pole Position Marketing