显示标签为“oracle”的博文。显示所有博文

Query the views v$database and v$thread.

V$DATABASE gives DB_NAME
V$THREAD gives ORACLE_SID

If ORACLE_SID = DB_SID and db_name = DBNAME:

To find the current value of ORACLE_SID:

SVRMGR> select instance from v$thread;

INSTANCE
----------------
DB_SID

To find the current value of DB_NAME:

SVRMGR> select name from v$database;

NAME
---------
DBNAME

例:
在当前Windows系统下装了一个VMware工具,在这个VMware下装了一个Linux,名字为Centos46,Linux虚拟机的IP地址是:192.168.2.101。

需求:在Windows这边通过IE浏览器来访问Linux端Oracle的OEM。

首先,进入Oracle用户,看一下控制台启动没有:
emctl status dbconsole

如果没启动
emctl start dbconsole

看看端口信息:
cat $ORACLE_HOME/install/portlist.ini

最后就可以访问了。http://192.168.2.101:1158/em/

注:必须用IP,用计算机名不行,比如Linux的计算机名是Centos46,这个在Windows端不认。

————————————

解决oracle10g安装后的中文显示乱码

1. 改变$ORACLE_HOME/jdk目录下的jre的默认字体

cd $ORACLE_HOME/jdk/jre/lib/

ls font*zh_CN*
font.properties是默认使用的字体
还可以看到font.properties.zh_CN.Redhat8.0和其它的字体
cp font.properties font.properties.bak
cp font.properties.zh_CN.Redhat8.0 font.properties

2. 改变$ORACLE_HOME/jre下的默认字体
cd $ORACLE_HOME/jre/1.4.2/lib/
ls font*zh_CN*
font.properties是默认使用的字体
还可以看到font.properties.zh_CN.Redhat8.0和其它的字体
cp font.properties font.properties.bak
cp font.properties.zh_CN.Redhat8.0 font.properties

3.删除Cache下的gif文件(em页面中用到),注意不要删错目录
cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/applications/em/em/cabo/images/cache/zhs/
ls *.gif
rm -f *.gif

4. 重新启动EM服务
cd $ORACLE_HOME/bin/
./emctl stop dbconsole
./emctl start dbconsole

好可以进入em web页面看看是否中文不再是 "□□"字样的乱码了

1,查看当前过程和函数的对象名,创建时间和状态。
select object_name,created,status from user_objects where object_type in ('PROCEDURE','FUNCTION');

2,列出子程序源代码。
select text from user_source where name = 'RAISE_SALARY';

3,列出子程序编译错误。
1)使用SHOW ERRORS命令查错:
show errors procedure raise_salary
2)使用数据字典视图USER_ERRORS确定错误原因和位置:
select line ||'/'||position as "LINE/COL",text error from user_errors where name = 'RAISE_SALARY';

4,列出对象依赖关系。
1)使用user_dependencies确定直接依赖关系。
select name,type from user_dependencies where referenced_name = 'EMP';
2)使用工具视图DEPTREE和IDEPTREE确定直接依赖和间接依赖关系。
运行系统SQL脚本。
SQL>@%oracle_home%\rdbms\admin\utldtree
SQL>exec deptree_fill('TABLE','SCOTT','EMP')
SQL>select nested_level,name,type from deptree;

5,从新编译子程序。
当修改了被引用对象的结构时,就会将相关依赖对象转变为无效。
SQL> alter table emp add remark varchar2(100);
SQL> select object_name,object_type from user_objects where status = 'INVALID';
为了避免子程序的运行错误,因该重新编译这些存储对象。
SQL> ALTER PROCEDURE add_employee COMPILE;
SQL> ALTER VIEW dept10 COMPILE;
SQL> ALTER FUNCTION get_info COMPILE;

就一句话就概括了:

内连都不空左连左不空右连右不空全连全可空(不可全空)

另:右连接(+)在左边;左连接(+)在右边

设置列宽和长度
SQL> set linesize 300
SQL> set pagesize 100

将所有列的显示属性设为缺省值
SQL> CLEAR COLUMNS

Oracle自带的函数不少。有很多很有用。下面找两个关于查看字符集和ascii码的函数。

