您的位置:首页 > 数据库 > Oracle

[export excel]Oracle Form導入sql查詢再導出CSV查詢結果( Using EXEC_SQL Package)

2011-01-27 15:30 429 查看
功能描述:一個簡單的Form,將調試好的SQL文本導入到Form文字框,再將SQL結果導出成CSV文件。

關鍵技朮:EXEC_SQL包的使用

FORM_DLL函數與EXEC_SQL包總結(摘自网頁):

一、FORMS_DDL函数
FUNCTION FORMS_DDL(statement VARCHAR2);
用于动态执行SQL语句与PL/SQL语句
注意事项:
1、参数statement的最大容量不能超过32K。
2、DDL类型的SQL语句,暗含一个commit命令。

二、EXEC_SQL包
用于动态执行DDL类型与DML类型的SQL语句。
EXEC_SQL包的一般使用步聚:
第一步:连接数据库:
EXEC_SQL.Open_Connection /EXEC_SQL.Default_Connection
第二步:创建一个指针变量(游标):
EXEC_SQL.Open_Cursor
第三步:为指针变量加载一个SQL语句(DDL、DML): EXEC_SQL.Open_Cursor
第四步:执行所加载一个SQL语句:
EXEC_SQL.Execute
第五步:批量针变量(游标)与关闭数据库连接:
EXEC_SQL.Is_Open、EXEC_SQL.Close_Cursor、EXEC_SQL.Close_Cursor、EXEC_SQL.Close_Cursor

三、总结
1、FORMS_DDL函数主要用于动态执行DDL类型的SQL语句(可以理解为因FORM中不能直接使用DDL类型的SQL语句。)。FORMS_DDL函数只能作用于当前FORM所连接的数据库。

2、EXEC_SQL包主要有两个重要用途:
第一:用于动态执行select语句并返回一个结果集。
第二:用于不同数据库之间数据访问。






相關代碼:

[Import SQL Text] Button : WHEN-BUTTON-PRESSED

DECLARE
dirname     VARCHAR2(255);
v_filename  VARCHAR2(255);

in_file    Text_IO.File_Type;
in_file_nm Text_IO.File_Type;
in_file_nm2 Text_IO.File_Type;
v_line      VARCHAR2(1000);
v_lines      VARCHAR2(4000);

BEGIN
TOOL_ENV.GETVAR('TXT',DIRNAME);
V_FILENAME:=GET_FILE_NAME(DIRNAME,NULL,
'SQL script (*.sql)|*.sql|' ||
'ALL FILES (*.*)|*.*|'
);
IF V_FILENAME IS NOT NULL THEN
in_file_nm := Text_IO.Fopen( V_FILENAME,'r');

BEGIN
loop

Text_IO.Get_Line(in_file_nm, v_line);

IF V_LINES IS NULL THEN
V_LINES:=v_line;
ELSE
V_LINES:=V_LINES||' '||v_line;
END IF;

END LOOP;

EXCEPTION WHEN no_data_found THEN
Text_IO.Fclose(in_file_NM);
END;
:CON.SQL_DESC:=V_LINES;

SYNCHRONIZE;

TEXT_IO.FCLOSE(in_file_NM);

END IF;
END;


[OK] Button to export CSV file : WHEN-BUTTON-PRESSED

DECLARE
T_SQL   VARCHAR2(8000);
T_ALT   NUMBER;
BEGIN
IF :CON.SQL_DESC IS NULL OR :CON.FILE_PATH IS NULL THEN
T_ALT := SHOW_ALERT('L_FILE');
GO_ITEM('CON.FILE_PATH');
ELSE
T_SQL:=:CON.SQL_DESC;

BEGIN
LP_SAVE_EXCEL0(:CON.FILE_PATH,T_SQL);  --output excel
EXCEPTION WHEN OTHERS THEN
--MESSAGE(T_SQL);
MESSAGE('EXPORT EXCEL ERROR..'||SQLERRM);
END;
HOST('EXPLORER '||:CON.FILE_PATH);

GO_BLOCK('CON');

END IF;
END;

----------------------------------------------------------
PROCEDURE LP_SAVE_EXCEL0 (t_file      varchar2,
t_sql     varchar2) IS
connection_id EXEC_SQL.CONNTYPE default exec_sql.default_connection;
cursorID      EXEC_SQL.CURSTYPE;
nIgn         number;
columnValue  varchar2(10000);
ncols        number;
sep          varchar2(1);
colName      varchar2(1000);
colLen       number;
coltype      number;
tmp      varchar2(32767);
file_nm    text_io.file_type;

BEGIN
file_nm := text_io.fopen(t_file,'w');
--tmp := t_label||chr(13);
--text_io.put(file_nm,tmp);
tmp:='';
cursorID := EXEC_SQL.OPEN_CURSOR;
BEGIN
EXEC_SQL.PARSE(cursorID, t_sql, exec_sql.V7);
nIgn := EXEC_SQL.EXECUTE(cursorID);

EXCEPTION WHEN OTHERS THEN
MESSAGE('EXEC SQL ERROR, PLEASE CHECK YOUR SQL SCRIPT.. '||SQLERRM);
END;

sep := '';
for i in 1 .. 100000 loop
begin
exec_sql.describe_column(connection_id, cursorId, i, colName, colLen, colType);
exec_sql.define_column(cursorID, i, columnValue, 40000);
--title
tmp:= tmp || sep ||colName;
sep := ',';
exception  when exec_sql.invalid_column_number then
ncols := i-1;
exit;
end;
end loop;

--output title
if (exec_sql.fetch_rows(cursorID) > 0) then
tmp:=tmp||chr(10);
text_io.put(file_nm,tmp);
tmp:='';
end if;

while (exec_sql.fetch_rows(cursorID) > 0)
loop
sep := '';
for i in 1 .. ncols loop
EXEC_SQL.COLUMN_VALUE(cursorID, i, columnValue);
tmp:= tmp || sep || columnValue;
sep := ',';
end loop;
tmp:=tmp||chr(10);
tmp:=convert(tmp,'ZHT16BIG5','UTF8');
text_io.put(file_nm,tmp);
tmp:='';
END LOOP;
text_io.fclose(file_nm);
EXEC_SQL.CLOSE_CURSOR(cursorID);
EXEC_SQL.CLOSE_CONNECTION;
END;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: