1 我是谁 2 知道 3 不
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子 CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER) RETURN VARCHAR2 IS
Col_c2 VARCHAR2(4000); BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP Col_c2 := Col_c2||cur.c2; END LOOP;
Col_c2 := rtrim(Col_c2,1); RETURN Col_c2; END; /
SQL> select distinct c1 ,get_c2(c1) cc2 from table;即可
[Q]怎么样实现分组取前N条记录 [A]8i以上版本,利用分析函数
如获取每个部门薪水前三名的员工或每个班成绩前三名的学生。 Select * from
(select depno,ename,sal,row_number() over (partition by depno order by sal desc) rn from emp) where rn<=3
[Q]怎么样把相邻记录合并到一条记录
[A]8i以上版本,分析函数lag与lead可以提取后一条或前一天记录到本记录。 Select deptno,ename,hiredate,lag(hiredate,1,null) over (partition by deptno over by hiredate,ename) last_hire from emp
order by depno,hiredate
[Q]如何取得一列中第N大的值? [A]select * from
(select t.*,dense_rank() over (order by t2 desc) rank from t) where rank = &N;
[Q]怎么样把查询内容输出到文本 [A]a.控制语句,如set heading off b.spool 完整文件名 c.查询语句 ??
d.spool off
[Q]怎么设置存储过程的调用者权限
[A]普通存储过程都是所有者权限,如果想设置调用者权限,请参考如下语句 create or replace procedure ??() AUTHID CURRENT_USER As begin ?? end;
[Q] 如何在SQL*PLUS环境中执行OS命令?
[A] 比如进入了SQLPLUS,启动了数据库,忽然想起监听还没有启动,此时不用退出SQLPLUS,也不用另外起一个命令行窗口,直接输入: SQL> host lsntctl start 或者unix/linux平台下 SQL>!
总结:HOST
[Q]怎么快速获得用户下每个表或表分区的记录数
[A]可以分析该用户,然后查询user_tables字典,或者采用如下脚本即可 SET SERVEROUTPUT ON SIZE 20000 DECLARE
miCount INTEGER; BEGIN
FOR c_tab IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE 'select count(*) from \dbms_output.put_line(rpad(c_tab.table_name,30,'.') || lpad(miCount,10,'.')); --if it is partition table
SELECT COUNT(*) INTO miCount FROM User_Part_Tables WHERE table_name = c_tab.table_name; IF miCount >0 THEN
FOR c_part IN (SELECT partition_name FROM user_tab_partitions WHERE table_name = c_tab.table_name) LOOP
EXECUTE IMMEDIATE 'select count(*) from ' || c_tab.table_name || ' partition (' || c_part.partition_name || ')'
INTO miCount;
dbms_output.put_line(' '||rpad(c_part.partition_name,30,'.') || lpad(miCount, 10,'.')); END LOOP;
END IF; END LOOP; END;
[Q]怎么在Oracle中发邮件
[A]可以利用utl_smtp包发邮件,以下是一个发送简单邮件的例子程序
/**************************************************************************** parameter: Rcpter in varchar2 接收者邮箱 Mail_Content in Varchar2 邮件内容 desc: ·发送邮件到指定邮箱
·只能指定一个邮箱,如果需要发送到多个邮箱,需要另外的辅助程序
****************************************************************************/ CREATE OR REPLACE PROCEDURE sp_send_mail( rcpter IN VARCHAR2, mail_content IN VARCHAR2) IS
conn utl_smtp.connection; --write title
PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) AS BEGIN
utl_smtp.write_data(conn, NAME||': '|| HEADER||utl_tcp.CRLF); END; BEGIN
--opne connect
conn := utl_smtp.open_connection('smtp.com'); utl_smtp.helo(conn, 'oracle'); utl_smtp.mail(conn, 'oracle info'); utl_smtp.rcpt(conn, Rcpter); utl_smtp.open_data(conn); --write title
send_header('From', 'Oracle Database');
send_header('To', '\send_header('Subject', 'DB Info'); --write mail content
utl_smtp.write_data(conn, utl_tcp.crlf || mail_content); --close connect
utl_smtp.close_data(conn); utl_smtp.quit(conn); EXCEPTION
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN BEGIN
utl_smtp.quit(conn); EXCEPTION WHEN OTHERS THEN NULL;
END;
WHEN OTHERS THEN NULL;
END sp_send_mail;
[Q]怎么样在Oracle中写操作系统文件,如写日志
[A]可以利用utl_file包,但是,在此之前,要注意设置好Utl_file_dir初始化参数 /************************************************************************** parameter:textContext in varchar2 日志内容 desc: ·写日志,把内容记到服务器指定目录下
·必须配置Utl_file_dir初始化参数,并保证日志路径与Utl_file_dir路径一致或者是其中一个
****************************************************************************/ CREATE OR REPLACE PROCEDURE sp_Write_log(text_context VARCHAR2) IS
file_handle utl_file.file_type; Write_content VARCHAR2(1024); Write_file_name VARCHAR2(50); BEGIN --open file
write_file_name := 'db_alert.log';
file_handle := utl_file.fopen('/u01/logs',write_file_name,'a');
write_content := to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'||'||text_context; --write file
IF utl_file.is_open(file_handle) THEN
utl_file.put_line(file_handle,write_content); END IF; --close file
utl_file.fclose(file_handle); EXCEPTION WHEN OTHERS THEN BEGIN
IF utl_file.is_open(file_handle) THEN utl_file.fclose(file_handle); END IF; EXCEPTION WHEN OTHERS THEN NULL; END;
END sp_Write_log;
第二部分、ORACLE构架体系 menu
[Q]ORACLE的有那些数据类型
[Q]Oracle有哪些常见关键字,不能被用于对象名 [Q]怎么查看数据库版本 [Q]怎么查看数据库参数 [Q]怎么样查看数据库字符集 [Q]怎么样修改字符集 [Q]怎样建立基于函数索引 [Q]怎么样移动表或表分区 [Q]怎么获得当前的SCN [Q]ROWID的结构与组成 [Q]怎么样获取对象的DDL语句 [Q]如何创建约束的索引在别的表空间上 [Q]dbms_output提示缓冲区不够,怎么增加 [Q]怎么样修改表的列名 [Q]怎么样给sqlplus安装帮助 [Q]怎么样快速下载Oracle补丁 [Q]如何移动数据文件
[Q]如果管理联机日志组与成员 [Q]怎么样计算REDO BLOCK的大小 [Q]控制文件包含哪些基本内容
[Q]如果发现表中有坏块,如何检索其它未坏的数据 [Q]怎么知道那些表没有建立主键
[Q]我创建了数据库的所有用户,我可以删除这些用户吗 第二部分、ORACLE构架体系
[Q]ORACLE的有那些数据类型 [A]常见的数据类型有
CHAR固定长度字符域,最大长度可达2000个字节
NCHAR多字节字符集的固定长度字符域,长度随字符集而定,最多为2000个字符或2000个字节 VARCHAR2可变长度字符域,最大长度可达4000个字符
NVARCHAR2多字节字符集的可变长度字符域,长度随字符集而定,最多为4000个字符或4000个字节
DATE用于存储全部日期的固定长度(7个字节)字符域,时间作为日期的一部分存储其中。除非 通过设置init.ora文件的NLS_DATE_FORMAT参数来取代日期格式,否则查询时,日期以 DD-MON-YY格式表示,如13-APR-99表示1999.4.13
NUMBER可变长度数值列,允许值为0、正数和负数。NUMBER值通常以4个字节或更少的字节存储,最多21字节
LONG可变长度字符域,最大长度可到2GB
RAW表示二进制数据的可变长度字符域,最长为2000个字节 LONGRAW表示二进制数据的可变长度字符域,最长为2GB
MLSLABEL只用于TrustedOracle,这个数据类型每行使用2至5个字节 BLOB二进制大对象,最大长度为4GB CLOB字符大对象,最大长度为4GB