在PLSQL中获取变量列

时间:2016-01-25 12:50:08

标签: sql oracle plsql

以下是PLSQL代码的示例,其中我使用select查询将两列的值提取为两个变量。

execute immediate 'select c1,c2 from tableName where id = 123' into c1_val,c2_val;

我想将上面的代码设为通用的,其中列名将作为输入给出。像

这样的东西
execute immediate 'select '||commaSeparatedColumns||' from tableName where id = 123' into <someThing>

在这里,由于列数不固定,我在pl sql变量中存储值时遇到问题。

有人可以建议如何实现这个目标吗?

2 个答案:

答案 0 :(得分:3)

您无法使用execute immediate执行此操作,您需要使用dbms_sql包。

这是一个很好的示例,您可以从 - Tom Kyte's print_table script开始,它可以运行任何select语句(包含任意数量的列)并以垂直格式打印结果。

答案 1 :(得分:1)

你可以尝试类似的东西;它有点棘手,基于一种嵌套的动态sql:

create table test_fetch_table ( id number,c1 number,c2 number,c3 number,c4 number,c5 number,c6 number,c7 number,c8 number,c9 number,c10 number) 

insert into test_fetch_table values ( 123, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 

create or replace procedure testFetch (commaSeparatedColumns IN varchar2) is
    c1_val  number;
    c2_val  number;
    c3_val  number;
    c4_val  number;
    c5_val  number;
    c6_val  number;
    c7_val  number;
    c8_val  number;
    c9_val  number;
    c10_val number;
    commaSeparatedVariables varchar2(1000);
    vSQL                    varchar2(1000);
    vPLSQL                  varchar2(1000);
begin
    commaSeparatedVariables := replace (commaSeparatedColumns, ',', '_val,') || '_val';
    vSQL := 'select ' || commaSeparatedColumns || ' into ' || commaSeparatedVariables || ' from test_fetch_table where id=123;';
    vPLSQL := 'declare
                    c1_val  number;
                    c2_val  number;
                    c3_val  number;
                    c4_val  number;
                    c5_val  number;
                    c6_val  number;         
                    c7_val  number;
                    c8_val  number;
                    c9_val  number;
                    c10_val number;    
                begin '
               || vSQL ||               
               ':1  := c1_val;
                :2  := c2_val;
                :3  := c3_val;
                :4  := c4_val;
                :5  := c5_val;
                :6  := c6_val;         
                :7  := c7_val;
                :8  := c8_val;
                :9  := c9_val;
                :10 := c10_val;
                end;';
    execute immediate vPLSQL using OUT c1_val,
                                   OUT c2_val,
                                   OUT c3_val,
                                   OUT c4_val,
                                   OUT c5_val,
                                   OUT c6_val,
                                   OUT c7_val,
                                   OUT c8_val,
                                   OUT c9_val,
                                   OUT c10_val;
    dbms_output.put_line(
             c1_val || ',' ||
             c2_val || ',' ||
             c3_val || ',' ||
             c4_val || ',' ||
             c5_val || ',' ||
             c6_val || ',' ||
             c7_val || ',' ||
             c8_val || ',' ||
             c9_val || ',' ||
             c10_val );       
end;

begin
  testFetch('c1,c2,c3,c4');
end;

通过这种方式,您可以定义一种包含10个字段的界面,但只能根据commaSeparatedColumns

获取所需的字段