end_redo_size NUMBER; BEGIN
start_time := dbms_utility.get_time;
SELECT VALUE INTO start_redo_size FROM v$mystat m,v$statname s WHERE m.STATISTIC#=s.STATISTIC# AND s.NAME='redo size'; --transaction start INSERT INTO t1
SELECT * FROM All_Objects; --other dml statement COMMIT;
end_time := dbms_utility.get_time;
SELECT VALUE INTO end_redo_size FROM v$mystat m,v$statname s WHERE m.STATISTIC#=s.STATISTIC# AND s.NAME='redo size';
dbms_output.put_line('Escape Time:'||to_char(end_time-start_time)||' centiseconds'); dbms_output.put_line('Redo Size:'||to_char(end_redo_size-start_redo_size)||' bytes'); END;
[Q]怎样创建临时表 [A]8i以上版本
create global temporary tablename(column list) on commit preserve rows; --提交保留数据 会话临时表 on commit delete rows; --提交删除数据 事务临时表 临时表是相对于会话的,别的会话看不到该会话的数据。
[Q]怎么样在PL/SQL中执行DDL语句 [A]1、8i以下版本dbms_sql包 2、8i以上版本还可以用 execute immediate sql;
dbms_utility.exec_ddl_statement('sql');
[Q]怎么样获取IP地址
[A]服务器(817以上):utl_inaddr.get_host_address 客户端:sys_context('userenv','ip_address')
[Q]怎么样加密存储过程
[A]用wrap命令,如(假定你的存储过程保存为a.sql) wrap iname=a.sql
PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Tue Nov 27 22:26:48 2001 Copyright (c) Oracle Corporation 1993, 2000. All Rights Reserved. Processing a.sql to a.plb
提示a.sql转换为a.plb,这就是加密了的脚本,执行a.plb即可生成加密了的存储过程
[Q]怎么样在ORACLE中定时运行存储过程
[A]可以利用dbms_job包来定时运行作业,如执行存储过程,一个简单的例子,提交一个作业: VARIABLE jobno number; BEGIN
DBMS_JOB.SUBMIT(:jobno, 'ur_procedure;',SYSDATE,'SYSDATE + 1'); commit; END;
之后,就可以用以下语句查询已经提交的作业 select * from user_jobs;
[Q]怎么样从数据库中获得毫秒
[A]9i以上版本,有一个timestamp类型获得毫秒,如
SQL>select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1, to_char(current_timestamp) time2 from dual;
TIME1 TIME2
-----------------------------
---------------------------------------------------------------- 2003-10-24 10:48:45.656000 24-OCT-03 10.48.45.656000 AM +08:00 可以看到,毫秒在to_char中对应的是FF。 8i以上版本可以创建一个如下的java函数 SQL>create or replace and compile java source
named \as
import java.lang.String; import java.sql.Timestamp;
public class MyTimestamp {
public static String getTimestamp() {
return(new Timestamp(System.currentTimeMillis())).toString(); } };
SQL>java created.
注:注意java的语法,注意大小写
SQL>create or replace function my_timestamp return varchar2 as language java
name 'MyTimestamp.getTimestamp() return java.lang.String'; /
SQL>function created.
SQL>select my_timestamp,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') ORACLE_TIME from dual;
MY_TIMESTAMP ORACLE_TIME
------------------------ ------------------- 2003-03-17 19:15:59.688 2003-03-17 19:15:59
如果只想获得1/100秒(hsecs),还可以利用dbms_utility.get_time
[Q]如果存在就更新,不存在就插入可以用一个语句实现吗 [A]9i已经支持了,是Merge,但是只支持select子查询,
如果是单条数据记录,可以写作select ?? from dual的子查询。 语法为:
MERGE INTO table USING data_source ON (condition)
WHEN MATCHED THEN update_clause WHEN NOT MATCHED THEN insert_clause; 如
MERGE INTO course c
USING (SELECT course_name, period, course_hours
FROM course_updates) cu
ON (c.course_name = cu.course_name AND c.period = cu.period) WHEN MATCHED THEN UPDATE
SET c.course_hours = cu.course_hours WHEN NOT MATCHED THEN
INSERT (c.course_name, c.period, c.course_hours)
VALUES (cu.course_name, cu.period, cu.course_hours);
[Q]怎么实现左联,右联与外联 [A]在9i以前可以这么写: 左联:
select a.id,a.name,b.address from a,b where a.id=b.id(+) 右联:
select a.id,a.name,b.address from a,b where a.id(+)=b.id 外联
SELECT a.id,a.name,b.address FROM a,b
WHERE a.id = b.id(+) UNION
SELECT b.id,'' name,b.address
FROM b
WHERE NOT EXISTS ( SELECT * FROM a WHERE a.id = b.id);
在9i以上,已经开始支持SQL99标准,所以,以上语句可以写成: 默认内部联结:
select a.id,a.name,b.address,c.subject from (a inner join b on a.id=b.id) inner join c on b.name = c.name where other_clause 左联
select a.id,a.name,b.address
from a left outer join b on a.id=b.id where other_clause 右联
select a.id,a.name,b.address
from a right outer join b on a.id=b.id where other_clause 外联
select a.id,a.name,b.address
from a full outer join b on a.id=b.id where other_clause or
select a.id,a.name,b.address from a full outer join b using (id) where other_clause
[Q]怎么实现一条记录根据条件多表插入
[A]9i以上可以通过Insert all语句完成,仅仅是一个语句,如: INSERT ALL WHEN (id=1) THEN INTO table_1 (id, name) values(id,name) WHEN (id=2) THEN INTO table_2 (id, name) values(id,name) ELSE
INTO table_other (id, name) values(id, name) SELECT id,name FROM a;
如果没有条件的话,则完成每个表的插入,如 INSERT ALL
INTO table_1 (id, name)
values(id,name)
INTO table_2 (id, name) values(id,name)
INTO table_other (id, name) values(id, name) SELECT id,name FROM a;
[Q]如何实现行列转换 [A]1、固定列数的行列转换 如
student subject grade --------------------------- student1 语文 80 student1 数学 70 student1 英语 60 student2 语文 90 student2 数学 80 student2 英语 100 ?? 转换为
语文 数学 英语 student1 80 70 60 student2 90 80 100 ?? 语句如下:
select student,sum(decode(subject,'语文', grade,null)) \语文\sum(decode(subject,'数学', grade,null)) \数学\sum(decode(subject,'英语', grade,null)) \英语\from table group by student
2、不定列行列转换 如 c1 c2
-------------- 1 我 1 是 1 谁 2 知 2 道 3 不 ?? 转换为