GaussDB-定义变量

90 阅读3分钟

GaussDB-定义变量

介绍PL/SQL中变量的声明,以及该变量在代码中的作用域。

变量声明

变量声明语法如图1所示。

图1 declare_variable::=

对以上语法格式的解释如下:

  • variable_name,为变量名。
  • type,为变量类型。
  • value,是该变量的初始值(如果不给定初始值,则初始为NULL)。value也可以是表达式。

| ``` gaussdb=# DECLARE emp_id INTEGER := 7788; --定义变量并赋值 BEGIN emp_id := 5*7784; --变量赋值 END; /

| ------------------------------------------------------------------------------------------------------------- |

变量类型除了支持基本类型,还可使用%TYPE和%ROWTYPE去声明一些与其他表字段或表结构本身相关的变量。

**%TYPE属性**

%TYPE主要用于声明某个与其他变量类型(例如,表中某列的类型)相同的变量。假如定义一个my_name变量,它的变量类型与employee的firstname类型相同,可以通过如下定义:

my_name employee.firstname%TYPE --示例 DROP TABLE IF EXISTS employee; CREATE TABLE employee(firstname varchar,secondname varchar); DECLARE my_name employee.firstname%TYPE; BEGIN my_name = 'abc'; DBE_OUTPUT.PRINT_LINE(my_name); END; /


这样定义可以带来两个好处,首先,不用预先知道employee表的firstname的数据类型。其次,即使firstname数据类型有变化,也无需再修改my_name的数据类型。

**%ROWTYPE属性**

%ROWTYPE属性主要用于对一组数据的类型声明,用于存储表中的一行数据,或从游标匹配的结果。假如,需要一组数据,该组数据的字段名称与字段类型都与employee表相同。可以通过如下定义:

my_employee employee%ROWTYPE DROP TABLE IF EXISTS employee; CREATE TABLE employee(firstname varchar,secondname varchar); DECLARE my_employee employee%ROWTYPE; BEGIN my_employee.firstname := 'ab1'; my_employee.secondname := 'ab2'; DBE_OUTPUT.PRINT_LINE(my_employee.firstname); DBE_OUTPUT.PRINT_LINE(my_employee.secondname); END; /


![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b28a9e518534478aac3583909401fe5b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgamVycnl3YW5nMTk4Mw==:q75.awebp?rk3s=f64ab15b&x-expires=1771843436&x-signature=F3jGNoBD3j7BxNqQzJcIfUpkYXs%3D)

-   多个CN的环境下,存储过程中无法声明临时表的%ROWTYPE及%TYPE属性。因为临时表仅在当前session有效,在编译阶段其他CN无法看到当前CN的临时表。故多个CN的环境下,会提示该临时表不存在。
-   %TYPE不支持引用cursor变量的某列类型等。

<!---->

-   不支持view%ROWTYPE、SCHEMA.view%ROWTYPE作为出入参类型。
-   不支持表/视图.column.column%TYPE、SCHEMA.表/视图.column.column%TYPE嵌套1层及以上,作为变量类型和或者出入参类型。

#### 变量作用域

变量的作用域表示变量在代码块中的可访问性和可用性。只有在它的作用域内,变量才有效。

-   变量必须在declare部分声明,即必须建立BEGIN-END块。块结构也强制变量必须先声明后使用,即变量在过程内有不同作用域、不同的生存期。
-   同一变量可以在不同的作用域内定义多次,内层的定义会覆盖外层的定义。
-   在外部块定义的变量,可以在嵌套块中使用。但外部块不能访问嵌套块中的变量。

**示例**

| ```
gaussdb=# DECLARE     emp_id  INTEGER :=7788;  --定义变量并赋值     outer_var  INTEGER :=6688;  --定义变量并赋值 BEGIN     DECLARE                 emp_id INTEGER :=7799;  --定义变量并赋值         inner_var  INTEGER :=6688;  --定义变量并赋值     BEGIN         dbe_output.print_line('inner emp_id ='||emp_id);  --显示值为7799         dbe_output.print_line('outer_var ='||outer_var);  --引用外部块的变量     END;     dbe_output.print_line('outer emp_id ='||emp_id);  --显示值为7788 END; / 
``` |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

更多详情请参考GaussDB 文档中心:<https://doc.hcs.huawei.com/db/zh-cn/gaussdbqlh/24.1.30/productdesc/qlh_03_0001.html>