当时方位: 主页 > Linux学院 > 程序设计 > 软件工程 > 运用XL C/C++编译器中供给的数据拜访SQL东西

运用XL C/C++编译器中供给的数据拜访SQL东西

2014-07-26 10:05 来历:IBM 作者:Igor Todorovski 人气指数: 我要谈论

IBM 用于 z/OS 的 XL C/C++ 编译器支撑在 C/C++ 程序中运用嵌入式 SQL 句子。本文假定您运用了 XL C/C++ DB2 协处理器。文中会描绘与 z/OS 上的嵌入式 SQL XL C/C++ 程序中的 SQL 数据交互的各种办法。

运用主变量从 SQL 获取数据

从 SQL 表获取数据的最根本办法是运用主变量(host variables)。主变量答应 C/C++ 程序与 DB2 进行通讯。

示例:主变量

补白:本文中的一切示例都会引证清单 1 中的学生表。

清单 1. 学生表

EXEC SQL CREATE TABLE Students                                              
(
   STUDENTNO INT NOT NULL,
   FIRSTNAME VARCHAR(12) NOT NULL,
   LASTNAME  VARCHAR(15) NOT NULL,
   DEPARTMENT CHAR(3) NOT NULL,
   PHONENUMBER CHAR(7),
   AGE  SMALLINT,
   GPA  FLOAT(5)
);

要从一个 SQL 表获取数据,更新、删去其间的数据或向其间刺进数据,首要有必要在运用程序中声明一个主变量。主变量是一个 C/C++ 变量,一般具有 C/C++ 类型,比方 int、float、char 等。

XL C/C++ DB2 协处理器将主变量数据存储在一个数据库恳求模块 (DBRM) 数据会集,或许分层文件体系 (Hierarchical File System, HFS) 文件中。

声明主变量

主变量是在一个声明节(declare section block)中界说的。声明一个主变量会向协处理器标明能够从 SQL 句子获取数据和向 SQL 供给数据。未在声明节中声明的变量不会被 SQL 句子承受。

EXEC SQL BEGIN DECLARE SECTION;
    int student_number;
EXEC SQL END DECLARE SECTION;

BEGIN 和 END 声明节指令可放在任何有用的 C/C++ 声明的两头,标明该变量是一个主变量。

清单 2 在表 Students 中查询学生编号 “John Doe”。成果被存储在主变量 student_number 中。

清单 2. 对一个主变量的 SQL 查询

EXEC SQL SELECT STUDENTNO
       INTO :student_number
       FROM Students
       WHERE FIRSTNAME = 'John'
       AND LASTNAME = 'Doe';

补白:主变量以 “:” 字符为前缀。这是主变量专一可从 SQL 句子内拜访的办法。没有这个前缀,变量称号会被视为一个字符串。此外,INTO子句用于将 SELECT 句子的成果存储在一个主变量中。

主变量细节

主变量能够是一个规范的类型修饰符、一个数组或一个结构。用于其他变量的相同规模规矩也相同适用于主变量。能够像任何规范 XL C/C++ 变量相同运用主变量,此外,还能够将它用在 SQL 句子中。

其他可承受的主变量类型包括数字、字符、图形、二进制、LOB(大目标)、XML 和 ROWID 主变量。您也能够指定一个成果集、表、LOB 定位符和 LOB 或 XML 文件基准变量。这些主变量更先进,已超出本文的介绍规模。

补白:不是一切 XL C/C++ 数据类型都具有等效的 SQL 类型。例如,typedefs、long long 和寄存器变量无法被声明为主变量。有关其他支撑的类型的详细信息,请参阅 运用编程和 SQL 攻略。

实在的 SQL 数据拜访示例

事例 1. 将一组学生刺进一个表中

回想一下清单 1 中的 Students 表。为了填充该表,您有必要向该表刺进一组学生记载。该表包括以下形式:

STUDENTNO → INT  
FIRSTNAME → VARCHAR(12)
LASTNAME  → VARCHAR(15)
DEPTARTMENT → CHAR(3)
PHONENUMBER → CHAR(7)
AGE → SMALLINT
GPA →  FLOAT(5)

假定一种校园形式会提示输入学生的信息。该程序的声明节界说如下:

