Как получить имена столбцов для объекта SQL в PeopleCode? - PullRequest
3 голосов
/ 07 октября 2019

У меня есть iscript , который запускает один из набора ранее созданных операторов SQL, связывает несколько параметров и генерирует результат XML.

SQL, используемый в каждом запросе, варьируется в зависимости отколичество возвращаемых параметров и количество (и имя) столбцов.

Все было довольно просто разработать, за исключением одной нерешенной проблемы: как я могу собрать имена столбцов и включить эту информацию в возвращаемые данные?

В настоящее время мы используем команду CreateSQL и объект SQL. Насколько я знаю, мы можем только циклически просматривать значения результатов, а не словарь имен и значений столбцов.

Как можно вернуть имена столбцов с результатами в PeopleCode в контекстеiscript, с (по сути) динамическим SQL, который не может быть известен заранее?

1 Ответ

1 голос
/ 18 октября 2019

У меня есть способ получить имя столбца с помощью PLSQL, немного сложнее.

Сначала создайте таблицу для хранения длинной строки в конструкторе приложений:

-- create table
create table ps_sql_text_tbl 
(
  comments clob
)
tablespace hrapp
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 40k
    next 104k
    minextents 1
    maxextents unlimited
  );

Во-вторых, используйте DBMS_SQL в новой функции:

create or replace function get_column_name return clob is
  l_curid      integer;
  l_cnt        number;
  l_desctab    dbms_sql.desc_tab3;
  l_sql        dbms_sql.varchar2s;
  l_upperbound number;
  l_stmt       clob;
  l_result     clob;
begin
  /*get a sql text into a clob var*/
  select comments into l_stmt from ps_sql_text_tbl where rownum = 1;

  /*200 chars for every substring*/
  l_upperbound := ceil(dbms_lob.getlength(l_stmt) / 200);
  for i in 1 .. l_upperbound loop
    l_sql(i) := dbms_lob.substr(l_stmt, 200, ((i - 1) * 200) + 1);
  end loop;

  l_curid := dbms_sql.open_cursor();

  /*parse the sql text*/
  dbms_sql.parse(l_curid, l_sql, 1, l_upperbound, false, dbms_sql.native);
  /*describe column names*/
  dbms_sql.describe_columns3(l_curid, l_cnt, l_desctab);
  /*concatenate all column names*/
  for i in 1 .. l_desctab.count loop
    /*max length limited to 30 chars for every column name*/
    l_result := l_result || rtrim(rpad(l_desctab(i).col_name,30)) || ';';
  end loop;

  dbms_sql.close_cursor(l_curid);

  return l_result;
exception
  when no_data_found then
    return '';
end get_column_name ;

Наконец, используйте peoplecode для получения имен столбцов:

Local string &sqlText="select * from dual";

SQLExec("truncate table ps_sql_text_tbl");
SQLExec("insert into ps_sql_text_tbl values(%TextIn(:1)) ", &sqlText);
SQLExec("commit");

Local string &columnNames;
SQLExec("select get_column_name() from dual", &columnNames);

Local array of string &arrayColumnNames= Split(&columnNames, ";");
...