1,查看字符a和A的ascii码。
select ascii('a') "a",ascii('A') "A" from dual;
a A
---------- ----------
97 65

2,查看ascii码65和97的对应的字符。
select chr(65),chr(97) from dual;
C C
- -
A a

1,查看nls_date_language当前值。这个跟一些函数有关系,比如日期类型什么的。
select * from nls_database_parameters where parameter=UPPER('nls_date_language');

2,改变当前会话的nls_date_language。
alter session set nls_date_language='simplified chinese';

朋友现场要做PL/SQL的DEBUG,工具选择了PL/SQL Developer,回家后跟我说不行,一DEBUG就出错,我刚开始以为是工具的问题,哪里出了毛病。这几天一直玩Oracle SQL Developer,就推荐朋友用这个工具试试。

但是,我也没有用过Oracle SQL Developer做过PL/SQL的DEBUG,只记得这个工具提供了这个功能。于是一起推敲了一下。用SCOTT用户连接到了数据库,做了一个Procedure,一DEBUG的时候(就点那个小虫子),就提示一条信息:

ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_DEBUG_JDWP", line 68
ORA-06512: at line 1
This session requires DEBUG CONNECT SESSION and DEBUG ANY PROCEDURE user privileges.
Process exited.

刚开始一直忽视这个消息,后来实在憋得不行了,去网上查了查,找到了答案,原来SCOTT用户权限不够,没有DEBUG的权限。朋友的现场出现的状况和这个一样,原来根本就不是工具的问题(哪里会是工具的问题呢?呵呵)。解决方案如下:

◆Connect to the default database as SYSTEM.
◆Run "GRANT debug any procedure, debug connect session TO SCOTT;".
◆Re-connect to the default database as SCOTT.

之后不用说,用SCOTT用户去尽情的DEBUG吧。

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)


既要显示部门的平均工资,也要显示岗位的平均工资。那么可以使用GROUPING SET函数。

SQL> select deptno,job,avg(sal) from emp group by grouping sets(deptno,job);

DEPTNO JOB AVG(SAL)
---------- --------- ----------
CLERK 1037.5
SALESMAN 1400
PRESIDENT 5000
MANAGER 2758.33333
ANALYST 3000
30 1566.66667
20 2175
10 2916.66667

8 rows selected.

在Oracle中,可以执行顺序事务来使得用户能够取得特定时间点的数据。

当然,用只读事务(SET TRANSACTION READ ONLY;)也可以达到同样的目的,但是使用只读事务后,当前会话将不能执行INSERT/UDDATE/DELETE语句。为了能够取得特定时间点的数据并且要求同样能够使用DML语句,就可以使用顺序事务。

示例如下:

当前存在两个回话:会话A和会话B。执行顺序如下所示。

会话A:
①SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
②select losal from salgrade where grade = '1';(结果:1100)

回话B:
①update salgrade set losal = '1200' where grade = '1';
②commit;

会话A:
③select losal from salgrade where grade = '1';(结果:1100)
④update salgrade set losal = '1200' where grade = '2';(结果:执行成功)
⑤update salgrade set losal = '1300' where grade = '1';(结果:执行失败)

★当设置事务顺序时,该语句必须是事务开始的第一条语句。

安装Oracle的时候,系统检测时很可能会提示没有发现libaio的问题,不要以为系统已经安装好了,只是版本不同而已,这个想法是错误的。这个时候而是确确实实需要手动的把这个包给安装上。安装系统本身的libaio包就可以,不需要安装和提示一样的版本也可以。

如果不安装的话,在稍后的运行dbca(建库)的时候,会出现【ORA-12547: TNS:lost contact】的错误。这个错误不能忽视,否则会导致数据库安装不成功。

为了编写正确和高效的PL/SQL代码,PL/SQL开发人员必须遵循特定的编写规则。

1,标识符命名规则
必须以字符开始,并且长度不能超过30个字符,另外,Oracle建议用户按照以下规则定义标识符:

