数据库编程笔记(七) Pro*C: USING和SELECT INTO用法

博客主要介绍了SQL中select into、using和for的用法。指出select into语句不能用动态语句拼接,表名动态时需用游标获取动态sql;还说明了for后对应int型变量,using后是结构数组,并给出了相应的代码示例及错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、select into的用法:
 sprintf(dynamicSql,"select count(*) INTO :b1 from mid_block_info_gsm");
 EXEC SQL EXECUTE IMMEDIATE :dynamicSql;
 if (sqlca.sqlcode != 0)
  {
   sprintf(err_list,"select count(*) from mid_block_info_ Error! Statement : %s,sqlca.sqlcode--[%d] ",dynamicSql,sqlca.sqlcode);
    WriteLogBlock(err_list);
    goto _failed;
  }
  
  对于select into 语句,不能使用动态语句来拼,上述写法中是错误的。
  
 EXEC SQL EXECUTE select count(*) INTO :icount from mid_block_info_gsm;
 if (sqlca.sqlcode != 0)
  {
   sprintf(err_list,"select count(*) from mid_block_info_ Error! Statement : %s,sqlca.sqlcode--[%d] ",dynamicSql,sqlca.sqlcode);
    WriteLogBlock(err_list);
    goto _failed;
  }
  
  对于表名也是动态的,则第二种也不能用,只能用游标获得动态sql,下列用法是正确的
  sprintf(dynamicSql,"select count(*) from %s",t_mid_block_info_user);
 EXEC SQL PREPARE block_sql FROM :dynamicSql;
 EXEC SQL DECLARE block_cur CURSOR for block_sql;
 EXEC SQL OPEN block_cur;
 if (sqlca.sqlcode != 0)
  {
   sprintf(err_list,"select count(*) from mid_block_info_ Error! Statement : %s ",dynamicSql);
    WriteLogBlock(err_list);
    goto _failed;
  } 
 EXEC SQL fetch block_cur into :icount;
   if (sqlca.sqlcode != 0)
  {
   sprintf(err_list,"select count(*) from mid_block_info_ Error! Statement : %s ",dynamicSql);
    WriteLogBlock(err_list);
    goto _failed;
  }
