2016-01-25 2 views
0

Ниже приведен пример кода PLSQL, в котором я использую select query для извлечения значений двух столбцов на две переменные.Получение столбцов переменной в PLSQL

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> 

Здесь я столкнулся с проблемой хранения значений в пл SQL переменных, как число столбцов не являются фиксированными.

Может кто-нибудь PLZ предложить, как достичь этого?

+0

ли они limmited? или они могут быть бесконечным числом столбцов – sagi

+0

ограничено .. не более 10 .. – darshanUser

+0

Ну, я не уверен, есть ли лучший способ (возможно, есть), но вы можете использовать переменную count, а затем использовать CASE в переменных > CASE WHEN COUNT = 2 then c1_val, c2_val, else CASE WHEN COUNT = 3 ...... – sagi

ответ

3

Вы не можете сделать это с помощью execute immediate, вам нужно будет использовать пакет dbms_sql.

Вот хороший пример, который можно начать с - Tom Kyte's print_table script, который может запускать любой оператор select (с любым количеством столбцов) и печатать результаты в вертикальном формате.

+0

Спасибо. это решило мою проблему. – darshanUser

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

Смежные вопросы