◆当定义变量时,建议使用v_作为前缀,例如,v_sal,v_job等。
◆当定义常量时,建议使用c_作为前缀,例如,c_rate。
◆当定义游标时,建立使用_cursor作为后缀,例如,emp_cursor。
◆当定义例外时,建议使用e_作为前缀,例如,e_integrity_error。
◆当定义PL/SQL表类型时,建议使用_table_type作为后缀,例如,sal_table_type。
◆当定义PL/SQL表变量时,建议使用_table作为后缀,例如,sal_table。
◆当定义PL/SQL记录类型时,建议使用_record_type作为后缀,例如,emp_record_type。
◆当定义PL/SQL记录变量时,建议使用_record作为后缀,例如,emp_record。

2,大小写规则
当在PL/SQL块中编写SQL语句和PL/SQL语句时,语句既可以使用大写格式,也可以使用小写格式,但是为了提高程序的可读性和性能,Oracle建议按照以下规则编写代码:

◆SQL关键字采用大写格式,例如SELECT,UPDATE,SET,WHERE等。
◆PL/SQL关键字采用大写格式,例如DECLARE,BEGIN,END等。
◆数据类型采用大写格式,例如INT,VARCHAR2,DATE等。
◆标识符和参数采用小写格式,例如v_sal,c_rate等。
◆数据库对象和列采用小写形式,例如emp,sal,ename等。

3,代码缩进
类似其它语言,同级代码对齐。

4,嵌套块和变量范围
被嵌入的块成为子块,而包含子块的PL/SQL块成为主块,子块定义的是局部标识符(局部变量),主块不能引用。而主块恰好相反。

5,在PL/SQL块中可以使用SQL函数
在编写PL/SQL块的时候,可以引用大多数的SQL函数。但是某些SQL函数只能在SQL语句中引用,而不能直接在PL/SQL块中引用。这些函数包括GREATEST,LEAST,DECODE以及所有分组函数(例如SUM)。

不来概念了,改天还需要理解的时间,直接上例子,来看一下简单的过程与函数的创建方法与如何执行。
(以SCOTT用户数据库为例)

1,过程

CREATE OR REPLACE
PROCEDURE insert_dept
(
no NUMBER,
name VARCHAR2)
IS
BEGIN
INSERT INTO dept
(deptno,dname
) VALUES
(no,name
);
END;
过程已创建
SQL>exec insert_dept(50,'SALES')
PL/SQL过程已成功完成。

2,函数

CREATE OR REPLACE
FUNCTION get_sal(no NUMBER)
RETURN NUMBER
IS
SALARY NUMBER(6,2);
BEGIN
SELECT sal INTO salary FROM emp WHERE empno = no;
RETURN salary;
END;
函数已创建
SQL>VAR salary NUMBER;
SQL>exec :salary:=get_sal(7566)
PL/SQL过程已成功完成。
SQL>PRINT salary
salary
----
2975

用命令行Sqlplus模式远程连接Oracle数据库的命令行如下所示:

1,以数据库管理员身份连接
sqlplus sys/110@192.168.2.101:1251/gaoyu.com as sysdba

2,以普通用户(以scott用户为例)身份链接
sqlplus scott/tiger@192.168.2.101:1521/gaoyu.com


上图是在本地Windows下用SQL*Plus工具连接远程的Oracle时的示意图,用户名和密码依次添好后,在第三行文字列处添加远程服务器的地址和端口号,后面反斜杠加上数据库名就可以了。

之前作为一个Oracle Employee,却总是在使用PL/SQL Developer(而且是破解版),这实在有些说不过去,但是如何找到一个合心趁手的能够在有条件的情况下比SQL*PLUS更方便的工具却实在不是一件简单的事情,以前期待tora被Quest收购以后会有长足发展,可惜,并没有看到最终的结果。

之前曾经说过,PL/SQL Developer对于我最难以割舍的是code insight功能,当你记不住表、性能视图或者存储过程、函数的全名,PL/SQL Developer将会在你输入了几个字母之后自动提示。TOAD发展了那么多年,却一直没有提供相类似的功能。

但是现在完全免费的替代产品出现了,这就是Oracle SQL Developer,Oracle官方出品的开发工具,当然这个工具并不是今年才推出的,现在最新版本已经是1.5.1.54.40,但是,最早的1.0版本并不是那么好用,而现在,我可以郑重地推荐它了。

