
# 执行SQL语句
[type DB](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0262.html)的Exec类方法用于执行不返回结果集的SQL语句，比如CREATE TABLE、INSERT、UPDATE、DELETE等DDL和DML语句。Query类方法用于执行SELECT查询语句。
#### Exec类方法
以下给出Exec方法使用的一个示例（完整示例请参考[示例一](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0260.html#ZH-CN_TOPIC_0000002590200462__section4911826123019)）。
前提条件：已经连接数据库，连接对象为db。
1. 定义包含4个SQL语句的字符串切片。 
   ```
   sqls := []string{
         "DROP TABLE IF EXISTS testExec",  
         "CREATE TABLE testExec(f1 int, f2 varchar(20), f3 number, f4 timestamptz, f5 boolean)",  
         "INSERT INTO testExec VALUES(1, 'abcdefg', 123.3, '2022-02-08 10:30:43.31 +08', true)",  
         "INSERT INTO testExec VALUES(:f1, :f2, :f3, :f4, :f5)",  
   }
   ```
   
   
2. 定义数据切片。 
   ```
   intF1 := []int{2, 3, 4, 5, 6}  
   intF2 := []string{"hello world", "华为", "北京", "nanjing", "研究所"}  
   intF3 := []float64{641.43, 431.54, 5423.52, 665537.63, 6503.1}
   intF4 := []time.Time{
         time.Date(2022, 2, 8, 10, 35, 43, 623431, time.Local),
         time.Date(2022, 2, 10, 19, 11, 54, 353431, time.Local),
         time.Date(2022, 2, 12, 6, 11, 15, 636431, time.Local),
         time.Date(2022, 2, 14, 4, 51, 22, 747653, time.Local),
         time.Date(2022, 2, 16, 13, 45, 55, 674636, time.Local),
   }
   intF5 := []bool{false, true, false, true, true}
   ```
   
   
3. 通过循环结构和range关键字遍历sqls切片，调用Exec方法执行不返回结果集的SQL语句。 
   ```
   for _, s := range sqls {
         if strings.Contains(s, ":f") {  //判断是否参数化SQL。
            for i, _ := range intF1 {  //遍历数据索引。
               _, err := db.Exec(s, intF1[i], intF2[i], intF3[i], intF4[i], intF5[i])   //执行参数化插入。
               if err != nil {
                  log.Fatal(err)
               }
            }
         } else {  // 非参数化SQL。
            _, err = db.Exec(s)  //直接执行DDL。
            if err != nil {
               log.Fatal(err)
            }
         }
   }
   ```
   
   
 
#### Query类方法
调用Exec方法向testExec表插入数据后，可以调用Query类方法执行返回结果集的SQL语句，QueryRow(query string)只返回一个数据行，Query(query string)返回多个数据行。
以下给出Query类方法使用的示例（完整示例请参考[示例一](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0260.html#ZH-CN_TOPIC_0000002590200462__section4911826123019)）。
- 调用QueryRow方法查询单行数据。
  ```
  row := db.QueryRow("SELECT * FROM testExec")
  ```
  

- 调用Query方法执行带条件的查询，返回多个数据行。
  ```
  rows, err := db.Query("SELECT * FROM testExec WHERE f1 > :1", 1) 
  if err != nil {
     log.Fatal(err)
  }
  ```
  
 
