# 匿名块
匿名块（Anonymous Block）一般用于不频繁执行的脚本或不重复进行的活动。它们在一个会话中执行，并不被存储。
#### 语法
```
[ DECLARE [ declaration_statements ] ]
BEGIN execution_statements
END ;
/
```
匿名块（Anonymous Block）语法图如[图1]所示。
图1anonymous_block::=   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309642.png)
- 匿名块程序实施部分，以BEGIN语句开始，以END语句停顿，以一个分号结束。输入"/"按回车执行它。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  最后的结束符"/"必须独占一行，不能直接跟在END后面。
  
- 声明部分包括变量定义、类型、游标定义等。
- 最简单的匿名块不执行任何命令。但一定要在任意实施块里至少有一个语句，甚至是一个NULL语句。
 
#### 示例
下面列举了基本的匿名块程序：
```
--空语句块
gaussdb=# BEGIN
     NULL; 
END;
/
--将信息打印到控制台：
gaussdb=# BEGIN
     dbe_output.print_line('hello world!'); 
END; 
/
hello world!
ANONYMOUS BLOCK EXECUTE
--将变量内容打印到控制台：
gaussdb=# DECLARE      
     my_var VARCHAR2(30);  
BEGIN      
     my_var :='world';     
     dbe_output.print_line('hello'||my_var); 
END; 
/ 
helloworld
ANONYMOUS BLOCK EXECUTE
```
#### 匿名块使用JDBC驱动绑定参数
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- 该功能仅支持ORA兼容性数据库，并且仅支持Oracle风格的匿名块。
- 在全密态加密场景中：
  - 当JDBC连接配置enable_ce=1时不支持匿名块绑定参数。
   
- 当匿名块内定义的变量（包括显示定义的变量或类型）与绑定参数变量（$1、$2...）命名冲突时会报错。
- 声明为自治事务的匿名块不支持绑定参数。
- 匿名块绑定参数个数上限为32767，绑定出参个数上限为1664。
 
前置条件：已连接数据库并且连接对象为conn。
匿名块使用JDBC驱动绑定参数的步骤如下：
1. 调用Connection的prepareCall方法创建调用语句对象cstmt。 
   ```
   CallableStatement cstmt = conn.prepareCall("DECLARE var int; BEGIN var := ?; ? := 50; END;");
   ```
   
   
2. 调用CallableStatement的setInt方法设置参数。 
   ```
   cstmt.setInt(1, 20);
   ```
   
   
3. 调用CallableStatement的registerOutParameter方法注册输出参数。 
   ```
   cstmt.registerOutParameter(2, Types.INTEGER);  //注册out类型的参数，类型为整型。
   ```
   
   
4. 调用CallableStatement的execute方法执行匿名块语句。 
   ```
   cstmt.execute();
   ```
   
   
5. 调用CallableStatement的getInt方法获取out输出参数。 
   ```
   int out = cstmt.getInt(2);
   ```
   
   
6. 调用CallableStatement的close方法关闭调用语句对象cstmt。 
   ```
   cstmt.close();
   ```
   
   
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 507.0.0版本的JDBC连接历史版本的数据库（503.1.0及之后的版本），不支持匿名块使用JDBC驱动绑定参数。历史版本的JDBC（503.1.0及之后的版本）连接507.0.0版本的数据库，支持匿名块使用JDBC驱动绑定入参，不支持匿名块使用JDBC驱动绑定出参。
- 从507.0.0之前版本升级到507.0.0及更高版本时，在升级观察期期间：使用升级后的JDBC连接数据库，支持匿名块使用JDBC驱动绑定参数；使用升级前的JDBC（503.1.0及之后的版本）连接507.0.0版本的数据库，支持匿名块使用JDBC驱动绑定入参，不支持匿名块使用JDBC驱动绑定出参。
 