请注意,这个工具是完全免费的,可以通过这个链接下载。

以一个普通使用者(甚至说是一个并不是着重在开发上的数据库管理员)的身份比较一下Oracle SQL Developer和PL/SQL Developer。

1. 格式化的结果输出。
这一点任何一个第三方工具都做得不错,是一个基本功能。

2. 自动提示。
也就是上面提到的Code Insight功能,可以说,Oracle SQL Developer拥有的功能以及速度绝对不亚于PL/SQL Developer,甚至有更人性化的表现。比如当你键入select * from,空格之后,Oracle SQL Developer会立刻给出一个当前用户下的所有Table的列表,如果继续键入比如DBA三个字母,那么列表将转换为DBA打头的所有数据字典。而如果你从一行的开头键入exec四个字母,那么当回车以后,Oracle SQL Developer会立刻给出一份所有可以执行的存储过程的列表。

3. 代码美化功能。
所有使用过PL/SQL Developer的朋友们应该都知道在最近这几版中都有一个PL/SQL Beautifier的功能,可以将一大串SQL语句格式化更容易阅读的样式。同样Oracle SQL Developer也提供了这样的功能,称之为Format,快捷键是Ctrl+F7。

4. 显示SQL的执行计划。
在Oracle SQL Developer中快捷键是F6,同时也提供了显示Autotrace的结果,快捷键是F10(最新版本中似乎有点儿小bug,有时候需要按两次F10才能显示)

5. 会话监控。
在PL/SQL Developer中我们可以显示当前数据库中的所有会话,点击某一个会话,在下方会显示该会话正在执行的SQL,正在经历的等待事件以及其它一些可以自定义的感兴趣的信息,Oracle SQL Developer同样提供了这个功能,可以在Tools -> Monitor Sessions菜单中找到它。

6. 快捷显示对象信息。
比如写了一条SQL语句,其中牵涉到一张表,我们可能会想立刻看到这张表有哪些字段,这张表上有哪些约束哪些索引,如果是分区表有哪些分区,在 PL/SQL Developer中我们会选中SQL语句中这张表的名字,然后右键 -> View,同样Oracle SQL Developer也提供了这个功能,同样可以鼠标右键选中表名 -> Popup Describe,另外还有快捷键Shift+F4。

7. 编写以及调试存储过程。
我并不有太多的机会去编写一个很长的存储过程,因此这点我不敢对PL/SQL Developer和Oracle SQL Developer做过多的比较,但是我知道好几个版本的PL/SQL Developer(包括最新版)在编译存储过程的某些特定语句的时候会导致ORA-600错误,而在SQL*Plus里面直接编译则完全没有问题,很多客户出现了这个问题寻求我们的帮助,而我们的回答是,抱歉,这是PL/SQL Developer的问题我们不做技术支持,但是如果你要是改用了Oracle SQL Developer呢?恭喜你,虽然这是个免费的产品,但是仍然可以得到原厂商的技术支持。

好吧,具有了上述这些功能,至少对于我来说,Oracle SQL Developer已经完全具备了日常管理数据库的所有需要点,而且用起来一点儿也不觉得别扭,只是可能快捷键的改变需要适应一下。比如在PL/SQL Developer中执行一个SQL是F8,而Oracle SQL Developer则是F9,显示执行计划一个是F5而另外一个是F6,但是这都是小问题,不是吗?要知道人生总是在不断变化的,呵呵。

接下来是Oracle SQL Developer的闪光点,这些闪光点会让Oracle SQL Developer更加可爱。

1. 自动更新。
Help -> Check for updates,将会自动将Oracle SQL Developer更新到最新的版本,包括多种插件。

2. 插件。
这是多么令人兴奋的功能,要知道,在浏览器领域的Firefox,在Java开发工具领域的Eclipse,都是因为支持插件(或者称之为扩展)体系,并且有大量丰富的插件才成为了焕然一新的工具,噢,我知道PL/SQL Developer也是支持Plugins的,但是这么多年了,Plugins始终只有那几个。而Oracle SQL Developer才推出多久,我们已经可以看到像Fourth Elephant的Insider这样强大的扩展了,Insider一眼看上去简直就是一个Quest Spotlight for Oracle,虽然我对这个插件不是那么感兴趣,但是你得承认它确实很强大。

