SQL*PLUS命令的使用大全
Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中,可以运行sql*plus命令与sql*plus语句。 <br /> 我们通常所说的DML、DDL、DCL语句都是sql*plus语句,它们执行完后,都可以保存在一个被称为sql buffer的内存区域中,并且只能保存一条最近执行的sql语句,我们可以对保存在sql buffer中的sql 语句进行修改,然后再次执行,sql*plus一般都与数据库打交道。 <br /> 除了sql*plus语句,在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后,不保存在sql buffer的内存区域中,它们一般用来对输出的结果进行格式化显示,以便于制作报表。 <br /> 下面就介绍一下一些常用的sql*plus命令: <br /><br />1. 执行一个SQL脚本文件 <br />SQL>start file_name <br />SQL>@ file_name <br />我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。 <br /><br />@与@@的区别是什么?<br />@等于start命令,用来运行一个sql脚本文件。<br />@命令调用当前目录下的,或指定全路径,或可以通过SQLPATH环境变量搜寻到的脚本文件。该命令使用是一般要指定要执行的文件的全路径,否则从缺省路径(可用SQLPATH变量指定)下读取指定的文件。<br />@@用在sql脚本文件中,用来说明用@@执行的sql脚本文件与@@所在的文件在同一目录下,而不用指定要执行sql脚本文件的全路径,也不是从SQLPATH环境变量指定的路径中寻找sql脚本文件,该命令一般用在脚本文件中。<br />如:在c:\temp目录下有文件start.sql和nest_start.sql,start.sql脚本文件的内容为:<br />@@nest_start.sql - - 相当于@ c:\temp\nest_start.sql<br />则我们在sql*plus中,这样执行:<br />SQL> @ c:\temp\start.sql <br /><br /><br />2. 对当前的输入进行编辑 <br />SQL>edit <br /><br />3. 重新运行上一次运行的sql语句 <br />SQL>/ <br /><br />4. 将显示的内容输出到指定文件 <br />SQL> SPOOL file_name <br /> 在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。 <br /><br />5. 关闭spool输出 <br />SQL> SPOOL OFF <br /> 只有关闭spool输出,才会在输出文件中看到输出的内容。 <br /><br />6.显示一个表的结构 <br />SQL> desc table_name <br /><br />7. COL命令: <br />主要格式化列的显示形式。 <br />该命令有许多选项,具体如下: <br />COL [{ column|expr} [ option ...]] <br />Option选项可以是如下的子句: <br />ALI alias <br />CLE <br />FOLD_A <br />FOLD_B <br />FOR format <br />HEA text <br />JUS {L|C|C|R} <br />LIKE { expr|alias} <br />NEWL <br />NEW_V variable <br />NOPRI|PRI <br />NUL text <br />OLD_V variable <br />ON|OFF <br />WRA|WOR|TRU <br /><br />1). 改变缺省的列标题 <br />COLUMN column_name HEADING column_heading <br />For example: <br />Sql>select * from dept; <br /> DEPTNO DNAME LOC <br />---------- ---------------------------- --------- <br /> 10 ACCOUNTING NEW YORK <br />sql>colLOC heading location <br />sql>select * from dept; <br />DEPTNO DNAME location <br />--------- ---------------------------- ----------- <br />10 ACCOUNTING NEW YORK <br /><br />2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上: <br />Sql>select * from emp <br />Departmentname Salary <br />---------- ---------- ---------- <br /> 10 aaa 11 <br />SQL> COLUMN ENAME HEADING ’Employee|Name’ <br />Sql>select * from emp <br /> Employee <br />Departmentname Salary <br />---------- ---------- ----------<br /> 10 aaa 11 <br />note: the col heading turn into two lines from one line. <br /><br />3). 改变列的显示长度: <br />FOR format <br />Sql>select empno,ename,job from emp; <br />EMPNO ENAMEJOB<br />---------- ---------- --------- <br /> 7369 SMITHCLERK<br /> 7499 ALLENSALESMAN <br />7521 WARD SALESMAN <br />Sql> col ename format a40 <br />EMPNO ENAME JOB <br />---------- ---------------------------------------- --------- <br /> 7369 SMITH CLERK <br /> 7499 ALLEN SALESMAN <br /> 7521 WARD SALESMAN <br /><br />4). 设置列标题的对齐方式 <br />JUS {L|C|C|R} <br />SQL> col ename justify center <br />SQL> / <br />EMPNO ENAME JOB <br />---------- ---------------------------------------- --------- <br /> 7369 SMITH CLERK <br /> 7499 ALLEN SALESMAN <br />7521 WARD SALESMAN <br />对于NUMBER型的列,列标题缺省在右边,其它类型的列标题缺省在左边 <br /><br />5). 不让一个列显示在屏幕上 <br />NOPRI|PRI <br />SQL> col job noprint <br />SQL> / <br />EMPNO ENAME <br />---------- ---------------------------------------- <br /> 7369 SMITH <br /> 7499 ALLEN <br />7521 WARD <br /><br />6). 格式化NUMBER类型列的显示: <br />SQL> COLUMN SAL FORMAT $99,990 <br />SQL> / <br />Employee <br />Department NameSalaryCommission <br />---------- ---------- --------- ---------- <br />30 ALLEN$1,600300 <br /><br />7). 显示列值时,如果列值为NULL值,用text值代替NULL值 <br />COMM NUL text <br />SQL>COL COMM NUL text <br /><br />8). 设置一个列的回绕方式 <br />WRA|WOR|TRU <br />COL1 <br />-------------------- <br />HOW ARE YOU? <br /><br />SQL>COL COL1 FORMAT A5 <br />SQL>COL COL1 WRAPPED <br />COL1 <br />----- <br />HOW A <br />RE YO <br />U? <br /><br />SQL> COL COL1 WORD_WRAPPED <br />COL1 <br />----- <br />HOW <br />ARE <br />YOU? <br /><br />SQL> COL COL1 WORD_WRAPPED <br />COL1 <br />----- <br />HOW A <br /><br />9). 显示列的当前的显示属性值 <br />SQL> COLUMN column_name <br /><br />10). 将所有列的显示属性设为缺省值 <br />SQL> CLEAR COLUMNS <br /><br />8. 屏蔽掉一个列中显示的相同的值 <br />BREAK ON break_column <br />SQL> BREAK ON DEPTNO <br />SQL> SELECT DEPTNO, ENAME, SAL <br />FROM EMP <br />WHERE SAL < 2500 <br />ORDER BY DEPTNO; <br />DEPTNOENAME SAL <br />---------- ----------- --------- <br />10 CLARK2450 <br />MILLER1300 <br />20 SMITH 800 <br />ADAMS 1100 <br /><br />9. 在上面屏蔽掉一个列中显示的相同的值的显示中,每当列值变化时在值变化之前插入n个空行。 <br />BREAK ON break_column SKIP n <br /><br />SQL> BREAK ON DEPTNO SKIP 1 <br />SQL> / <br />DEPTNO ENAME SAL <br />---------- ----------- --------- <br />10 CLARK 2450 <br />MILLER 1300 <br /><br />20 SMITH 800 <br />ADAMS 1100 <br /><br />10. 显示对BREAK的设置 <br />SQL> BREAK <br /><br />11. 删除6、7的设置 <br />SQL> CLEAR BREAKS <br /><br />12. Set 命令: <br />该命令包含许多子命令: <br />SET system_variable value <br />system_variable value 可以是如下的子句之一: <br />APPI{ON|OFF|text} <br />ARRAY {15|n} <br />AUTO{ON|OFF|IMM|n} <br />AUTOP {ON|OFF} <br />AUTORECOVERY <br />AUTOT {ON|OFF|TRACE} ] ] <br />BLO {.|c} <br />CMDS {;|c|ON|OFF} <br />COLSEP {_|text} <br />COM{V7|V8|NATIVE} <br />CON {.|c|ON|OFF} <br />COPYC {0|n} <br />COPYTYPECHECK {ON|OFF} <br />DEF {&|c|ON|OFF} <br />DESCRIBE <br />ECHO {ON|OFF} <br />EDITF file_name[.ext] <br />EMB {ON|OFF} <br />ESC {\|c|ON|OFF} <br />FEED {6|n|ON|OFF} <br />FLAGGER {OFF|ENTRY |INTERMED|FULL} <br />FLU {ON|OFF} <br />HEA {ON|OFF} <br />HEADS {||c|ON|OFF} <br />INSTANCE <br />LIN {80|n} <br />LOBOF {n|1} <br />LOGSOURCE <br />LONG {80|n} <br />LONGC {80|n} <br />MARK HTML {ON|OFF}] <br />NEWP {1|n|NONE} <br />NULL text <br />NUMF format <br />NUM {10|n} <br />PAGES {24|n} <br />PAU {ON|OFF|text} <br />RECSEP {WR|EA|OFF} <br />RECSEPCHAR {_|c} <br />SERVEROUT {ON|OFF} {WRA|WOR|TRU}] <br />SHIFT {VIS|INV} <br />SHOW {ON|OFF} <br />SQLBL {ON|OFF} <br />SQLC {MIX|LO|UP} <br />SQLCO {> |text} <br />SQLN {ON|OFF} <br />SQLPRE {#|c} <br />SQLP {SQL>|text} <br />SQLT {;|c|ON|OFF} <br />SUF {SQL|text} <br />TAB {ON|OFF} <br />TERM {ON|OFF} <br />TI {ON|OFF} <br />TIMI {ON|OFF} <br />TRIM {ON|OFF} <br />TRIMS {ON|OFF} <br />UND {-|c|ON|OFF} <br />VER {ON|OFF} <br />WRA {ON|OFF} <br /><br />1). 设置当前session是否对修改的数据进行自动提交 <br />SQL>SET AUTO {ON|OFF|IMM| n} <br /><br />2).在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句 <br />SQL> SET ECHO {ON|OFF} <br /><br />3).是否显示当前sql语句查询或修改的行数 <br />SQL> SET FEED {6|n|ON|OFF} <br /> 默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ,则不管查询到多少行都返回。当为off 时,一律不显示查询的行数 <br /><br />4).是否显示列标题 <br />SQL> SET HEA {ON|OFF} <br />当set heading off 时,在每页的上面不显示列标题,而是以空白行代替 <br /><br />5).设置一行可以容纳的字符数 <br />SQL> SET LIN {80|n} <br /> 如果一行的输出内容大于设置的一行可容纳的字符数,则折行显示。 <br /><br />6).设置页与页之间的分隔 <br />SQL> SET NEWP {1|n|NONE} <br />当set newpage 0 时,会在每页的开头有一个小的黑方框。 <br />当set newpage n 时,会在页和页之间隔着n个空行。 <br />当set newpage none 时,会在页和页之间没有任何间隔。 <br /><br />7).显示时,用text值代替NULL值 <br />SQL> SET NULL text <br /><br />8).设置一页有多少行数 <br />SQL> SET PAGES {24|n} <br />如果设为0,则所有的输出内容为一页并且不显示列标题 <br /><br />9).是否显示用DBMS_OUTPUT.PUT_LINE包进行输出的信息。 <br />SQL> SET SERVEROUT {ON|OFF}<br />在编写存储过程时,我们有时会用dbms_output.put_line将必要的信息输出,以便对存储过程进行调试,只有将serveroutput变量设为on后,信息才能显示在屏幕上。 <br /><br />10).当SQL语句的长度大于LINESIZE时,是否在显示时截取SQL语句。 <br />SQL> SET WRA {ON|OFF} <br /> 当输出的行的长度大于设置的行的长度时(用set linesize n命令设置),当set wrap on时,输出行的多于的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。 <br /><br />11).是否在屏幕上显示输出的内容,主要用与SPOOL结合使用。 <br />SQL> SET TERM {ON|OFF} <br /> 在用spool命令将一个大表中的内容输出到一个文件中时,将内容输出在屏幕上会耗费大量的时间,设置set termspool off后,则输出的内容只会保存在输出文件中,不会显示在屏幕上,极大的提高了spool的速度。 <br /><br />12).将SPOOL输出中每行后面多余的空格去掉 <br />SQL> SET TRIMS {ON|OFF}<br /><br />13)显示每个sql语句花费的执行时间 <br />set TIMING{ON|OFF} <br /><br />14). 遇到空行时不认为语句已经结束,从后续行接着读入。<br />SET SQLBLANKLINES ON<br />Sql*plus中, 不允许sql语句中间有空行, 这在从其它地方拷贝脚本到sql*plus中执行时很麻烦. 比如下面的脚本:<br />select deptno, empno, ename<br />from emp<br /><br />where empno = '7788';<br />如果拷贝到sql*plus中执行, 就会出现错误。这个命令可以解决该问题<br /><br />15).设置DBMS_OUTPUT的输出<br />SET SERVEROUTPUT ON BUFFER 20000<br />用dbms_output.put_line('strin_content');可以在存储过程中输出信息,对存储过程进行调试<br />如果想让dbms_output.put_line(' abc');的输出显示为:<br />SQL> abc,而不是SQL>abc,则在SET SERVEROUTPUT ON后加format wrapped参数。<br /><br />16). 输出的数据为html格式<br />set markup html<br />在8.1.7版本(也许是816? 不太确定)以后, sql*plus中有一个set markup html的命令, 可以将sql*plus的输出以html格式展现.<br />注意其中的spool on, 当在屏幕上输出的时候, 我们看不出与不加spool on有什么区别, 但是当我们使用spool filename 输出到文件的时候, 会看到spool文件中出现了等tag.<br /><br /><br />14.修改sql buffer中的当前行中,第一个出现的字符串 <br />C /old_value/new_value <br />SQL> l <br /> 1* select * from dept <br />SQL> c/dept/emp <br /> 1* select * from emp <br /><br />15.编辑sql buffer中的sql语句 <br />EDI <br /><br />16.显示sql buffer中的sql语句,list n显示sql buffer中的第n行,并使第n行成为当前行 <br />L <br /><br />17.在sql buffer的当前行下面加一行或多行 <br />I <br /><br />18.将指定的文本加到sql buffer的当前行后面 <br />A <br />SQL> select deptno, <br /> 2dname <br /> 3from dept; <br /> DEPTNO DNAME <br />---------- -------------- <br /> 10 ACCOUNTING <br /> 20 RESEARCH <br /> 30 SALES <br /> 40 OPERATIONS <br /><br />SQL> L 2 <br /> 2* dname <br />SQL> a ,loc <br /> 2* dname,loc <br />SQL> L <br /> 1select deptno, <br /> 2dname,loc <br /> 3* from dept <br />SQL> / <br /><br /> DEPTNO DNAME LOC <br />---------- -------------- ------------- <br /> 10 ACCOUNTING NEW YORK <br /> 20 RESEARCH DALLAS <br /> 30 SALES CHICAGO <br /> 40 OPERATIONS BOSTON <br /><br />19.将sql buffer中的sql语句保存到一个文件中 <br />SAVE file_name <br /><br />20.将一个文件中的sql语句导入到sql buffer中 <br />GET file_name <br /><br />21.再次执行刚才已经执行的sql语句 <br />RUN <br />or <br />/ <br /><br />22.执行一个存储过程 <br />EXECUTE procedure_name <br /><br />23.在sql*plus中连接到指定的数据库 <br />CONNECT user_name/passwd@db_alias <br /><br />24.设置每个报表的顶部标题 <br />TTITLE <br /><br />25.设置每个报表的尾部标题 <br />BTITLE <br /><br />26.写一个注释 <br />REMARK <br /><br />27.将指定的信息或一个空行输出到屏幕上 <br />PROMPT <br /><br />28.将执行的过程暂停,等待用户响应后继续执行 <br />PAUSE <br /><br />Sql>PAUSE Adjust paper and press RETURN to continue. <br /><br />29.将一个数据库中的一些数据拷贝到另外一个数据库(如将一个表的数据拷贝到另一个数据库) <br />COPY {FROM database | TO database | FROM database TO database} <br />{APPEND|CREATE|INSERT|REPLACE} destination_table <br />[(column, column, column, ...)] USING query <br /><br />sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST<br />create emp_temp <br />USING SELECT * FROM EMP <br /><br />30.不退出sql*plus,在sql*plus中执行一个操作系统命令: <br />HOST <br /><br />Sql> host hostname <br />该命令在windows下可能被支持。 <br /><br />31.在sql*plus中,切换到操作系统命令提示符下,运行操作系统命令后,可以再次切换回sql*plus: <br />! <br /><br />sql>! <br />$hostname <br />$exit <br />sql> <br /><br />该命令在windows下不被支持。 <br /><br />32.显示sql*plus命令的帮助 <br />HELP <br />如何安装帮助文件: <br />Sql>@ ?\sqlplus\admin\help\hlpbld.sql ?\sqlplus\admin\help\helpus.sql <br />Sql>help index <br /><br />33.显示sql*plus系统变量的值或sql*plus环境变量的值 <br />Syntax <br />SHO option <br />where option represents one of the following terms or clauses: <br />system_variable <br />ALL <br />BTI <br />ERR [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY| <br />TRIGGER|VIEW|TYPE|TYPE BODY} name] <br />LNO <br />PARAMETERS <br />PNO <br />REL <br />REPF <br />REPH <br />SGA <br />SPOO <br />SQLCODE <br />TTI <br />USER <br /><br />1) . 显示当前环境变量的值: <br />Show all <br /><br />2) . 显示当前在创建函数、存储过程、触发器、包等对象的错误信息 <br />Show error <br />当创建一个函数、存储过程等出错时,变可以用该命令查看在那个地方出错及相应的出错信息,进行修改后再次进行编译。 <br /><br />3) . 显示初始化参数的值: <br />show PARAMETERS <br /><br />4) . 显示数据库的版本: <br />show REL <br /><br />5) . 显示SGA的大小 <br />show SGA <br /><br />6). 显示当前的用户名 <br />show user<br /><br />34.查询一个用户下的对象<br />SQL>select * from tab;<br />SQL>select * from user_objects;<br /><br />35.查询一个用户下的所有的表<br />SQL>select * from user_tables;<br /><br />36.查询一个用户下的所有的索引<br />SQL>select * from user_indexes;<br /><br /><br />37. 定义一个用户变量<br />方法有两个:<br />a. define<br />b. COL [{column|expr} NEW_V variable |PRI]<br /> OLD_V variable|PRI]<br /><br />下面对每种方式给予解释:<br />a. Syntax<br />DEF |<br />定义一个用户变量并且可以分配给它一个CHAR值。<br /><br />assign the value MANAGER to the variable POS, type:<br />SQL> DEFINE POS = MANAGER<br /><br />assign the CHAR value 20 to the variable DEPTNO, type:<br />SQL> DEFINE DEPTNO = 20<br /><br />list the definition of DEPTNO, enter<br />SQL> DEFINE DEPTNO<br /> ―――――――――――――――<br />DEFINE DEPTNO = ”20” (CHAR)<br /><br />定义了用户变量POS后,就可以在sql*plus中用&POS或&&POS来引用该变量的值,sql*plus不会再提示你给变量输入值。<br /><br />b. COL [{column|expr} NEW_V variable |PRI]<br />NEW_V variable<br />指定一个变量容纳查询出的列值。<br />例:column col_name new_value var_name noprint<br /> select col_name from table_name where ……..<br />将下面查询出的col_name列的值赋给var_name变量.<br /><br />一个综合的例子:<br />得到一个列值的两次查询之差(此例为10秒之内共提交了多少事务):<br />column redo_writes new_value commit_count<br /><br />select sum(stat.value) redo_writes<br />from v$sesstat stat, v$statname sn<br />where stat.statistic# = sn.statistic#<br />and sn.name = 'user commits';<br /><br />-- 等待一会儿(此处为10秒);<br />execute dbms_lock.sleep(10);<br /><br />set veri off<br />select sum(stat.value) - &commit_count commits_added<br />from v$sesstat stat, v$statname sn<br />where stat.statistic# = sn.statistic#<br />and sn.name = 'user commits';<br /><br /><br />38. 定义一个绑定变量<br />VAR ]<br />定义一个绑定变量,该变量可以在pl/sql中引用。<br />可以用print命令显示该绑定变量的信息。<br />如:<br />column inst_numheading "Inst Num"new_value inst_numformat 99999;<br />column inst_name heading "Instance"new_value inst_name format a12;<br />column db_name heading "DB Name" new_value db_name format a12;<br />column dbidheading "DB Id" new_value dbidformat 9999999999 just c;<br /><br />prompt<br />prompt Current Instance<br />prompt ~~~~~~~~~~~~~~~~<br /><br />select d.dbid dbid<br /> , d.name db_name<br /> , i.instance_number inst_num<br /> , i.instance_name inst_name<br />from v$database d,<br /> v$instance i;<br /><br />variable dbid number;<br />variable inst_num number;<br />begin<br />:dbid:=&dbid;<br />:inst_num:=&inst_num;<br />end;<br />/<br />说明:<br />在sql*plus中,该绑定变量可以作为一个存储过程的参数,也可以在匿名PL/SQL块中直接引用。为了显示用VARIABLE命令创建的绑定变量的值,可以用print命令<br /><br />注意:<br />绑定变量不同于变量:<br />1. 定义方法不同<br />2. 引用方法不同<br />绑定变量::variable_name<br /> 变量:&variable_name or &&variable_name<br />3.在sql*plus中,可以定义同名的绑定变量与用户变量,但是引用的方法不同。<br /><br />39. &与&&的区别<br />&用来创建一个临时变量,每当遇到这个临时变量时,都会提示你输入一个值。<br />&&用来创建一个持久变量,就像用用define命令或带new_vlaue字句的column命令创建的持久变量一样。当用&&命令引用这个变量时,不会每次遇到该变量就提示用户键入值,而只是在第一次遇到时提示一次。<br /><br />如,将下面三行语句存为一个脚本文件,运行该脚本文件,会提示三次,让输入deptnoval的值:<br />select count(*) from emp where deptno = &deptnoval;<br />select count(*) from emp where deptno = &deptnoval;<br />select count(*) from emp where deptno = &deptnoval;<br /><br />将下面三行语句存为一个脚本文件,运行该脚本文件,则只会提示一次,让输入deptnoval的值:<br />select count(*) from emp where deptno = &&deptnoval;<br />select count(*) from emp where deptno = &&deptnoval;<br />select count(*) from emp where deptno = &&deptnoval;<br /><br />40.在输入sql语句的过程中临时先运行一个sql*plus命令(摘自www.itpub.com)<br />#<br />有没有过这样的经历? 在sql*plus中敲了很长的命令后, 突然发现想不起某个列的名字了, 如果取消当前的命令,待查询后再重敲, 那太痛苦了. 当然你可以另开一个sql*plus窗口进行查询, 但这里提供的方法更简单.<br /><br />比如说, 你想查工资大于4000的员工的信息, 输入了下面的语句:<br /><br />SQL> select deptno, empno, ename<br />2 from emp<br />3 where<br />这时, 你发现你想不起来工资的列名是什么了.<br /><br />这种情况下, 只要在下一行以#开头, 就可以执行一条sql*plus命令, 执行完后, 刚才的语句可以继续输入<br /><br />SQL>> select deptno, empno, ename<br />2 from emp<br />3 where<br />6 #desc emp<br />Name Null? Type<br />----------------------------------------- -------- --------------<br />EMPNO NOT NULL NUMBER(4)<br />ENAME VARCHAR2(10)<br />JOB VARCHAR2(9)<br />MGR NUMBER(4)<br />HIREDATE DATE<br />SAL NUMBER(7,2)<br />COMM NUMBER(7,2)<br />DEPTNO NUMBER(2)<br /><br />6 sal > 4000;<br /><br />DEPTNO EMPNO ENAME<br />---------- ---------- ----------<br />10 7839 KING<br /><br />41. SQLPlus中的快速复制和粘贴技巧(摘自www.cnoug.org)<br />1) 鼠标移至想要复制内容的开始 <br />2) 用右手食指按下鼠标左键 <br />3) 向想要复制内容的另一角拖动鼠标,与Word中选取内容的方法一样 <br />4) 内容选取完毕后(所选内容全部反显),鼠标左键按住不动,用右手中指按鼠标右键 <br />5) 这时,所选内容会自动复制到SQL*Plus环境的最后一行<br />
页:
[1]