2011-06-01 67 views
1

我有存儲各種列與值對於每個記錄諸如 LPAD( pl_sql_variablex 10)的參照表PL/SQL - 動態SQL格式化出來作爲文字VARCHAR

的想法是,在數據表(即填充數可以從10更改爲15,或更改相關變量)可以更改,而無需更改任何PL/SQL。

我有一個遊標去

CURSOR C IS SELECT columna, columnb, columnc, columnd 
        FROM REFerence 
        ORDER BY FIELDORDER; 

的話,我想打印出格式化字符串,但我目前的語法,它的字面打印文本「LPAD」,而不是實際填充值

FOR R IN C LOOP 
    UTL_FILE.PUT(FILEP, R.COLUMNA||R.COLUMNb||','|| 
     R.COLUMNc||','||R.COLUMND); 
     dbms_output.put_line(R.COLUMNA||R.COLUMNb||','|| 
     R.COLUMNc||','||R.COLUMND); 
    END LOOP; 

回答

3

您可以使用立即執行(我已經更換了你顯式遊標有一個隱含的一個簡潔):

create table reference(
    columna varchar2(100), 
    columnb varchar2(100), 
    columnc varchar2(100), 
    columnd varchar2(100)); 

insert into reference(columna, columnb, columnc, columnd) 
    values(':x', 'lpad(:x, 5, ''_'')', 'trim(:x)', 'substr(:x, 1, 5)');  

declare 
    a varchar2(100); 
    b varchar2(100); 
    c varchar2(100); 
    d varchar2(100); 
    l_SQL varchar2(4000); 
    inval varchar2(100) default ' hello world '; 
begin 
    for cur in (select * from reference) 
    loop 
    l_SQL := 'select ' || cur.columna || ',' || cur.columnb ||',' || cur.columnc || ',' || cur.columnd || ' from dual'; 
    dbms_output.put_line(l_SQL); 
    execute immediate l_SQL into a,b,c,d using inval, inval, inval, inval; 
    dbms_output.put_line(a); 
    dbms_output.put_line(b); 
    dbms_output.put_line(c); 
    dbms_output.put_line(d); 
    end loop; 
end; 

當然,您將不得不注意SQL注入攻擊,無效的SQL語句等。