??xml version="1.0" encoding="utf-8" standalone="yes"?>
AS
TYPE RefCursor IS REF CURSOR;
Function GetCompany(key IN char) return RefCursor;
END;
/
CREATE OR REPLACE PACKAGE BODY ROME IS
IS
Function GetCompany(key IN char) return RefCursor
Is
v_temp RefCursor;
BEGIN
OPEN v_temp FOR
SELECT * FROM Company WHERE com_ID =key;
return v_temp;
END GetCompany;
END;
2.(适用于PLSQLcd)
Type shifts_ty is RECORD(
comp_code varchar2(10),
SHIFT_CODE varchar2(10),
sft_flg varchar2(10),
beg_tm number,
end_tm number,
skills varchar2(10)) ;
Type shifts is Table of shifts_ty index by binary_integer;
FUNCTION test_proc(test varchar2)
return shifts is
shiftspkg SHIFTS; --表变量shiftspkg
cursor q1 is select
shifts.comp_code,shifts.shift_code,shifts.WRK_BEG_TM,shifts.WRK_end_TM,
shifts.skills from str_shifts shifts where comp_code ='TSI'; --str_shifts是与表变量shiftspkgl构完全相同的真实表
qty q1%rowtype;
begin
open q1;
loop
fetch q1 into qty;
exit when q1%notfound;
for iCount in 1.. qty.skills.count
loop
shiftspkg(icount).comp_code:= qty.comp_code;
shiftspkg(icount).SHIFT_CODE:= qty.shift_code;
shiftspkg(icount).sft_flg:= 'SLOTS';
shiftspkg(icount).beg_tm:= qty.wrk_beg_tm;
shiftspkg(icount).end_tm:= qty.wrk_end_tm;
shiftspkg(icount).skills:= qty.skills(icount);
end loop;
end loop;
return shiftspkg;
end;
end;
3.使用于SQLcd
create or replace type myScalarType as object
( comp_code varchar2(10),
shift_code varchar2(10),
sft_flg varchar2(10),
beg_tm number,
end_tm number,
skills varchar2(10)
)
create or replace type myArrayType as table of myScalarType
FUNCTION test_proc(test varchar2) return myArrayType
is
l_data myArrayType := myArrayType() ;
begin
for i in 1 .. 5
loop
l_data.extend;
l_data( l_data.count ) := myScalarType( 'cc-'||i,
'sc-'||i,
'flg-'||i,
i,
i,
test||i );
end loop;
return l_data;
end;
end;
select *
from THE ( select cast( pkg_test.test_proc('hello') as myArrayType )
from dual ) a
?BR> select *
from table ( cast( my_function() as mytabletype ) )
order by seq
]]>
1、当需要向表中装蝲大量的数据流或者需要处理大量的数据的时候,能否使用道提高处理效率Q?BR>
道函数对于改善q行查询的性能非常方便Q它加快往表中加蝲数据的速度。管道函数的使用ȝ如下两点Q?BR>
每当在查询里使用PL/SQL函数Ӟ该查询将被序列化Q即一个处理器只能q行一个查询实例,那么在这U情况下不可能用ƈ行查询(比如在数据仓库中要经怋用这Ҏ术)。因此,Z使用q行查询必M用管道函敎ͼq样也就加快了执行的速度?BR>
道函数的输入参数必L一个引用记录集cdQ即ref cursorQ,而返回的是嵌套表cdQ其表中每一行对应每一个引用记录)。在使用道函数之前Q必d在程序头写上PARALLEL_ENABLEQ这h能在查询语句中用管道函数来处理了?BR>
2Q?如何使PL/SQLE序{待一D|间执行?
Ҏ是使用DBMS_LOCK包的SLEEP函数Q可以进行精定Ӟ其语法ؓQ?BR>
DBMS_LOCK.SLEEP (seconds IN NUMBER);
3Q需要在一张表插入一条记录之后等若干U后再执行另外一个操作,如何在PL/SQLE序里进行定时操作?
一般的做法是用循环作gq,利用 DBMS_UTILITY的gettime函数来检当前的旉Q程序代码如下:
DECLARE
v_delaytime CONSTANT INTEGER := 100;
v_starttime INTEGER ;
v_endtime INTEGER ;
BEGIN
V_starttime := DBMS_UTILITY.get_time;
V_endtime := DBMS_UTILITY.get_time;
While abs(V_endtime- V_starttime)< v_delaytime loop
/*I@环或者简单的耗时执行语句*/
End loop;
END;
/
另外如果是不同会话(sessionQ之间的定时Q就必须使用DBMS_PIPE包的函数来实C话间的消息传递?BR>
4Q当PL/SQLq回一个数据集的时候,该用集合还是游标?
一般情况下Q有以下两点作ؓ依据Q?BR>
1) 如果PL/SQLE序q回多多行数据给另外一个PL/SQLE序的话Q这里就使用集合Q因样可以利用集合的Ҏ集(bulk collectionQ来提高从数据库提取数据的速度?BR>
2) 如果需要在PL/SQLE序的环境中把数据返回到宿主语言环境中(如Sql*plus,c,delphi{)Q这时应该用游标变量来q回q些数据Q因为几乎所有的宿主语言都支持游标变量,但不是所有的宿主语言都支持集合。这样可以增强程序的可移植性?BR>
5Q如何更有效的在PL/SQL中用游标?
游标是PL/SQL中一个非帔R要的概念Q对数据库的索主要依靠游标来操作。在PL/SQL中有两类游标Q一cL隐式游标Q如select clno into v_clno from table_detail.另外一cL昑ּ游标Q如cursor v_cur is select clno from table_detail。对于游标的使用q里l出以下几点Q?BR>
1) 可能的使用bulk collection。它能够较大的提高运行性能Q在Oracl9i的第二版Q甚臛_以用bulk collection来直接将数据写入到记录表
2) 量使用昑ּ游标来处理,因ؓ相对于隐式游标来_昑ּ游标的速度更快一些?BR>
3) 如果查询的表很小或者是静态的Q可以把该表~存C个包U的集合里。这P你的查询函数q接从集合里(卌E全局区,PGA cacheQ,而不是从pȝ全局区(SGAQ来取数据,q样的处理速度会提升很多?img src ="http://m.tkk7.com/konhon/aggbug/21780.html" width = "1" height = "1" />
]]>
如果是的话,可以用oracle里生成随机数的PL/SQL, 目录文g名在Q?ORACLE_HOME/rdbms/admin/dbmsrand.sql?BR>
用之前先要在sys用户下编?
SQL>@/ORACLE_HOME/rdbms/admin/dbmsrand.sql
它实际是在sys用户下生成一个dbms_randomE序包,同时生成公有同义词,q授权给所有数据库用户有执行的权限?BR>
使用dbms_randomE序? 取出随机数据的方法:
1. 先创Z个唯一增长的序列号tmp_id
create sequence tmp_id increment by 1 start with 1 maxvalue 9999999 nocycle nocache;
2. 然后创徏一个时表tmp_1Q把W合本次zd条g的记录全部取出来?/B>
create table tmp_1 as select tmp_id.nextval as id,email,mobileno from 表名 where 条g;
扑ֈ最大的idP
select max(id) from tmp_1;
假设?000
3. 讑֮一个生成随机数的种?/B>
execute dbms_random.seed(12345678);
或?BR>
execute dbms_random.seed(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'));
4. 调用随机数生成函数dbms_random.value生成临时表tmp_2
假设随机?00?BR>
create table tmp_2 as select trunc(dbms_random.value(1,5000)) as id from tmp_1 where rownum<201;
[ 说明Qdbms_random.value(1,5000)是取1?000间的随机敎ͼ会有数,
trunc函数寚w机数字取_才能和时表的整数ID字段相对应?BR>
注意Q如果tmp_1记录比较?10万条以上)Q也可以找一个约大于两百行的?假如是tmp_3)来生成tmp_2
create table tmp_2 as select trunc(dbms_random.value(1,5000)) as id from tmp_3 where rownum<201; ]
5. tmp_1和tmp_2相关联取得符合条件的200用户
select t1.mobileno,t1.email from tmp_1 t1,tmp_2 t2 where t1.id=t2.id;
[ 注意Q如果tmp_1记录比较?10万条以上)Q需要在id字段上徏索引。]
也可以输出到文本文gQ?BR>
set pagesize 300;
spool /tmp/200.txt;
select t1.mobileno,t1.email from tmp_1 t1,tmp_2 t2 where t1.id=t2.id order by t1.mobileno;
spool off;
6. 用完后,删除临时表tmp_1、tmp_2和序列号tmp_id?/B>
]]>
写一些关于PL/SQL的语法,免得{到用到的时候还要去q?BR> Q。控制流E?if,while)
Q。@?for)
Q。游?cursor)
Q。异常处?exceptionQ?BR>
1。控制流E(Q?/B>
A.条g语句
IF <statement> THEN
PL/SQL
END IF;
IF <statement> THEN
PL/SQL
ELSE
PL/SQL
END IF;
IF <statement> THEN
PL/SQL
ELSIF <statement> THEN
PL/SQL
END IF;
2。@?/B>
A.simple loop
LOOP
SQL
EXIT WHEN <statement>;
END LOOP;
LOOP
SQL
IF <statement> THEN
EXIT;
END IF;
END LOOP;
B.While loop
WHILE <statement> LOOP
SQL
END LOOP;
C.For loop
FOR $counter in $low .. $high LOOP
SQL
END LOOP
3。游?/B>
在PL/SQLE序中定义的游标叫做昑ּ游标?BR>
A.昑ּ游标的处理由四个部分l成Q?BR> cursor $cursorname is $Query; --定义游标
open $cursorname; --打开游标
fetch $cursorname into $othervariable --把游标中的东西取?BR> close $cursorname --关闭游标
B.游标属?BR> %found 布尔型属性,当最q一ơ读U录成功Ӟ为true.
%nofound p|Ӟ为false.
%isopen
%rowcount q回已从游标中读取的记录数?BR>
C.参数化游?BR>
所有的SQL语句在上下文区内部都是可执行的,因此都有一个游标指向上下文区,此游标就是所谓的SQL游标?BR>
与显式游标不同,SQL游标不被E序打开和关闭?BR>
4.异常处理概念
异常处理是用来处理正常执行过E中未预料的事g。如果PL/SQLE序块一旦生异常而又没有指出如何处理ӞE序会自动终止?BR>
异常处理部分攑֜PL/SQL的后半部分,l构为:
EXCEPTION
WHEN first_exception THEN <code to handle first exception>
WHEN second_exception THEN <code to handle second exception>
WHEN OTHERS THEN <code to handle second exception> --OTHERS必须攑֜最?BR>
异常分ؓ预定义和用户定义两种?BR>
用户定义的异常是通过昑ּ使用RAISE语句来引发。如
DECLARE
e_TooManyStudents EXCEPTION; -- cd为ExceptionQ用于指C错误条?BR> v_CurrentStudents NUMBER(3); -- HIS-101学生注册当前?BR> v_MaxStudents NUMBER(3); -- HIS-101学生注册允许的最大号
BEGIN
/* 扑և注册学生当前号和允许的最大号 */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = 'HIS' AND course = 101;
/* 查学生的?*/
IF v_CurrentStudents > v_MaxStudents THEN
/* 太多的学生注册,则触发例外处?*/
RAISE e_TooManyStudents;
END IF;
EXCEPTION
WHEN e_TooManyStudents THEN
/* 当太多的学生注册Q就插入信息解释发生q错?*/
INSERT INTO log_table (info) VALUES ('History 101 has ' || v_CurrentStudents ||
'students: max allowed is ' || v_MaxStudents);
END;
END;
用户定义的的异常处理
可以使用RAISE_APPLICATION_ERROR来创q错误处理Q?BR>
RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
其中error_number是从-20000?20999之间的参敎ͼerror_message是相应的提示信息Q小?12字节。如Q?BR>
CREATE OR REPLACE PROCEDURE Register (
p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course IN classes.course%TYPE) AS
v_CurrentStudents NUMBER; -- 班上学生的当前号
v_MaxStudents NUMBER; -- 班上学生的最大号
BEGIN
/* 扑և学生的当前号和最大号 */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE course = p_Course
AND department = p_Department;
/* 认另外的学生是否有_的教?/
IF v_CurrentStudents + 1 > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' ||
p_Department || ' ' || p_Course);
END IF;
/* 加一个学生在本班 */
ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' || p_Course ||
' doesn''t exist!');
END Register;
set linedize 150 //每行昄的字W?BR> set time on //在提C符前显C系l时?BR> SQL> set time on 12:25:08 SQL> set serveroutput on/off //输出昄 set long 200 //每字D|C的字符长度Q如某列的值显CZ完,调次?BR> col column_name format a10 //昄列的宽度 set linedize 150 //每行昄的字W?BR> set time on //在提C符前显C系l时?BR> SQL> set time on 12:25:08 SQL> set serveroutput on/off //输出昄 set long 200 //每字D|C的字符长度Q如某列的值显CZ完,调次?BR> col column_name format a10 //昄列的宽度 col ename heading 雇员 //别名昄 spool d:\temp\sqlout.txt //输出为文?BR> spool off SQL> alter session set NLS_LANGUAGE='AMERICAN'; 改变session的语a昄 SQL> alter session set NLS_LANGUAGE='SIMPLIFIED CHINESE'; SQL> set timi on //昄提示SQL语句执行所q旉 |
摘录,非本人原?/STRONG>
1. 执行一个SQL脚本文g
SQL>start file_name
SQL>@ file_name
我们可以多条sql语句保存在一个文本文件中Q这样当要执行这个文件中的所有的sql语句Ӟ用上面的M命o卛_Q这cM于dos中的批处理?
2. 对当前的输入q行~辑
SQL>edit
3. 重新q行上一ơ运行的sql语句
SQL>/
4. 显C的内容输出到指定文?
SQL> SPOOL file_name
在屏q上的所有内定w包含在该文g中,包括你输入的sql语句?
5. 关闭spool输出
SQL> SPOOL OFF
只有关闭spool输出Q才会在输出文g中看到输出的内容?
6Q显CZ个表的结?
SQL> desc table_name
7. COL命oQ?
主要格式化列的显CŞ式?
该命令有许多选项Q具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
1). 改变~省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- ---------
10 ACCOUNTING NEW YORK
sql>col LOC heading location
sql>select * from dept;
DEPTNO DNAME location
--------- ---------------------------- -----------
10 ACCOUNTING NEW YORK
2). 列名ENAME改ؓ新列名EMPLOYEE NAMEq将新列名放在两行上Q?
Sql>select * from emp
Department name Salary
---------- ---------- ----------
10 aaa 11
SQL> COLUMN ENAME HEADING ’Employee|Name?
Sql>select * from emp
Employee
Department name Salary
---------- ---------- ----------
10 aaa 11
note: the col heading turn into two lines from one line.
3). 改变列的昄长度Q?
FOR[MAT] format
Sql>select empno,ename,job from emp;
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
Sql> col ename format a40
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
4). 讄列标题的寚w方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
对于NUMBER型的列,列标题缺省在双Q其它类型的列标题缺省在左边
5). 不让一个列昄在屏q上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
EMPNO ENAME
---------- ----------------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
6). 格式化NUMBERcd列的昄Q?
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department Name Salary Commission
---------- ---------- --------- ----------
30 ALLEN $1,600 300
7). 昄列值时Q如果列gؓNULL|用textg替NULL?
COMM NUL[L] text
SQL>COL COMM NUL[L] text
8). 讄一个列的回l方?
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
COL1
--------------------
HOW ARE YOU?
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
9). 昄列的当前的显C属性?
SQL> COLUMN column_name
10). 所有列的显C属性设为缺省?
SQL> CLEAR COLUMNS
8. 屏蔽掉一个列中显C的相同的?
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
WHERE SAL < 2500
ORDER BY DEPTNO;
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
9. 在上面屏蔽掉一个列中显C的相同的值的昄中,每当列值变化时在值变化之前插入n个空行?
BREAK ON break_column SKIP n
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
10. 昄对BREAK的设|?
SQL> BREAK
11. 删除6?的设|?
SQL> CLEAR BREAKS
12. Set 命oQ?
该命令包含许多子命oQ?
SET system_variable value
system_variable value 可以是如下的子句之一Q?
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
1). 讄当前session是否对修改的数据q行自动提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
2)Q在用start命o执行一个sql脚本Ӟ是否昄脚本中正在执行的SQL语句
SQL> SET ECHO {ON|OFF}
3).是否昄当前sql语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
默认只有l果大于6行时才显C结果的行数。如果set feedback 1 Q则不管查询到多行都返回。当为off Ӟ一律不昄查询的行?
4).是否昄列标?
SQL> SET HEA[DING] {ON|OFF}
当set heading off Ӟ在每늚上面不显C列标题Q而是以空白行代替
5).讄一行可以容U的字符?
SQL> SET LIN[ESIZE] {80|n}
如果一行的输出内容大于讄的一行可容纳的字W数Q则折行昄?
6).讄与之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 Ӟ会在每页的开头有一个小的黑Ҏ?
当set newpage n Ӟ会在和之间隔着n个空行?
当set newpage none Ӟ会在和之间没有Q何间隔?
7).昄Ӟ用textg替NULL?
SQL> SET NULL text
8).讄一|多少行数
SQL> SET PAGES[IZE] {24|n}
如果设ؓ0Q则所有的输出内容Zƈ且不昄列标?
9).是否昄用DBMS_OUTPUT.PUT_LINE包进行输出的信息?
SQL> SET SERVEROUT[PUT] {ON|OFF}
在编写存储过E时Q我们有时会用dbms_output.put_line必要的信息输出Q以便对存储q程q行调试Q只有将serveroutput变量设ؓon后,信息才能昄在屏q上?
10).当SQL语句的长度大于LINESIZEӞ是否在显C时截取SQL语句?
SQL> SET WRA[P] {ON|OFF}
当输出的行的长度大于讄的行的长度时Q用set linesize n命o讄Q,当set wrap onӞ输出行的多于的字W会另v一行显C,否则Q会输的多于字W切除,不予昄?
11).是否在屏q上昄输出的内容,主要用与SPOOLl合使用?
SQL> SET TERM[OUT] {ON|OFF}
在用spool命o一个大表中的内容输出到一个文件中Ӟ内容输出在屏幕上会耗费大量的时_讄set termspool off后,则输出的内容只会保存在输出文件中Q不会显C在屏幕上,极大的提高了spool的速度?
12).SPOOL输出中每行后面多余的I格L
SQL> SET TRIMS[OUT] {ON|OFF}
13)昄每个sql语句p的执行时?
set TIMING {ON|OFF}
14Q修改sql buffer中的当前行中Q第一个出现的字符?
C[HANGE] /old_value/new_value
SQL> l
1* select * from dept
SQL> c/dept/emp
1* select * from emp
15Q编辑sql buffer中的sql语句
EDI[T]
16Q显Csql buffer中的sql语句Qlist n昄sql buffer中的Wn行,qɽWn行成为当前行
L[IST] [n]
17Q在sql buffer的当前行下面加一行或多行
I[NPUT]
18Q将指定的文本加到sql buffer的当前行后面
A[PPEND]
SQL> select deptno,
2 dname
3 from dept;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
SQL> L 2
2* dname
SQL> a ,loc
2* dname,loc
SQL> L
1 select deptno,
2 dname,loc
3* from dept
SQL> /
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
19Q将sql buffer中的sql语句保存C个文件中
SAVE file_name
20Q将一个文件中的sql语句导入到sql buffer?
GET file_name
21Q再ơ执行刚才已l执行的sql语句
RUN
or
/
22Q执行一个存储过E?
EXECUTE procedure_name
23Q在sql*plus中连接到指定的数据库
CONNECT user_name/passwd@db_alias
24Q设|每个报表的剙标题
TTITLE
25Q设|每个报表的N标题
BTITLE
26Q写一个注?
REMARK [text]
27Q将指定的信息或一个空行输出到屏幕?
PROMPT [text]
28Q将执行的过E暂停,{待用户响应后l执?
PAUSE [text]
Sql>PAUSE Adjust paper and press RETURN to continue.
29Q将一个数据库中的一些数据拷贝到另外一个数据库Q如一个表的数据拷贝到另一个数据库Q?
COPY {FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE} destination_table
[(column, column, column, ...)] USING query
sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST
create emp_temp
USING SELECT * FROM EMP
30Q不退出sql*plusQ在sql*plus中执行一个操作系l命令:
HOST
Sql> host hostname
该命令在windows下可能被支持?
31Q在sql*plus中,切换到操作系l命令提C符下,q行操作pȝ命o后,可以再次切换回sql*plusQ?
!
sql>!
$hostname
$exit
sql>
该命令在windows下不被支持?
32Q显Csql*plus命o的帮?
HELP
如何安装帮助文gQ?
Sql>@ ?sqlplusadminhelphlpbld.sql ?sqlplusadminhelphelpus.sql
Sql>help index
33Q显Csql*pluspȝ变量的值或sql*plus环境变量的?
Syntax
SHO[W] option
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TTI[TLE]
USER
1) . 昄当前环境变量的|
Show all
2) . 昄当前在创建函数、存储过E、触发器、包{对象的错误信息
Show error
当创Z个函数、存储过E等出错Ӟ变可以用该命令查看在那个地方出错及相应的出错信息Q进行修改后再次q行~译?
3) . 昄初始化参数的|
show PARAMETERS [parameter_name]
4) . 昄数据库的版本Q?
show REL[EASE]
5) . 昄SGA的大?
show SGA
6). 昄当前的用户名
show user
---- ?怎样在数据库触发器中使用列的新g旧?
---- 在数据库触发器中几乎L要用触发器的列|如果某条语句需要某列修改前的|使用:OLD可以了Q用某列修改后的新|?NEW可以了。如:OLD.DEPT_NO,:NEW.DEPT_NO?
---- ?ORACLE DEVELOPER 2000使用技巧:
---- ?改变FORM(FMX模块)q行时的Runform4.5的题?
---- DEVELOPER2000中FMX默认题头为:Developer/2000 Forms Runtime for Windows 95 / NT 你可以改己定义的标题,
---- 1. 在FormU触发器中添加触发WHEN-NEW-FORM-INSTANCE
---- 2. 在此触发器中写如下代码:
set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT
SYSTEM Ƣ迎使用');
---- ?如何隐藏菜单中的window选项:
---- 在创q菜单Ӟ最后选项Lwindow,下面介绍如何L?
---- 1. 创徏一个Menu
---- 2. 在Menu中徏立一个Item,命名为WINDOW?
---- 3. 讄该Item属性如?
----
Menu Item Type:Magic
Command Type:Null
Magic Item:Window
Lable:为空
---- ?怎样创徏动态下拉列表List
---- Developer 2000 中的列表是通过讄相关属性而完成数据项的列表设|的Q但那只是静态的Q有时你惌某项成ؓ动态的列表Q随输入数据的改变而改变,需要动手去~个程序。下面详l介l怎样d:
---- 有块EBOP_CABLE_ACCOUNTQ下有SPECIFICATION数据,当一q入该模块时Q就SPECIFICATION在数据库中存储的值动态显C出来,先在Form4.5中徏立一个PRCEDUREQ命名ؓDYN_LIST:
PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)
FROM EBOP_CABLE_ACCOUNT;
CNT NUMBER;
i NUMBER;
TNAME EBOP_CABLE_
ACCOUNT.SPECIFICATION%TYPE;
BEGIN
CLEAR_LIST('EBOP_CABLE_
ACCOUNT.SPECIFICATION');
SELECT COUNT(DISTINCT
(SPECIFICATION)) INTO CNT FROM EBOP
_CABLE_ACCOUNT;
open C1;
FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;
EXIT WHEN C1%NOTFOUND
OR C1%NOTFOUND IS NULL;
ADD_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT
.SPECIFICATION',i,TNAME,TNAME);
END LOOP;
DELETE_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);
CLOSE C1;
END;
然后在FORM的WHEN-NEW
-FORM-INSTANCE触发子中加入一行:
DYN_LIST;
---- q样一q入该FMXQ就会动态刷新该列表。除此之外,SPECIFICATION数据Ҏ为列表项?
---- ?当显C多条记录且数据特别多Ӟ如何l织录入及显C界?
---- 如上图所C,PRN代码及设备代码在d1(CONTENT?上,其它数据在d2(STACK?上,所有数据项Z个表的列或一个块的数据项。在拉动水^滚动条时或用TAB或敲回R键时Q将看到全部数据V这U排布方法适用于数据项特别多又xC多条记录时用。主要制作顺序ؓQ先建立两个dQ画?(CONTENT?Q画?(STACK?Q然后徏立块Q选画布时用画?Q这h有项都显C在d1上,然后选中除PRN代码及设备代码之外的所有数据项Q选TOOLS菜单下的PROPERTIES选项Q将q些数据的CANVAS属性选ؓd2(STACK?Q然后调整整体位|就可以了?
---- ?如何在FORM的受限触发子中提交保存数?
---- 在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDATEQDELETE{操作ƈ想立卛_盘时Q就需要COMMIT WORK语句了。首先在服务器端建立DB_SQL_COMMITq个q程(采用ORACLE7.3数据?Q?
PROCEDURE DB_SQL_COMMIT IS
source_cursor integer;
ignore integer;
V7 NUMBER :=2;
BEGIN
source_cursor:=dbms_sql.open_cursor;
dbms_sql.parse(source_cursor,'COMMIT WORK',V7);
ignore:=dbms_sql.execute(source_cursor);
DBMS_SQL.CLOSE_CURSOR(source_cursor);
END;
---- 然后在FORM中该触发子中调用q程DB_SQL_COMMIT;可以了Q当然你可以Ҏ自己需要将该过E加入参敎ͼq样通过参数可以得到执行DML语句的权限?BR>
- ?如何在FORM中实现某数据自动按记录序号加一操作
---- 讑֝名ؓVO,要操作的数据ؓVO_ID,在该块中建立块触发子WHEN-CREATE- RECORDQ加入如下代码:
:VO_ID:=:System.Trigger_Record;
---- q样每当生成新记录时VO_ID׃自动加一了?
---- ?如何在一个FORM中调用另一个FORMQ或在一个块中调用另一个块时显C特定的记录有时用户会要求在调用另一个FORMӞ只显C相关的记录QD例如下,在一个FORM的块中有一个按钮,在按钮触发子中加入如下代码:
DECLARE
PM
PARAMLIST;
BEGIN
PM:=GET_PARAMETER_LIST('PM');
IF NOT ID_NULL(PM) THEN
DESTROY_PARAMETER_LIST('PM');
END IF;
PM:=CREATE_PARAMETER_LIST('PM');
......................
ADD_PARAMETER(PM,'THE_WHERE',
TEXT_PARAMETER,'EM_NAME=''EM4''
AND EM_PROJECT_NAME=''支架预制''');
OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);
ENDQ?BR>---- 其中EM_NAMEQEM_PROJECT_NAME为本FORM某块的数据项QPAYMENT调用的FORM模块。这样通过传递参数列表就可以得到惌的结果。在FORM PAYMENT.FMB中,建立一参数THE_WHEREQCHAR型,?000Q然后在PAYMENT.FMB中徏立FORMU触发子WHEN-NEW-FORM-INSTANCEQ在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN
SET_BLOCK_PROPERTY('PAYMENT',
DEFAULT_WHERE,:PARAMETER.THE_WHERE);
END IF;
---- 其中PAYMENT昄的块Q这样通过参数传递就得到惌的某些特定条件的数据了?
---- ?在FORM中当有主从块Ӟq箋输入记录如何避免被不断的提示保存Q?
---- 每输入一条主记录和若q条该主记录的从记录后,此时再导航到d输下一条记录,FORM׃提示你是否要保存记录Q而你q不希望FORM提示Q让它自动保存,此时你可以到Program Units中找到过EPROCEDURE Clear_All_Master_DetailsQ然后在q个q程中找到语?
Clear_Block(ASK_COMMIT);
---- 其改ؓClear_Block(DO_COMMIT);可以了?
---- ?在Report开始时选择排序?
---- 在报表开始的Parameter Form中选择报表按哪个数据项排序Q?
---- 1. 先在USER PARAMETER 中创建SORT参数Qؓ字符型,?0?
---- 2. 初始值选’责L?然后这四个D入到DATA SELECTION中,形成列表?
---- 3. 然后处理QUERY中的SQL语句:
select CHARGER,FCO_NO,EM_NAME,FCO
_NO,DESCRIPTION, FCR_POINT
from FCR_MAIN
ORDER BY DECODE(:SORT,'责Q?,CHARGER,'FCO?,
FCO_NO,'FCR?,FCR_NO,'FCR?,EM_NAME)
---- ?在Developer 2000中如何读写操作系l文?
---- 在用Developer 2000的开发工具开发应用程序时Q经常碰到需要读写外部文件的问题Q可以用ORACLE 带的包TEXT_IO来完成这w求。例?
DECLARE
IN_FILE TEXT_IO.FILE_TYPE;
OUT_FILE TEXT_IO.FILE_TYPE;
LINE_BUFER VARCHAR2(80);
/*若不用IN_FILE,可以各字段联接在一赯值给此变?/
BEGIN
IN_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST1.TXT?’r?;
OUT_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST2.TXT?’w+?;
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);
TEXT_IO.PUT(LINE_BUFER);
TEXT_IO.NEW_LINE;
TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....?;
TEXT_IO.FCLOSE(IN_FILE);
TEXT_IO.FCLOSE(OUT_FILE);
END;
---- ?数据库管?
---- ?在删除一个表中的全部数据ӞM用TRUNCATE TABLE 表名;因ؓ用DROP TABLEQDELETE * FROM 表名ӞTABLESPACE表空间该表的占用I间q未释放Q反复几ơDROPQDELETE操作后,该TABLESPACE上百兆的I间p耗光了?
---- ?数据库文件的UdҎ
---- 当想数据库文gUd到另外一个目录下Ӟ可以用ALTER DATABASE命o来移?比ALTER TABLESPACE适用性强)Q?
---- 1. 使用SERVER MANAGER关闭实例.
SVRMGR > connect internal;
SVRMGR > shutdown;
SVRMGR >exit;
---- 2. 使用操作pȝ命o来移动数据库文g位置(假设q里操作pȝ为SOLARIS 2.6). 在UNIX中用 mv命o可以把文件移动到新的位置Q?
#mv /ora13/orarun/document.dbf /ora12/orarun
---- 3. 装蝲数据库ƈ用alter database命o来改变数据库中的文g?
SVRMGR > connect internal;
SVRMGR > startup mount RUN73;
SVRMGR > alter database rename file
> ? ora13/orarun/document.dbf?BR>> ? ora12/orarun/document.dbf?
---- 4. 启动实例.
SVRMGR > alter database open;
---- ?怎样在数据库触发器中使用列的新g旧?
---- 在数据库触发器中几乎L要用触发器的列|如果某条语句需要某列修改前的|使用:OLD可以了Q用某列修改后的新|?NEW可以了。如:OLD.DEPT_NO,:NEW.DEPT_NO?
---- ?ORACLE DEVELOPER 2000使用技巧:
---- ?改变FORM(FMX模块)q行时的Runform4.5的题?
---- DEVELOPER2000中FMX默认题头为:Developer/2000 Forms Runtime for Windows 95 / NT 你可以改己定义的标题,
---- 1. 在FormU触发器中添加触发WHEN-NEW-FORM-INSTANCE
---- 2. 在此触发器中写如下代码:
set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT
SYSTEM Ƣ迎使用');
---- ?如何隐藏菜单中的window选项:
---- 在创q菜单Ӟ最后选项Lwindow,下面介绍如何L?
---- 1. 创徏一个Menu
---- 2. 在Menu中徏立一个Item,命名为WINDOW?
---- 3. 讄该Item属性如?
----
Menu Item Type:Magic
Command Type:Null
Magic Item:Window
Lable:为空
---- ?怎样创徏动态下拉列表List
---- Developer 2000 中的列表是通过讄相关属性而完成数据项的列表设|的Q但那只是静态的Q有时你惌某项成ؓ动态的列表Q随输入数据的改变而改变,需要动手去~个程序。下面详l介l怎样d:
---- 有块EBOP_CABLE_ACCOUNTQ下有SPECIFICATION数据,当一q入该模块时Q就SPECIFICATION在数据库中存储的值动态显C出来,先在Form4.5中徏立一个PRCEDUREQ命名ؓDYN_LIST:
PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)
FROM EBOP_CABLE_ACCOUNT;
CNT NUMBER;
i NUMBER;
TNAME EBOP_CABLE_
ACCOUNT.SPECIFICATION%TYPE;
BEGIN
CLEAR_LIST('EBOP_CABLE_
ACCOUNT.SPECIFICATION');
SELECT COUNT(DISTINCT
(SPECIFICATION)) INTO CNT FROM EBOP
_CABLE_ACCOUNT;
open C1;
FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;
EXIT WHEN C1%NOTFOUND
OR C1%NOTFOUND IS NULL;
ADD_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT
.SPECIFICATION',i,TNAME,TNAME);
END LOOP;
DELETE_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);
CLOSE C1;
END;
然后在FORM的WHEN-NEW
-FORM-INSTANCE触发子中加入一行:
DYN_LIST;
---- q样一q入该FMXQ就会动态刷新该列表。除此之外,SPECIFICATION数据Ҏ为列表项?
---- ?当显C多条记录且数据特别多Ӟ如何l织录入及显C界?
---- 如上图所C,PRN代码及设备代码在d1(CONTENT?上,其它数据在d2(STACK?上,所有数据项Z个表的列或一个块的数据项。在拉动水^滚动条时或用TAB或敲回R键时Q将看到全部数据V这U排布方法适用于数据项特别多又xC多条记录时用。主要制作顺序ؓQ先建立两个dQ画?(CONTENT?Q画?(STACK?Q然后徏立块Q选画布时用画?Q这h有项都显C在d1上,然后选中除PRN代码及设备代码之外的所有数据项Q选TOOLS菜单下的PROPERTIES选项Q将q些数据的CANVAS属性选ؓd2(STACK?Q然后调整整体位|就可以了?
---- ?如何在FORM的受限触发子中提交保存数?
---- 在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDATEQDELETE{操作ƈ想立卛_盘时Q就需要COMMIT WORK语句了。首先在服务器端建立DB_SQL_COMMITq个q程(采用ORACLE7.3数据?Q?
PROCEDURE DB_SQL_COMMIT IS
source_cursor integer;
ignore integer;
V7 NUMBER :=2;
BEGIN
source_cursor:=dbms_sql.open_cursor;
dbms_sql.parse(source_cursor,'COMMIT WORK',V7);
ignore:=dbms_sql.execute(source_cursor);
DBMS_SQL.CLOSE_CURSOR(source_cursor);
END;
---- 然后在FORM中该触发子中调用q程DB_SQL_COMMIT;可以了Q当然你可以Ҏ自己需要将该过E加入参敎ͼq样通过参数可以得到执行DML语句的权限?BR>
- ?如何在FORM中实现某数据自动按记录序号加一操作
---- 讑֝名ؓVO,要操作的数据ؓVO_ID,在该块中建立块触发子WHEN-CREATE- RECORDQ加入如下代码:
:VO_ID:=:System.Trigger_Record;
---- q样每当生成新记录时VO_ID׃自动加一了?
---- ?如何在一个FORM中调用另一个FORMQ或在一个块中调用另一个块时显C特定的记录有时用户会要求在调用另一个FORMӞ只显C相关的记录QD例如下,在一个FORM的块中有一个按钮,在按钮触发子中加入如下代码:
DECLARE
PM
PARAMLIST;
BEGIN
PM:=GET_PARAMETER_LIST('PM');
IF NOT ID_NULL(PM) THEN
DESTROY_PARAMETER_LIST('PM');
END IF;
PM:=CREATE_PARAMETER_LIST('PM');
......................
ADD_PARAMETER(PM,'THE_WHERE',
TEXT_PARAMETER,'EM_NAME=''EM4''
AND EM_PROJECT_NAME=''支架预制''');
OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);
ENDQ?BR>---- 其中EM_NAMEQEM_PROJECT_NAME为本FORM某块的数据项QPAYMENT调用的FORM模块。这样通过传递参数列表就可以得到惌的结果。在FORM PAYMENT.FMB中,建立一参数THE_WHEREQCHAR型,?000Q然后在PAYMENT.FMB中徏立FORMU触发子WHEN-NEW-FORM-INSTANCEQ在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN
SET_BLOCK_PROPERTY('PAYMENT',
DEFAULT_WHERE,:PARAMETER.THE_WHERE);
END IF;
---- 其中PAYMENT昄的块Q这样通过参数传递就得到惌的某些特定条件的数据了?
---- ?在FORM中当有主从块Ӟq箋输入记录如何避免被不断的提示保存Q?
---- 每输入一条主记录和若q条该主记录的从记录后,此时再导航到d输下一条记录,FORM׃提示你是否要保存记录Q而你q不希望FORM提示Q让它自动保存,此时你可以到Program Units中找到过EPROCEDURE Clear_All_Master_DetailsQ然后在q个q程中找到语?
Clear_Block(ASK_COMMIT);
---- 其改ؓClear_Block(DO_COMMIT);可以了?
---- ?在Report开始时选择排序?
---- 在报表开始的Parameter Form中选择报表按哪个数据项排序Q?
---- 1. 先在USER PARAMETER 中创建SORT参数Qؓ字符型,?0?
---- 2. 初始值选’责L?然后这四个D入到DATA SELECTION中,形成列表?
---- 3. 然后处理QUERY中的SQL语句:
select CHARGER,FCO_NO,EM_NAME,FCO
_NO,DESCRIPTION, FCR_POINT
from FCR_MAIN
ORDER BY DECODE(:SORT,'责Q?,CHARGER,'FCO?,
FCO_NO,'FCR?,FCR_NO,'FCR?,EM_NAME)
---- ?在Developer 2000中如何读写操作系l文?
---- 在用Developer 2000的开发工具开发应用程序时Q经常碰到需要读写外部文件的问题Q可以用ORACLE 带的包TEXT_IO来完成这w求。例?
DECLARE
IN_FILE TEXT_IO.FILE_TYPE;
OUT_FILE TEXT_IO.FILE_TYPE;
LINE_BUFER VARCHAR2(80);
/*若不用IN_FILE,可以各字段联接在一赯值给此变?/
BEGIN
IN_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST1.TXT?’r?;
OUT_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST2.TXT?’w+?;
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);
TEXT_IO.PUT(LINE_BUFER);
TEXT_IO.NEW_LINE;
TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....?;
TEXT_IO.FCLOSE(IN_FILE);
TEXT_IO.FCLOSE(OUT_FILE);
END;
---- ?数据库管?
---- ?在删除一个表中的全部数据ӞM用TRUNCATE TABLE 表名;因ؓ用DROP TABLEQDELETE * FROM 表名ӞTABLESPACE表空间该表的占用I间q未释放Q反复几ơDROPQDELETE操作后,该TABLESPACE上百兆的I间p耗光了?
---- ?数据库文件的UdҎ
---- 当想数据库文gUd到另外一个目录下Ӟ可以用ALTER DATABASE命o来移?比ALTER TABLESPACE适用性强)Q?
---- 1. 使用SERVER MANAGER关闭实例.
SVRMGR > connect internal;
SVRMGR > shutdown;
SVRMGR >exit;
---- 2. 使用操作pȝ命o来移动数据库文g位置(假设q里操作pȝ为SOLARIS 2.6). 在UNIX中用 mv命o可以把文件移动到新的位置Q?
#mv /ora13/orarun/document.dbf /ora12/orarun
---- 3. 装蝲数据库ƈ用alter database命o来改变数据库中的文g?
SVRMGR > connect internal;
SVRMGR > startup mount RUN73;
SVRMGR > alter database rename file
> ? ora13/orarun/document.dbf?BR>> ? ora12/orarun/document.dbf?
---- 4. 启动实例.
SVRMGR > alter database open;
q个也许不算什么秘? 很多人大概都知道, 不过用过的h也许不多.
?.1.7版本(也许?16? 不太定)以后, sql*plus中有一个set markup html的命? 可以sql*plus的输Zhtml格式展现.
注意其中的spool on, 当在屏幕上输出的时? 我们看不Z不加spool on有什么区? 但是当我们用spool filename 输出到文件的时? 会看到spool文g中出C<html><body>{tag.
">scott@O9I.US.ORACLE.COM> spool c:emp.htm
<br>
">scott@O9I.US.ORACLE.COM> /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
......此处省略
">scott@O9I.US.ORACLE.COM> spool off
<br>
查看生成的emp.htm文g的内?
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=WINDOWS-936">
<meta name="generator" content="SQL*Plus 9.2.0">
<style type='text/css'> body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} p {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} table,tr,td {font:10pt Arial,Helvetica,sans-serif; color:Black; background:#f7f7e7; padding:0px 0px 0px 0px; margin:0px 0px 0px 0px;} th {font:bold 10pt Arial,Helvetica,sans-serif; color:#336699; background:#cccc99; padding:0px 0px 0px 0px;} h1 {font:16pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; border-bottom:1px solid #cccc99; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px;} h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif; color:#663300; background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;}</style><title>SQL*Plus Report</title>
</head>
<body>
">scott@O9I.US.ORACLE.COM> /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
EMPNO
</th>
<th scope="col">
ENAME
</th>
</tr>
<tr>
<td align="right">
7369
</td>
<td>
SMITH
</td>
</tr>
<tr>
<td align="right">
7499
</td>
<td>
ALLEN
</td>
</tr>
</table>
<p>
">scott@O9I.US.ORACLE.COM> spool off
<br>
</body>
</html>
用ie打开emp.htm文g后的样式如下:
现在看看spool off的情况下:
">scott@O9I.US.ORACLE.COM> set markup html on spool off
<br>
">scott@O9I.US.ORACLE.COM> spool c:emp2.htm
<br>
">scott@O9I.US.ORACLE.COM> /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script outpu
......此处省略
">scott@O9I.US.ORACLE.COM> spool off
<br>
">scott@O9I.US.ORACLE.COM>
查看生成的emp2.htm文g的内?
">scott@O9I.US.ORACLE.COM> /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
EMPNO
</th>
<th scope="col">
ENAME
</th>
</tr>
<tr>
<td align="right">
7369
</td>
<td>
SMITH
</td>
</tr>
<tr>
<td align="right">
7499
</td>
<td>
ALLEN
</td>
</tr>
</table>
<p>
">scott@O9I.US.ORACLE.COM> spool off
׃q段代码中没有html文g? 所以我们可以直接作为内Ҏ入到|页? 现在我们可以把q段代码攑ֈ下面作ؓCZ:
EMPNO | ENAME |
---|---|
7369 | SMITH |
7499 | ALLEN |
ȝ: 如果要生成一个完整的html文g, ׃用spool on选项, 如果只是要内定w?用来dC个现有的|页?, 那么׃用spool off选项.
另外, set markup htmlq有很多选项可以用来定制生成的html的各个部? 例如head, body, table{? q里不再逐一说明, 详细信息可以参考SQL*Plus User's Guide and Reference.
适用场景: 当需要定时更C个从数据库中获取内容的静态页面时, q种Ҏl对是快Lq且Ҏ实现?
比如? 你想查工资大?000的员工的信息, 输入了下面的语句:
scott@O9I.US.ORACLE.COM> select deptno, 2 empno, 3 ename 4 from emp 5 where
q时, 你发C想不h工资的列名是什么了.
q种情况? 只要在下一行以#开? 可以执行一条sql*plus命o, 执行完后, 刚才的语句可以l输?
scott@O9I.US.ORACLE.COM> select deptno, 2 empno, 3 ename 4 from emp 5 where 6 #desc emp
Name Null? Type ----------------------------------------- -------- -------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) 6 sal > 4000; DEPTNO EMPNO ENAME ---------- ---------- ---------- 10 7839 KING
select deptno, empno, ename from emp where empno = '7788';
如果拯到sql*plus中执? ׃出现错误:
scott@O9I.US.ORACLE.COM> select deptno, empno, ename 2 from emp 3 where empno = '7788'; SP2-0734: unknown command beginning "where empn..." - rest of line ignored.
原因是sqlplus遇到Ip为是语句l束?
其实要改变这U现? 只要使用SQLBLANKLINES参数可以了.
scott@O9I.US.ORACLE.COM> SET SQLBLANKLINES ON scott@O9I.US.ORACLE.COM> scott@O9I.US.ORACLE.COM> select deptno, empno, ename 2 from emp 3 4 where empno = '7788'; DEPTNO EMPNO ENAME ---------- ---------- ---------- 20 7788 SCOTT
scott@O9I.US.ORACLE.COM> set serveroutput on scott@O9I.US.ORACLE.COM> exec dbms_output.put_line(' abc'); abc PL/SQL procedure successfully completed.
(Z前曾l很苦恼Z保留I格, 试了加".", 加不可见字符{办? 不过l究觉得不自?
实际? 只要在set serveroutput on后加上format wrapped参数, 可以避免这个问?/P>
scott@O9I.US.ORACLE.COM> set serveroutput on format wrapped scott@O9I.US.ORACLE.COM> exec dbms_output.put_line(' abc'); abc PL/SQL procedure successfully completed.
备䆾cd |
备䆾Ҏ |
CZ |
数据文g |
操作pȝ命o或工?/SPAN> |
C:\COPY datafile1.ora datafile.bak |
归档重做日志文g |
操作pȝ命o或工?/SPAN> |
C:\COPY log_01_23.arc log_01_23.bak |
控制文g |
SQL命o |
SQL>ALTER DATABASE BACKUP CONTROLFILE TO confile.bak; |
初始化参数文?/SPAN> |
SQL命o |
SQL>CREATE PFILE=SIDinit.ora FROM SPFILE; |
|络配置与口令文?/SPAN> |
操作pȝ命o |
C:\COPY tnsnames.ora tnsnames.bak |
数据库逻辑对象Q表、烦引、存储过E等Q?/SPAN> |
Export工具 |
C:\EXPORT system/manager TABLE =hr.employees file=emp.dmp |
如果数据库运行在不归档模式下Q可以对数据库进行不一致的完全备䆾Q或者对某个表空间或数据文gq行单独的备份?/FONT>
如果数据库运行在不归档模式下Q只能在关闭状态下Ҏ据库q行一致的完全备䆾
一?SPAN style="FONT: 7pt 'Times New Roman'">
表空间或数据文g的脱机备?/SPAN>如果数据库运行在归档模式下,可以在打开状态下Ҏ据库中处于脱机状态的表空间或数据文gq行备䆾。在备䆾期间数据库中其它的表I间或数据文件仍然可以被用户使用?/SPAN>
SQL>ALTER TABLESPACE users OFFLINE NORMAL;
C:\COPY E:\oracle\oradata\users01.dbf F:\backup\users01.bak
SQL>ALTER TABLESPACE users ONLINE;
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
二?SPAN style="FONT: 7pt 'Times New Roman'"> 表空间或数据文g的联机备?/SPAN>
如果数据库运行在归档模式下,可以在打开状态下Ҏ据库中处于联机状态的表空间或数据文gq行备䆾。在备䆾期间q些表空间或数据文g仍然可以被用户用?/FONT>
SQL>ALTER TABLESPACE users BEGIN BACKUP;
C:\COPY E:\oracle\oradata\users01.dbf F:\backup\users01.bak
SQL>ALTER TABLESPACE users END BACKUP;
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
三?SPAN style="FONT: 7pt 'Times New Roman'"> 处理备䆾故障
如果在备份过E中发生故障Q导致备份突然中断,那么在下一ơ启动数据库时备份表I间的数据文件将会仍然处于备份模式下Q因?/SPAN>ORACLE会要求进行数据库恢复?/SPAN>
1?SPAN style="FONT: 7pt 'Times New Roman'"> 利用ALTER DATABASE END BACKUP语句退出备份模?/SPAN>
SQL>STARTUP MOUNT
SQL>SELECT * FROM V$BACKUP WHERE STATUS=’ACTIVE?/FONT>
(查询哪些数据文g处于备䆾模式)
SQL>ALTER DATABASE END BACKUP;
SQL>ALTER DATABASE OPEN;
2?SPAN style="FONT: 7pt 'Times New Roman'"> 利用RECOVER命o退出备份模?/SPAN>
SQL>STARTUP MOUNT
SQL>RECOVER DATABASE
SQL>ALTER DATABASE OPEN;
四?SPAN style="FONT: 7pt 'Times New Roman'"> 控制文g备䆾Zq制文g
SQL>ALTER DATABASE BACKUP CONTROLFILE TO
‘E:\backup\cfile.bak?SPAN style="mso-spacerun: yes"> REUSE;
五?SPAN style="FONT: 7pt 'Times New Roman'"> 控制文g备䆾到跟t文件中
SQL>ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
Q数据库处于加蝲状态时Q利用上面语句可以将控制文g备䆾到跟t文件中Q?/SPAN>