赋值
📄字数 2.2K
👁️阅读量 加载中...
在 PL/SQL 中,赋值操作属于执行部分的核心功能,用于将值传递给变量、记录或集合元素,包括直接赋值(:=)、SELECT INTO 赋值、BULK COLLECT INTO 赋值、游标赋值等。
一、:=操作符赋值
1.1 语法格式
1.2 参数说明
variable
:变量名;expr
:常量或表达式,其值赋给变量。
二、SELECT INTO赋值
2.1 语法格式
2.2 参数说明
target_list
:查询值列表,可含多个值,用逗号分隔,可从表对象等查询,也可直接给常量,其值按顺序一一对应赋给后面的变量;ident_list
:变量名列表,可含多个变量,用逗号分隔。
三、BULK COLLECT INTO赋值
3.1 语法格式
3.2 参数说明
target_list
:查询值列表,可含多个值,用逗号分隔,其值按顺序一一对应赋给后面的变量,可查询出多行结果,批量赋值集合;ident_list
:变量名列表,一般为集合名,可含多个变量,用逗号分隔。
四、游标赋值
4.1 语法格式
4.2 参数说明
cursor_name
:游标名;ident_list
:变量名列表,可含多个变量,用逗号分隔;若为集合,则赋值需使用 BULK COLLECT。
示例
示例1
:=操作符赋值使用演示。
sqlSQL> DECLARE -- 声明时赋值 v_age NUMBER := 25; v_name VARCHAR; BEGIN SEND_MSG(v_name); -- 声明时未赋值则默认为NULL,直到后续赋值 v_name := 'Bob'; SEND_MSG(v_name); --表达式 v_name := v_name||(v_age+1); v_age := 20+30; SEND_MSG(v_name); SEND_MSG(v_age); END; / --输出 NULL Bob Bob26 50
示例2
SELECT INTO 赋值使用演示。
sqlSQL> CREATE TABLE tab_selectinto (name VARCHAR2(100), id INT); SQL> INSERT INTO tab_selectinto (name, id) VALUES ('TABLE1', 1)('TABLE2', 2)('TABLE3', 3); SQL> DECLARE v_id NUMBER ; v_name VARCHAR; BEGIN -- 从表查询字段值,此处仅查一行,若赋多行,则终值为最后一行 select name, id into v_name,v_id from tab_selectinto where id = 1; SEND_MSG(v_name||v_id); -- 直接查询常量值 select 'ABC',5 into v_name,v_id from dual; SEND_MSG(v_name||v_id); END; / --输出 TABLE11 ABC5
示例3
BULK COLLECT INTO 赋值使用演示。
sqlSQL> CREATE TABLE tab_bulkcollectinto (name VARCHAR2(100), id INT); SQL> INSERT INTO tab_bulkcollectinto (name, id) VALUES ('TABLE1', 1)('TABLE2', 2)('TABLE3', 3); SQL> DECLARE v_id NUMBER ; v_name VARCHAR; TYPE ty_tab_bulk IS TABLE OF tab_bulkcollectinto%ROWTYPE; tab_bulk ty_tab_bulk; BEGIN -- 从表查询字段值,此处可有多行结果 SELECT name, id BULK COLLECT INTO tab_bulk FROM tab_bulkcollectinto; FOR i IN 1..tab_bulk.count LOOP SEND_MSG(tab_bulk(i).name||tab_bulk(i).id); ENDLOOP; END; / --输出 TABLE11 TABLE22 TABLE33
示例4
游标赋值使用演示。
sql-- 创建表并插入数据 SQL> CREATE TABLE tab_cur(id INT,name VARCHAR(20)); SQL> INSERT INTO tab_cur VALUES(1,'TEST1')(2,'TEST2')(3,'TEST3'); -- 定义并使用游标 SQL> DECLARE CURSOR cur IS SELECT * FROM tab_cur ; oid INT; oname VARCHAR; BEGIN -- 打开游标 IF NOT cur%ISOPEN THEN OPEN cur; END IF; -- 将游标查询结果第一行赋值给变量 FETCH cur INTO oid, oname; -- 循环获取结果 WHILE cur%FOUND LOOP SEND_MSG('ID IS:' || oid || ' NAME IS:' || oname); -- 循环赋值下一行 FETCH cur INTO oid, oname; END LOOP; -- 打印信息 SEND_MSG('TOTAL FETCH :' || cur%ROWCOUNT || ' ROWS'); CLOSE cur; END; / -- 输出结果 ID IS:1 NAME IS:TEST1 ID IS:2 NAME IS:TEST2 ID IS:3 NAME IS:TEST3 TOTAL FETCH :3 ROWS SQL> DECLARE CURSOR cur IS SELECT * FROM tab_cur; TYPE trow IS TABLE OF cur%ROWTYPE; otab trow; BEGIN OPEN cur; -- 使用bulk子句批量赋值 FETCH cur BULK COLLECT INTO otab; CLOSE cur; FOR i IN 1 .. otab.COUNT LOOP SEND_MSG(otab(i).id || ',' || otab(i).name); END LOOP; END; / -- 输出结果 1,TEST1 2,TEST2 3,TEST3