EXEC SQL BEGIN DECLARE SECTION;
    int student_number;
    char firstname[13];
    char lastname[16];
    char department[4];
    char phonenumber[8];
    short age;
    float gpa;
EXEC SQL END DECLARE SECTION;

字符字段需求特别注意。SQL 句子仅承受以下字符表明:

  • 单字符格局
  • 空字符停止的字符 (null-terminated character) 格局
  • VARCHAR 结构化格局
  • CLOB(字符大目标)

例如 strcpy(firstname, "John"); 是空字符停止的字符格局的一个比如。

清单 3. 刺进学生

EXEC SQL INSERT INTO Students
VALUES (:student_number, :firstname, :lastname,
        :department, :phonenumber, :age, :gpa);

每个主变量对应于该表中的一个字段,会运用数据填充该字段。

事例 2. 挑选将一条学生记载刺进主结构中

一个典型的用例是挑选一个完好记载。无需为每个字段声明一个主变量,运用程序可运用一个主结构。主结构在原理上相似于 C 结构体,但它封装了一个主变量调集。

关于 Students 表,该结构界说如下所示:

EXEC SQL BEGIN DECLARE SECTION;
struct Student {
    int student_number;
    char firstname[13];
    char lastname[16];
    char department[4];
    char phonenumber[8];
    short age;
    float gpa;
} student_record;
EXEC SQL END DECLARE SECTION;

现在,您能够运用以下代码,在 SELECT 句子中引证 student_record 主结构:

EXEC SQL
  SELECT STUDENTNO, FIRSTNAME, LASTNAME, DEPARTMENT,
         PHONENUMBER, AGE, GPA
    INTO :student_record
    FROM Students
    WHERE STUDENTNO = 001;

student_record 主结构的每个元素将填入与学生编号 001 相关的行的字段值。

事例 3. 获取前 100 名学生 GPA 的列表

现在数据库中已填入了一组学生,您可继续获取一个学生 GPA 列表。

您能够运用以下声明句子将主变量声明为数组:

EXEC SQL BEGIN DECLARE SECTION;
    float gpa_list[100];
EXEC SQL END DECLARE SECTION;

运用游标获取学生 GPA 列表

要在单个查询中获取多行,运用程序有必要运用游标。

游标 指向一个 SELECT 句子所确认的一个行子集。然后,运用程序可从这个子集抓取 恣意数量的行。例如,假定一个查询挑选 1000 个 GPA。这 1000 个 GPA 存储在一个中心成果表中。您能够从这个中心表中一次将恣意数量的行抓取 到一个数组中。

清单 4. 运用游标抓取前 100 个 GPA

EXEC SQL DECLARE STUDENTS_C1 CURSOR WITH ROWSET POSITIONING
  FOR SELECT gpa FROM STUDENTS WHERE 1=1 ORDER BY GPA DESC;
EXEC SQL OPEN STUDENTS_C1;
EXEC SQL FETCH NEXT ROWSET FROM STUDENTS_C1 FOR 100
  ROWS INTO :gpa_list;
EXEC SQL CLOSE STUDENTS_C1;

榜首步声明晰一个名为 STUDENTS_C1 的游标并将它与查询相相关:

 SELECT gpa FROM Students WHERE 1=1 ORDER BY GPA DESC;

此查询的成果存储在一个成果表中。声明游标之后,翻开该游标。这会告知 DB2,它已准备好处理来自 select 句子的榜首行成果。随后,运用fetch 句子从成果表获取数据。这样,您能够操控获取的行数并界说数据存储在何处。最终,游标会封闭。

随后,您能够调用一次 fetch 句子从成果表中获取下 100 个 GPA。

游标的成果将 GPA 数据存储在一个主变量数组中,以便利获取。

for (int i = 0; i < 100; i++)
{
     printf("GPA: %f ", gpa_list[i]);
}

运用指示器变量辨认空记载

虽然查询或许要求获取前 100 个 GPA,但表自身或许包括不到 100 个 GPA。假如 Students 表包括 10 条记载,那么该问询将在第 10 次迭代后 打印意外的值。

为了处理这个问题,DB2 供给了指示器变量。指示器变量包括一个小的整数值,表明相关的主变量的某些信息。

指示器变量可包括以下值:

  • 0 或一个正整数
    挑选的值非空。
  • -1 
    挑选的值为空值。
  • -2 
    因为字符串转化正告,发作数字字符串转化过错或得到空的成果
  • -3
    没有回来值
  • 正整数
    挑选的值被切断,但不是空的。

