【问题标题】:How to get a data between vertical bar using PL/SQL如何使用 PL/SQL 在竖线之间获取数据
【发布时间】:2021-09-28 02:54:33
【问题描述】:

表数据:

id   text
1    CLARE|FEMALE|PRESIDENT 
2    SCARLET|FEMALE|MANAGER   
3    FRANK|MALE|ANALYST   
...

我需要做的是获取竖条之间的所有数据并将其放入我的变量中(用于插入另一个表),

这是我尝试过的:

DECLARE
    v_NAME varchar2(100);    
    v_GENDER nvarchar2(100); 
    v_POSITION nvarchar2(100);   

    CURSOR c1
    IS 
        SELECT * 
        FROM DATA
        ORDER BY id;

BEGIN
    FOR x IN c1 LOOP
        v_NAME := REGEXP_SUBSTR(x.TEXT_NOTE, '[^|]+', 1, 1);
        v_GENDER := REGEXP_SUBSTR(x.TEXT_NOTE, '[^|]+', 1, 2);
        v_POSITION := REGEXP_SUBSTR(x.TEXT_NOTE, '[^|]+', 1, 3);
        DBMS_OUTPUT.PUT_LINE(v_NAME ,v_GENDER ,v_POSITION); --test
    END LOOP;
END;

显然我没有这样做,因为它不起作用。有人可以提出解决方案吗?

谢谢!

【问题讨论】:

    标签: sql regex oracle plsql


    【解决方案1】:

    我认为,您的尝试有两点需要解决:

    • 在您的 LOOP 中,您指的是列“x.TEXT_NOTE”,而它应该是表 DATA 中的列“TEXT”。
    • 您需要将输出行 DBMS_OUTPUT.PUT_LINE(v_NAME ,v_GENDER ,v_POSITION) 更改为 DBMS_OUTPUT.PUT_LINE(v_NAME||', '||v_GENDER||', '||v_POSITION)
    CREATE TABLE DATA_TO_SPLIT (id, text) as (
    select 1, 'CLARE|FEMALE|PRESIDENT' from dual union all
    select 2, 'SCARLET|FEMALE|MANAGER' from dual union all
    select 3, 'FRANK|MALE|ANALYST'  from dual
    )
    ;
    
    DECLARE
        v_NAME varchar2(100);    
        v_GENDER nvarchar2(100); 
        v_POSITION nvarchar2(100);   
    
        CURSOR c1
        IS 
            SELECT * 
            FROM DATA_TO_SPLIT
            ORDER BY id;
    
    BEGIN
        FOR x IN c1 LOOP
            v_NAME := REGEXP_SUBSTR(x.TEXT, '[^|]+', 1, 1);
            v_GENDER := REGEXP_SUBSTR(x.TEXT, '[^|]+', 1, 2);
            v_POSITION := REGEXP_SUBSTR(x.TEXT, '[^|]+', 1, 3);
            DBMS_OUTPUT.PUT_LINE(v_NAME||', '||v_GENDER||', '||v_POSITION); --test
        END LOOP;
    END;
    /
    

    【讨论】:

      【解决方案2】:

      string_split 函数应该可以工作。

      SELECT * FROM STRING_SPLIT('CLARE|FEMALE|PRESIDENT', '|')
      

      【讨论】:

      • 嗨,马丁。这是Oracle DB的问题,没有这样的预定义功能。
      【解决方案3】:

      目前的代码确实没有问题,除了

      • 需要将列名从text_note 转换为的错字 text
      • 并为假定表添加插入语句(即 data2) 丢失
      • 顺便说一句,当前DBMS_OUTPUT.PUT_LINEs 语法错误

      所以,使用下面的代码:

      DECLARE
        v_name     VARCHAR2(100);
        v_gender   NVARCHAR2(100);
        v_position NVARCHAR2(100);
      
        CURSOR c1 IS
        SELECT *
          FROM data     
         ORDER BY id;
      
      BEGIN
        FOR x IN c1 
        LOOP
          v_name     := TRIM(REGEXP_SUBSTR(x.text, '[^|]+', 1, 1));
          v_gender   := TRIM(REGEXP_SUBSTR(x.text, '[^|]+', 1, 2));
          v_position := TRIM(REGEXP_SUBSTR(x.text, '[^|]+', 1, 3));
          DBMS_OUTPUT.PUT_LINE(v_name||' - '||v_gender||' - '||v_position); 
          INSERT INTO data2 
          VALUES(v_name,v_gender,v_position);
        END LOOP;
        COMMIT;
      END;
      /
      

      TRIM() 函数代表删除潜在的前导和尾随空格

      Demo

      【讨论】:

      • 我真的完全忘记了 DBMS_OUTPUT.PUT_LINE 的语法,非常感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2016-05-28
      • 2017-10-03
      • 2011-02-20
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多