3. 跨平台。
PL/SQL Developer只能在Windows上使用,而Oracle SQL Developer目前已经支持了Windows,Mac OS X,Linux,这得益于Java的跨平台特性,好吧,我承认Java用于桌面应用确实速度有些让人不满意,但是对于Oracle SQL Developer来说,仅仅是启动速度有些慢而已,实际使用中仍然是行云流水的。

4. Reports。
一个新安装的Oracle SQL Developer就已经包含了一个Reports标签页,内置了一部分可以用于数据库管理的脚本,并且可以允许使用者自定义自己需要日常使用的脚本,而且支持复杂的父子视图效果,就是类似于Session Viewer的效果,点击父结果中的某一行,能够将更详细的关联信息显示在子结果中。每个DBA都有自己积累的一套SQL,你可以将它们全部放在 Oracle SQL Developer中。

5. 多连接。
在同一个Oracle SQL Developer界面里,可以连接多个数据库实例,虽然这不是什么复杂的功能,但是,PL/SQL Developer却做不到。

6. tkprof直观显示。
用Oracle SQL Developer直接打开一个trc文件,将会出现一个图形化的界面,并且包含了几乎所有的tkprof功能,比如可以按照某个指标进行排序。

7. 免费。
有什么东西比免费更吸引人呢?曾经在itpub上做过一个投票调查,目前使用PL/SQL Developer的Oracle DBA或者开发人员占据了超过60%,而其中绝大部分都在使用破解版。改为Oracle SQL Developer吧,你不用再去辛辛苦苦找最新的破解,你也可以自豪地说我现在用的开发工具是Free的,是正版的。

好吧,我承认Oracle SQL Developer是一个新产品,在很多小功能上确实还没有像PL/SQL Developer那样丰富。比如说也许我们需要一个command window,一个类似于SQL*Plus的界面,可以输入诸如archive log list或者show sga这样的命令,也可以仅仅输入edit 表名就可以弹出更改表结构的界面,输入edit 存储过程名就可以弹出编辑存储过程的界面;也许我们需要一个text import工具,可以方便地通过图形化界面将一个csv文件中的记录插入到一个表中;也许我们需要一个data gernerater工具可以方便地生成测试数据。

但是,这些都是小事儿,没有也就没有吧。另外,请相信Oracle的研发实力,短短的一年时间,Oracle SQL Developer已经开始引人瞩目了,而且Oracle一直在大力地研发这个工具在频繁地发布新版本,所以也许不久的将来这个工具将更好更强大。在这里可以看到大量使用者提出的Feature Request,很多已经被接收,将会出现在下一个版本中。

这篇文章不是一个正规的Oracle SQL Developer的产品功能或者说使用介绍,这仅仅是因为我作为一个普通的Oracle数据库顾问发现了一个免费的好用的工具(只不过恰巧这个工具是 Oracle推出的而已)而感到欣喜之后的随意而为的文章,我很期待与已经在使用Oracle SQL Developer和看到这篇文章转而使用它的各位做更多的经验交流。

用一个使用者的感想做结,这个感想在Oracle SQL Developer的主页上也可以找到。

We’ve given up all of our licenses for other tools. We simply don’t need them anymore. Oracle SQL Developer does it all for us. We’ve saved a lot of money because it’s free. It’s also given our development staff a standard tool and they love it. It’s made training and support easier.

用Oracle的管理权限用户启动,命令如下:
lsnrctl start

★ ora_client_ip_address: 用于返回客户端的IP地址
★ ora_database_name:用于返回当前数据库名
★ ora_des_encrypted_password:用于返回DES加密后的用户口令
★ ora_dict_obj_name:用于返回DDL操作所对应的数据库对象名
★ ora_dict_obj_name_list(name_list OUT ora_name_list_t):用于返回在事件中被修改的对象名列表
★ ora_dict_obj_owner:用于返回DDL操作所对应的对象的所有者名
★ ora_dict_obj_owner_list(owner_list OUT ora_name_list_t):用于返回在事件中被修改对像的所有者列表
★ ora_dic_obj_type:用于返回DDL操作所对应的数据对象的类型
★ ora_grantee(user_list OUT ora_name_list_t):用于返回授权事件的授权者
★ ora_instance_num:用于返回例程号
★ ora_is_alter_column(column_name IN VARCHAR2):用于检没特定列是否被修改
★ ora_is_creating_nested_table:用于检测是否正在建立嵌套表
★ ora_is_drop_column(column_name IN VARCHAR2):用于检测特定列是否被删除
★ ora_is_servererror(error_number):用于检测是否返回了特定Oracle错误
★ ora_login_user:用于返回登录用户名
★ ora_sysevent:用于返回触发器的系统事件名

