Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


赋值

📄字数 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

    :=操作符赋值使用演示。

    sql
    SQL> 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 赋值使用演示。

    sql
    SQL> 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 赋值使用演示。

    sql
    SQL> 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