Oraclub in Tomsk

 Oraclub Tomsk . . Web SQL*Plus

WEB SQL*PLUS

CREATE OR REPLACE PACKAGE sqlplus IS
app constant varchar2(10) := 'sqlplus';
version constant  varchar2(20) :=  '21.05.2001';
/*****************************************************************
  Created by: Omelchenko Michail
  Purpose: Пакет для выполнения произвольных запросов(почти SQL*PLUS)
21.05.2001 - начало - взято из пакета администратора
*****************************************************************/
debug constant boolean := false ;-- appadm.get_app_logparameter(app,'debug');
  PROCEDURE startup ;  -- стартовое разбиение на фреймы
  PROCEDURE sql_form; -- форма для ввода выражения для исследовния
  procedure result_show(plan in varchar2 default null,stmt in varchar2 ) ;  -- поиск
END;
/

CREATE OR REPLACE PACKAGE BODY sqlplus IS
PROCEDURE to_start AS
BEGIN
  htp.line;
  htp.anchor(app||'.startup','На начало');
end;
-- стартовое разбиение на фреймы
procedure startup is
 begin
	htp.htmlOpen;
	htp.title('SQL*Plus');
	htp.framesetOpen('50%,50%','');
	htp.frame(app||'.sql_form','form');
	htp.p('');
	htp.frame('null_page','select_show');
	htp.p('');
	htp.framesetClose;
	htp.htmlClose;
 end;