举例而言,假如指示器变量是一个数组,而且获取了 10 个元素,并将它们存储在一个包括 100 个元素的数组中,那么指示器变量的前 10 个元素会被设置为 0。

要运用指示器变量,首要需求将它与 gpa_list 数组一同声明。指示器变量有必要声明为 short。

清单 5. 初始化指示器变量

EXEC SQL BEGIN DECLARE SECTION;
    float gpa_list[100];
    short gpa_indicator[100];
EXEC SQL END DECLARE SECTION;
for (int i = 0; i<100; i++) {  gpa_indicator[i] = -1; }

gpa_indicator 中的每个元素开始被设置为 -1,这表明主变量数组开始完全是 “空的”。您能够修正

fetch 句子来包括指示器变量:

EXEC SQL FETCH NEXT ROWSET FROM STUDENTS_C1
  FOR 100 ROWS INTO :gpa_list :gpa_indicator;

请注意,在 fetch 句子中,指示器变量 gpa_indicator 在主变量 gpa_list 之后。指示器变量仅可用在主变量之后。

现在,能够修正该循环来运用指示器,而且仅打印成功获取的行(省掉空变量),如下所示:

for (int i = 0; i < 100; i++)
{
    if (gpa_indicator[i] >= 0)
       printf("GPA: %f ", gpa_list[i]);
 }

将主变量作为参数传递

主变量可作为参数传递给用户函数,但在部分函数规模中,主变量被视为非主变量。此外,不能将函数参数放在 DECLARE SECTION 块中。

要处理这个问题,可声明一个部分主变量,为它分配该参数的值(合适简略类型)。

在这些状况下,部分主变量有必要运用主变量参数进行初始化。

清单 6. 传递主变量参数

int selectGPA(int student_number)
{
EXEC SQL BEGIN DECLARE SECTION;
    // Initialize with a new local variable
    int student_number1 = student_number;  
    float gpa;
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT GPA
       INTO :gpa
       FROM STUDENTS
       WHERE :student_number1 = 12121;
}

int main()
{
EXEC SQL BEGIN DECLARE SECTION;
    int student_number;
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT STUDENTNO
       INTO :student_number
       FROM STUDENTS
       WHERE FIRSTNAME = "Bill"
       AND LASTNAME = "Doe";
selectGPA(student_number);
}

一种代替办法是以大局办法声明主变量。

为您引荐: SQL东西 编译器 XL C/C++
咱们感兴趣的内容
小同伴独爱的新闻
小同伴还重视了以下信息
小同伴重视的焦点

小同伴都在重视的抢手词

新服 缤纷活动 帆海世纪 芈月传 暗黑道具 萌乐网 苹果发布会 最新谍照 三国令 剑雨江湖 怎样修炼战骑 页游 怎样修炼同伴 木甲国际 仙侠道2 推黑科技 页游形式 武圣试炼场 街机玩法 蓝月传奇 个人BOSS玩法 哥们网 九阴绝学 仗剑出鞘 全新形式 范伟打天下 全新元神玩法 七大神兵简介 新手攻略 跑腿使命 门派五行 城战礼包 页游界 泥石流 傅园慧 经典网页游戏 耐玩 盘点 玉石攻略 提高人物 大黑 实装特点 神兵攻略 闻名莽荒 莽荒纪 手持神兵 土豪梦 万世 开学清单 财富赚不断 天书国际 大黑游戏 资源战场 ppwan 天问 激战 全国大战 雄霸一方 新增宠物技术 肯定小能手 花千骨 三尾章鱼 风色轨道 双枪手 弑之神 缤纷好礼 惊喜六重连 帮会 中秋福利 克己月饼 九阴真经 玩家 五周年留念 留念银币 名动三界 新服资料片 画江山 勇战妖魔 邪恶势力 上古降魔 老司机玩法 坐骑揭秘 黑科技 竞技场攻略 铁血皇城 披风玩法 书剑恩仇录 配备强化攻略 户外BOSS玩法 全网曝光 赤壁传说 半回合制国 ACT 奇珍商城 热血战歌 传奇瑰宝抽奖 翻开办法 门徒 门徒获取玩法 三大萌宠简介