2、using和for的用法;for 后对应int型变量;using后是结构数组  
  strcpy(t_table_name[3],"account_info_gsm");
  uimIdx = 1000;
  sprintf(dynamic_account_gsm,"INSERT INTO %s(service_id,device_number,package_number,oper_flag,from_dept_no,to_dept_no,res_status,local_net,oper_date,memo) VALUES (to_number(:v1),:v2,:v3,:v4,:v5,:v6,:v7,:v8,to_date(:v9,'yyyymmdd hh24:mi:ss'),:v10)",t_table_name[3]
  EXEC SQL PREPARE gsm_account FROM :dynamic_account_gsm;
    EXEC SQL for :uimIdx EXECUTE gsm_account USING :inCdmaAccount; 
    if (sqlca.sqlcode < 0){
            sprintf(ora_code,"插入PPC号台帐入库出错ORA-%d",abs(sqlca.sqlcode));
            OraModule();
            return ;
    }
<think>我们正在讨论如何向DB2数据库表中添加数据。根据用户的问题,他想要知道添加数据的方法。结合站内引用,我们可以总结出以下几种方法: 1. **使用INSERT语句**:这是最常用的方法,通过SQL的INSERT INTO语句向表中插入数据。 2. **使用导入工具**:DB2提供了如LOAD、IMPORT等工具来批量导入数据。 3. **通过应用程序**:如使用C#、Java等编程语言连接DB2并执行插入操作。 由于用户的问题主要集中在SQL操作上,我们将重点介绍INSERT语句。 ### 1. **INSERT语句的基本语法** - 插入单行数据: ```sql INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...); ``` 其中,列的顺序值的顺序必须一一对应。如果省略列名,则必须为表中的每一列都提供值,且顺序与表定义一致[^1][^2]。 - 插入多行数据(DB2支持一次插入多行,但不同版本语法可能不同): ```sql INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1a, 值2a, 值3a, ...), (值1b, 值2b, 值3b, ...), ...; ``` 注意:DB2 9.7以后支持这种多行插入语法。 ### 2. **具体示例** 参考引用[2]中的表结构(`dee_varchar`表)插入语句[^2]: ```sql INSERT INTO db2inst1.dee_varchar (cover_de, hide_de, simulation_erd_de, range_rd_de, simulation_re_de, range_add_de, float_de, cutout_de, cut_de, ip_prefix_de, composite_de, mix_de, disorder_de, zero_de, sm3_de, numerical_de, date_de, cipher_de) VALUES ('HMF', '13569800', 'hmf@yahoo.com', 500, '北京市', 117, 500, '北京安全网络技术有限公司', '测试开发工程师', '10.1.1.196', '13516281600|010-68810345', '13516281600', '123456789', 3811, '张三', 28, '20190520 12:30:45', '密文测试'); ``` - 说明:这里明确指定了列名,然后按照列名的顺序提供对应的值。注意字符串用单引号括起来,数值直接写。 ### 3. **插入时的注意事项** - **主键约束**:如果表有主键(如引用[2]中的`id`列是自增主键),则插入时不能显式指定主键值(除非设置了覆盖选项),因为它是自动生成的[^2]。 - **默认值**:如果某些列设置了默认值(参考引用[3]),则插入时可以省略这些列,DB2会自动使用默认值[^3]。 - 例如,如果某列设置了默认当前时间: ```sql ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT CURRENT DATE; ``` 插入时可以不指定该列,或者使用`DEFAULT`关键字: ```sql INSERT INTO 表名 (列1, 列2) VALUES ('值1', DEFAULT); ``` - **空值处理**:如果某列允许NULL,且没有默认值,插入时若不想提供值,可以显式指定为`NULL`或直接省略该列(省略时DB2会尝试插入NULL,但如果该列不允许NULL则会报错)。 - **数据类型匹配**:插入的值必须与列的数据类型兼容,否则会报错。例如,日期类型需要正确的格式,数值类型不能插入非数字字符串。 ### 4. **批量插入数据的方法** - **方法1:多次执行INSERT语句**(适用于少量数据)。 - **方法2:使用INSERT...SELECT从其他表导入**: ```sql INSERT INTO 目标表 (列1, 列2, ...) SELECT 列1, 列2, ... FROM 源表 WHERE 条件; ``` - **方法3:使用IMPORT或LOAD命令**(适用于大量数据): - IMPORT:从文件中导入数据,支持多种格式(如DEL、IXF等)。 ```sql IMPORT FROM '文件路径' OF DEL INSERT INTO 表名 (列1, 列2, ...); ``` - LOAD:性能更高,但需要管理表状态(如将表置于LOAD PENDING状态),适合大数据量。 ```sql LOAD FROM '文件路径' OF DEL INSERT INTO 表名 (列1, 列2, ...); ``` ### 5. **常见问题及解决方法** - **权限不足**:用户需要拥有表的INSERT权限。 - **自增列问题**:如果自增列(如`GENERATED ALWAYS AS IDENTITY`)插入时指定了值,会报错。解决方法是使用`OVERRIDING USER VALUE`子句或改为`GENERATED BY DEFAULT`[^1]。 - **日期格式问题**:DB2默认日期格式为`YYYY-MM-DD`,如果使用其他格式(如`YYYYMMDD`),需要转换或设置日期格式。 - 使用`TO_DATE`函数转换: ```sql INSERT INTO(日期列) VALUES (TO_DATE('20190520', 'YYYYMMDD')); ``` ### 6. **完整操作流程(命令行示例)** 1. 连接数据库: ``` db2 connect to 数据库名 user 用户名 using 密码 ``` 2. 执行插入: ``` db2 "INSERT INTO 表名 (...) VALUES (...)" ``` 3. 提交事务(如果自动提交未开启): ``` db2 commit ``` 通过以上方法,您可以向DB2表中添加数据。如果遇到具体问题,请提供更多细节。 §§相关问题§§ 1. DB2中如何插入包含特殊字符(如单引号)的数据? 2. DB2批量导入数据时如何跳过错误记录? 3. DB2中如何获取插入数据后的自增ID值? 4. DB2的INSERT语句与Oracle、MySQL有何区别? [^1]: DB2数据库常用sql整理。 [^2]: DB2数据库,时间类型插入数据。 [^3]: DB2数据库添加 更改字段。</think>### DB2数据库表添加数据的方法 在DB2数据库中,向表中添加数据主要通过SQL的`INSERT`语句实现。以下是详细的操作方法注意事项,结合DB2特性进行说明: --- #### 1. **基本INSERT语法** ```sql INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...); ``` - **表名**:目标表名称(如`db2inst1.dee_varchar`) - **列名**:指定要插入数据的列(可省略,但需按表结构顺序提供所有值) - **VALUES**:提供对应列的数值,字符串需用单引号包裹 **示例**(参考引用[2]): ```sql INSERT INTO db2inst1.dee_varchar ( cover_de, hide_de, simulation_erd_de, range_rd_de, simulation_re_de, range_add_de, float_de, cutout_de ) VALUES ( 'HMF', '13569800', 'hmf@yahoo.com', 500, '北京市', 117, 500, '北京安全网络技术有限公司' ); ``` > 注:自增主键`id`列(`GENERATED ALWAYS AS IDENTITY`)会自动生成值,无需手动插入[^2]。 --- #### 2. **批量插入数据** - **多行插入**(DB2 9.7+支持): ```sql INSERT INTO 表名 (列1, 列2) VALUES ('值A1', '值A2'), ('值B1', '值B2'), ('值C1', '值C2'); ``` - **从其他表导入**: ```sql INSERT INTO 目标表 (列1, 列2) SELECT 源列1, 源列2 FROM 源表 WHERE 条件; ``` --- #### 3. **特殊值处理技巧** - **插入当前时间**(参考引用[3]): ```sql -- 插入当前日期 INSERT INTO 表名 (date_col) VALUES (CURRENT DATE); -- 插入当前时间戳 INSERT INTO 表名 (timestamp_col) VALUES (CURRENT TIMESTAMP); ``` - **使用默认值**: ```sql -- 建表时设置默认值(参考引用[3]) CREATE TABLE 表名 ( create_time TIMESTAMP NOT NULL WITH DEFAULT CURRENT TIMESTAMP ); -- 插入时调用默认值 INSERT INTO 表名 (列1, 列2) VALUES ('数据', DEFAULT); ``` --- #### 4. **注意事项** 1. **数据类型匹配**: - 字符串用单引号:`'文本'` - 数值直接写:`500` - 日期需规范格式:`'2023-06-15'`或使用`TO_DATE()` 2. **约束处理**: - 主键/唯一键冲突会报错(`SQL0803N`) - 非空列必须提供值 3. **性能优化**: - 批量插入时使用`COMMIT`分批提交(每1000行提交一次) - 大容量数据建议用`LOAD`命令替代`INSERT` --- #### 5. **完整操作示例** ```sql -- 连接数据库 db2 connect to 数据库名 user 用户名 using 密码 -- 插入单条数据 db2 "INSERT INTO employees (id, name, dept, salary) VALUES (101, '张三', '研发部', 15000)" -- 插入带默认值的数据 db2 "INSERT INTO orders (order_id, product, create_time) VALUES (2001, '笔记本电脑', DEFAULT)" -- 提交事务 db2 commit ``` > 提示:可通过`SELECT * FROM 表名 WHERE 条件`验证插入结果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值