2016-10-28 19 views
0

使用PL/SQL,我怎么转换这样的名称 - 值对的表...PL/SQL名称 - 值对转换为单行表

Name  Value 
--------- ------- 
Firstname Bob 
Surname  Smith 
Address1 101 High Street 
City  London 
Country  UK 

...以单行表是这样的:

Firstname Surname Address1  City Country 
--------- ------- --------------- ------ ------- 
Bob  Smith 101 High Street London UK 

其实我需要的是名称 - 值对作为单列表格转换为SYS_REFCURSOR上述

完整的故事是: 我收到数据作为这样一个单一的字符串(名字;鲍勃;姓;史密斯地址1; 101高街;城市;伦敦;国家;英国),我需要的是将其转换为SYS_REFCURSOR

我开始创建类型

TYPE order_type IS TABLE OF VARCHAR2(255) INDEX BY VARCHAR2(255); 
neworder order_type; 

到目前为止,我管理与名称 - 值对

这是一个好的方法来做到这一点?

+3

你需要转动;这取决于你使用的是哪个版本的Oracle。但是为什么你想使用PL/SQL呢? –

+0

我刚刚更新了我的问题@Alex希望它能让事情更清晰 –

+0

什么是您的oracle版本? – Kacper

回答

1
create table t1 (name varchar2(20), value varchar2(20)); 
insert into t1 values('Firstname','Bob'); 
insert into t1 values('Surname','Smith'); 
insert into t1 values('Address1','101 High Street'); 
insert into t1 values('City','London'); 
insert into t1 values('Country','UK'); 

select * from t1 pivot (max(value) for (name) in ('Firstname' as firstname, 'Surname' as surname, 'Address1' as address, 'City' as city, 'Country' as country)); 

这样的SQL将列数据转换为一行。

如果您将数据作为固定订单的分隔字符串,我将仅使用instr('Firstname;Bob;Surname;Smith;Address1;101 High Street;City;London;Country;UK',';',1)substring函数的组合来解析它。

喜欢的东西:

declare 
text varchar2(200) := 'Firstname;Bob;Surname;Smith;Address1;101 High Street;City;London;Country;UK'; 
firstname varchar2(40); 
surname varchar2(40); 
address varchar2(40); 
city varchar2(40); 
country varchar2(40); 
begin 
firstname := substr(text,instr(text,';',1) + 1,instr(text,';',2) - instr(text,';',1)); 
surname := substr(text,instr(text,';',3) + 1, instr(text,';',4) - instr(text,';',3)); 
.... 
end; 
+0

我收到的字符串的值是可变的,所以我不能只定义姓,名,...等 –

+1

@ Data-Base ok。如果你知道这组参数,你可以尝试识别它并解析。如果参数是动态设置,你需要去解析对,然后一些动态的关键 – Kacper

+0

我想我解决了它... –

0

遇到了一个有趣的工具我不知道。 dbms_utility.comma_to_table。 http://mohsoracle.blogspot.com/2010/04/oracle-breaking-comma-separated-string.html

所以,如果你想用它来从分隔字符串返回一个sys ref游标,可能类似。

/* Formatted on 10/28/2016 9:42:52 AM (QP5 v5.256.13226.35510) */ 
CREATE OR REPLACE PROCEDURE myproc (v_cur OUT SYS_REFCURSOR) 
IS 
    lv_Str_List VARCHAR2 (1000) 
     := 'Firstname, Bob, Surname, Smith, Address, 101 High Street, City, London, Country, UK'; 
    lb_cnt  BINARY_INTEGER; 
    la_Tab_Str DBMS_UTILITY.UNCL_ARRAY; 
BEGIN 
    lv_Str_List := '"' || REPLACE (lv_Str_List, ',', '","') || '"'; 
    -- parse the string into comma separated table 
    DBMS_UTILITY.COMMA_TO_TABLE (lv_Str_List, lb_cnt, la_Tab_Str); 

    FOR i IN 1 .. la_Tab_Str.COUNT 
    LOOP 
     -- display substring 
     DBMS_OUTPUT.PUT_LINE (TRIM (la_Tab_Str (i))); 
    END LOOP; 

    OPEN v_cur FOR 
     SELECT * 
     FROM (SELECT REPLACE (TRIM (la_Tab_Str (2)), '"', '') AS Firstname, 
        REPLACE (TRIM (la_Tab_Str (4)), '"', '') AS Surname, 
        REPLACE (TRIM (la_Tab_Str (6)), '"', '') AS Address, 
        REPLACE (TRIM (la_Tab_Str (8)), '"', '') AS City, 
        REPLACE (TRIM (la_Tab_Str (10)), '"', '') AS Country 
       FROM DUAL) t; 
END; 

我硬编码的字符串,但它可以作为一个变量进来,然后用逗号代替你的分号。

当我在蟾蜍运行以下测试它。

DECLARE 
    V_CUR SYS_REFCURSOR; 

BEGIN 
    V_CUR := NULL; 

    MYPROC (V_CUR); 
    :to_grid := V_CUR; 
    COMMIT; 
END; 

FIRSTNAME SURNAME ADDRESS   CITY  COUNTRY 
Bob  Smith 101 High Street London UK