1,在SQL语句中,想得到和Linux下一样的命令行效果,前面加!
比如,在Linux下查看当前目录下的所有文件按照时间排序,可以使用
$ ls -ltr
在SQL命令行下,则可以使用如下语句:
SQL> !ls -ltr

2,查看Oracle进程
SQL>!ps -aef| grep ora

3,可以使用TOP命令
SQL>!top

4,使用ipcs命令
SQL>!ipcs -a

这次学习Oracle的批量绑定的概念。

批量绑定是从Oracle9i开始新增加的特性,通过批量绑定,可以极大的加快数据处理速度。提高应用程序的性能。

先建立DEMO表。

CREATE TABLE demo(
id NUMBER(6) PRIMARY KEY,
name VARCHAR2(10)
);

下面以不使用批量绑定和使用批量绑定为例来比较两种方法插入数据的速度。

1,不使用批量绑定

在9i之前,当使用VALUES子句插入数据的时候,每次只能插入一条数据,如果要插入5000条数据,就需要调用5000次INSERT语句。使用循环插入数据。

DECLARE
TYPE id_table_type IS TABLE OF NUMBER(6)
INDEX BY BINARY_INTEGER;
TYPE name_table_type IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
id_table id_table_type;
name_table name_table_type;
start_time NUMBER(10);
end_time NUMBER(10);
BEGIN
FOR i IN 1..5000 LOOP
id_table(i):=i;
name_table(i):='Name'to_char(i);
END LOOP;
start_time:=dbms_utility.get_time;
FOR i IN 1..id_table.COUNT LOOP
INSERT INTO demo VALUES(id_table(i),name_table(i));
END LOOP;
end_time:=dbms_utility.get_time;
dbms_output.put_line('总计时间(秒):'
to_char((end_time-start_time)/100));
END;
/
总计时间(秒):6.41

2,使用批量绑定

在Oracle9i开始,当使用VALUES子句为数据库表插入数据时,通过批量绑定特征,只需要执行一条INSERT一句就可以插入5000行数据。

DECLARE
TYPE id_table_type IS TABLE OF NUMBER(6)
INDEX BY BINARY_INTEGER;
TYPE name_table_type IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
id_table id_table_type;
name_table name_table_type;
start_time NUMBER(10);
end_time NUMBER(10);
BEGIN
FOR i IN 1..5000 LOOP
id_table(i):=i;
name_table(i):='Name'to_char(i);
END LOOP;
start_time:=dbms_utility.get_time;
FORALL i IN 1..id_table.COUNT
INSERT INTO demo VALUES(id_table(i),name_table(i));
end_time:=dbms_utility.get_time;
dbms_output.put_line('总计时间(秒):'
to_char((end_time-start_time)/100));
END;
/
总计时间(秒):.33

看看执行的速度结果,结论自然就出来了。

Rank函数是Oracle分析函数一种,今天来学习一个最简单的应用,作为入门。

stud_grade表,数据如下:

ID NAME GRADE
---------- ---------- ----------
1001 a1 78
1002 a2 80
1003 a3 90
1004 a4 80
1005 a5 70
1006 a6 80
1007 a7 87
1008 a8 85
1009 a9 85
1010 a10 85

查询后希望得到的结果排名如下:

no NAME GRADE
---------- ---------- ----------
1 a3 90
2 a7 87
3 a10 85
3 a8 85
3 a9 85
6 a6 80
6 a4 80

使用的rank函数如下:
select rank() over (order by grade desc ) id,name,grade from stud_grade;

订阅: 博文 (Atom)