oracle数据库使用的一些技巧(3)

2019-05-24 14:12

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>! windows平台下 SQL>$

总结:HOST 可以直接执行OS命令。 备注:cd命令无法正确执行。

[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


oracle数据库使用的一些技巧(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:胺 值 测 量

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: