1:create procedure proc_name authid current_user/authid definer
创建存储过程的两种权限模式
2:UTL_FILE包的简单用法
PROCEDURE FCLOSE
PROCEDURE FCLOSE_ALL
PROCEDURE FCOPY
PROCEDURE FFLUSH
PROCEDURE FGETATTR
FUNCTION FGETPOS RETURNS BINARY_INTEGER
FUNCTION FOPEN RETURNS RECORD
FUNCTION FOPEN_NCHAR RETURNS RECORD
PROCEDURE FREMOVE
PROCEDURE PUT_RAW
PROCEDURE PUT_NCHAR
PROCEDURE PUT_LINE_NCHAR
PROCEDURE PUT_LINE
PROCEDURE PUTF_NCHAR
PROCEDURE PUTF
PROCEDURE PUT
PROCEDURE NEW_LINE
FUNCTION IS_OPEN RETURNS BOOLEAN
PROCEDURE GET_RAW
PROCEDURE GET_LINE_NCHAR
PROCEDURE FRENAME
PROCEDURE FSEEK
1>:在创建存储过程的时候,有两种权限模式(1:authid current_user,2:authid definer)
authid current_user:以执行过程的用户的权限来处理涉及的对象权限
authid definer:以创建存储过程的用户权限来处理涉及的对象权限
<测试>:
SQL> conn love2008/love2008;
已连接。
SQL> create or replace procedure proc1
2 authid current_user
3 as
4 v_cnt varchar2(20);
5 begin
6 select name into v_cnt from sys.test;
7 end;
8 /
过程已创建。
SQL> conn lovezx/lovezx
已连接。
SQL> exec love2008.proc1;
BEGIN love2008.proc1; END;
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
ORA-06512: 在"LOVE2008.PROC1", line 6
ORA-06512: 在line 1
SQL> conn love2008/love2008
已连接。
SQL> create or replace procedure proc1
2 as
3 v_cnt varchar2(20);
4 begin
5 select name into v_cnt from sys.test;
6 end;
7 /
过程已创建。
SQL> conn lovezx/lovezx
已连接。
SQL> set serveroutput on
SQL> exec love2008.proc1
PL/SQL 过程已成功完成。
SQL> select * from sys.test;
select * from sys.test
*
ERROR 位于第 1 行:
ORA-00942: 表或视图不存在
2>:UTL_FILE包的简单应用
写一个函数,记录执行的SQL语句,存入文件TXT中:
CREATE OR REPLACE PROCEDURE sp_save_sql_totxt(out_result out varchar2)
as
result varchar2(100);
file_handle UTL_FILE.FILE_TYPE;
v_sql varchar2(100);
begin
file_handle :=UTL_FILE.FOPEN('LOVE2008_DIR','save_sql.txt','a');
v_sql:='insert into test values(1,''file into save_sql'')';
execute immediate v_sql;
UTL_FILE.PUT_LINE(file_handle,v_sql||';');
UTL_FILE.FCLOSE(file_handle);
out_result:='sucess into save_sql.txt';
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(file_handle) THEN
UTL_FILE.FCLOSE(file_handle);
out_result :='file save fail'||SQLERRM;
END IF;
END;
/
-----------------------------------------------------------------------
CREATE DIRECTORY love2008_dir as 'd:';
SQL> CREATE OR REPLACE PROCEDURE sp_save_sql_totxt(out_result out varchar2)
2 as
3 result varchar2(100);
4 file_handle UTL_FILE.FILE_TYPE;
5 v_sql varchar2(100);
6 begin
7 file_handle :=UTL_FILE.FOPEN('LOVE2008_DIR','save_sql.txt','a'); --路径必须大写
8 v_sql:='insert into test values(1,''file into save_sql'')';
9 execute immediate v_sql;
10 UTL_FILE.PUT_LINE(file_handle,v_sql||';');
11 UTL_FILE.FCLOSE(file_handle);
12 out_result:='sucess into save_sql.txt';
13 EXCEPTION
14 WHEN OTHERS THEN
15 IF UTL_FILE.IS_OPEN(file_handle) THEN
16 UTL_FILE.FCLOSE(file_handle);
17 out_result :='file save fail'||SQLERRM;
18 END IF;
19
20 END;
21 /
过程已创建。
SQL> VARIABLE OUT_RESULT VARCHAR2(200);
SQL> EXEC SP_SAVE_SQL_TOTXT(:OUT_RESULT)
PL/SQL 过程已成功完成。
SQL> PRINT OUT_RESULT
OUT_RESULT
--------------------------------------------------------------------------------
sucess into save_sql.txt
SQL> SELECT * FROM TEST;
ID NAME
---------- --------------------
1 file into save_sql
SQL>