PROCEDURE sql_form is -- форма для ввода выражения для исследовния
begin
 htp.htmlOpen;
	htp.htitle('Web SQL*Plus ');
    htadd.formopen(app||'.result_show','POST','select_show');
	 htadd.formDo(' Show result ');
	 htp.formreset(' Отменa ');
	 htadd.goback(' Возврат ');
	 htp.p(htf.formCheckbox('plan')||'Show plan'||htf.br);
	 htp.p('Statement : 
'||htf.formTextarea('stmt','10','70')||''); htp.formclose; htp.htmlClose; end sql_form; procedure plan_show(stmt in varchar2 ) is -- поиск curs varchar2(2000); curs_id integer; i integer; stmt_tmp varchar2(4000); begin stmt_tmp := replace(stmt,';',''); curs := 'explain plan set Statement_id = ''select_plan'' for '||stmt_tmp; -- htp.htitle('Plan is '); --htp.header(2,'Cursor is :'); htp.p(curs); curs_id := dbms_sql.open_cursor; --htp.p('Create cursor...'); -- выполнить лексический разбор курсора --htp.p('Parse cursor...'); dbms_sql.parse(curs_id,curs,2); --2 - это Oracle7 i := dbms_sql.execute(curs_id); dbms_sql.close_cursor(curs_id); -- Show plan htp.tableopen; for p in (select level,lpad(' ',(level-1)*5,'. ')|| operation||' '||Options||' '||Object_name Q_Plan from plan_table where Statement_id = 'select_plan' connect by prior ID = Parent_id and Statement_id = 'select_plan' start with ID = 0) loop htp.tablerowopen; htp.tabledata(p.Q_Plan); htp.tablerowclose; end loop; htp.tableclose; end; Function coltype(cod in number) return varchar2 is datatype varchar2(2000); -- буфер для типа данных полей begin select decode(cod,0,' ', 1, 'VARCHAR2', 2, 'NUMBER', 3, 'BINARY_INTEGER', 8, 'LONG', 11,'ROWID', 12,'DATE', 23,'RAW', 24,'LONG RAW', 96,'CHAR', 106,'MLSLABEL', 250,'RECORD', 251,'TABLE', 252,'BOOLEAN') into datatype from dual; return datatype; end; -- показать информацию по текущей записи - карточка procedure select_show(stmt in varchar2 ) is -- строка SELECT ... type Long_Table is table of varchar2(32767) index by binary_integer; type str_table is table of varchar2(200) index by binary_integer; j INTEGER; -- for dynamyс SQL curs_id INTEGER; -- id cursor col_cnt integer; -- буфер для количества полей SQL_stmt varchar2(32767); -- буфер для выражения SQL packet_len integer := 10; -- кол-во одновременно считываемых строк в dynamyс SQL desc_t dbms_sql.desc_tab; -- буфер для описания таблицы desc_r dbms_sql.desc_rec; -- буфер для описания полей col_dtype str_table ; -- буфер для типа данных полей -- переменные для приема данных из запроса vc_var varchar2(2000); -- для строк number_var number; -- для чисел date_var date; -- для дат long_var varchar2(32767);-- для текстов raw_var raw(255); -- для бинарников attr_com dbms_sql.Varchar2_Table; -- буферная таблица для названий атрибутов attr_Number_val dbms_sql.Number_Table; -- буферная таблица для числовых значений атрибутов attr_Varchar_val dbms_sql.Varchar2_Table; -- буферная таблица для строковых значений атрибутов attr_Date_val dbms_sql.Date_Table; -- буферная таблица для значений атрибутов - даты attr_long_val long_Table; -- буферная таблица для значений атрибутов - LONG begin -- ********** выбрать все данные объекта ***************************** SQL_stmt := stmt ; curs_id := dbms_sql.open_cursor; if debug then htp.p('
Create cursor...все данные объекта'); end if; dbms_sql.parse(curs_id,SQL_stmt,2); --2 - это Oracle7 if debug then htp.p('.. Parse cursor...'); end if; dbms_sql.describe_columns(curs_id, col_cnt, desc_t ); -- получить описание возвращаемых колонок if debug then htp.header(3,'Number of attrs : '||col_cnt); -- посмотрим структуру таблицы htp.tableopen; htp.tableheader ('No:'); htp.tableheader ('Col_name'); htp.tableheader ('Col_type'); htp.tableheader ('Length'); htp.tableheader ('Null?'); end if; if debug then htp.p('
Oпределение колонок в цикле по количеству полей в запросе...'); end if; for p in 1..col_cnt LOOP desc_r := desc_t(p); -- надо чтобы совпадали типы данных - применять соответствующие таблицы -- проверить тип данных колонки запроса col_dtype(p) := coltype(desc_r.col_type); if (col_dtype(p) = 'VARCHAR2' OR col_dtype(p) = 'CHAR') then dbms_sql.define_column(curs_id, p, vc_var,desc_r.col_max_len ); elsif (col_dtype(p) = 'NUMBER') then dbms_sql.define_column(curs_id, p, number_var ); elsif (col_dtype(p) = 'DATE') then dbms_sql.define_column(curs_id, p, date_var ); elsif (col_dtype(p) = 'LONG') then dbms_sql.define_column(curs_id, p, long_var,32767); end if; end loop; if debug then htp.p(' .. готово !'); end if; if debug then htp.p('
dbms_sql.EXECUTE(curs_id)...'); end if; j := dbms_sql.EXECUTE(curs_id); if debug then htp.p(' .. готово !'); end if; if debug then htp.p('
цикл выдачи значений into PL/SQL table...'); end if; -- get column values of the row into PL/SQL table for p in 1..col_cnt LOOP attr_varchar_val(p) := null; -- инициализация ячейки таблицы attr_number_val(p) := null; -- инициализация ячейки таблицы attr_date_val(p) := null; -- инициализация ячейки таблицы attr_long_val(p) := null; -- инициализация ячейки таблицы desc_r := desc_t(p); col_dtype(p) := coltype(desc_r.col_type); if debug then htp.tablerowopen; htp.tabledata (p); htp.tabledata (desc_r.col_name); htp.tabledata (col_dtype(p)); --desc_r.col_type); htp.tabledata (desc_r.col_max_len); if desc_t(p).col_null_ok then htp.tabledata (' '); else htp.tabledata ('NOT NULL '); end if; end if; -- debug if debug then htp.tablerowclose; end if; -- debug end loop; if debug then htp.tableclose; htp.p(' .. готово для строки : '); end if; -- debug /************************************************************************************/ -- формирование таблицы результатов htp.tableopen; htp.tablerowopen; for p in 1..col_cnt loop desc_r := desc_t(p); col_dtype(p) := coltype(desc_r.col_type); htp.tableheader (desc_r.col_name); end loop; htp.tablerowclose; LOOP -- цикл выдачи значений htp.tablerowopen; IF dbms_sql.fetch_rows(curs_id) > 0 THEN for p in 1..col_cnt LOOP -- перебор колонок -- присвоение значений выборки if (col_dtype(p) = 'VARCHAR2' OR col_dtype(p) = 'CHAR') then dbms_sql.column_value(curs_id, p, vc_var ); attr_varchar_val(p) := vc_var; htp.tabledata(attr_varchar_val(p)); elsif (col_dtype(p) = 'NUMBER') then dbms_sql.column_value(curs_id, p, number_var ); attr_number_val(p) := number_var; htp.tabledata(attr_number_val(p)); elsif (col_dtype(p) = 'DATE') then dbms_sql.column_value(curs_id, p, date_var ); attr_date_val(p) := date_var; htp.tabledata(to_char(attr_date_val(p),'dd.mm.yyyy') ); elsif (col_dtype(p) = 'LONG') then dbms_sql.column_value(curs_id, p, long_var ); attr_long_val(p) := long_var; htp.tabledata(attr_long_val(p)); elsif (col_dtype(p) = 'LONG RAW') then null; else null; end if; end loop ; -- перебор колонок htp.tablerowclose; ELSE EXIT; END IF; END LOOP; dbms_sql.close_cursor(curs_id); htp.tablerowclose; htp.tableclose; EXCEPTION WHEN OTHERS THEN Htadd.error_message('Show_card',TO_CHAR(SQLCODE),SQLERRM); end select_show ; procedure result_show(plan in varchar2 default null, stmt in varchar2 ) is -- поиск curs varchar2(2000); curs_id integer; i integer; stmt_tmp varchar2(4000); begin htp.htmlOpen; htp.htitle('Result '); -- проверка наличия обязательных полей if ( plan = 'on') then -- удалить все планы delete plan_table where Statement_id = 'select_plan'; plan_show(stmt); end if; if (upper(substr(stmt,1,instr(stmt,' ')-1)) = 'SELECT') then select_show(stmt); else htp.header(3, 'SQL statement is :
'||stmt); htp.header(2, 'Web SQL*Plus execute Only SELECT statements '); end if; htp.htmlClose; exception when OTHERS THEN htadd.error_message('plan_show',to_char(sqlcode),sqlerrm); end result_show; END; /

UTILITY > Web SQL*Plus >
Oraclub_Tomsk | News | Links | FAQ | DOC | Статьи | Utility | Software | ФОРУМ |  Обратная связь
Пишите на адрес : oraclub@ngs.ru