PL / SQL - динамическое форматирование SQL выходит как буквальный VARCHAR - PullRequest
1 голос
/ 01 июня 2011

У меня есть справочная таблица, в которой хранятся различные столбцы со значениями для каждой записи, такие как LPAD (pl_sql_variablex 10)

Идея состоит в том, что данные в таблице (т. Е. Число заполнителей можно изменить с 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;

1 Ответ

3 голосов
/ 01 июня 2011

Вы можете использовать execute немедленный (я заменил ваш явный курсор на неявный для краткости):

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заявления и т. д.

...