[Q]怎么样查询特殊字符,如通配符%与_
[A]select * from table where name like 'A_%' escape ''
[Q]如何插入单引号到数据库表中
insert into t values('i'||chr(39)||'m'); -- chr(39)代表字符'
or insert into t values('I''m'); -- 两个''可以表示一个'
[Q]怎样设置事务一致性
set transaction [isolation level] serializable;
[Q]怎么样利用游标更新数据
select * from tablename
……
where current of c1;
[Q]怎样自定义异常
如果立即抛出异常
其中number从-20000到-20999,错误信息最大2048B
SQLCODE 错误代码
[Q]十进制与十六进制的转换
to_char(100,'XX')
8i以下的进制之间的转换参考如下脚本
return varchar2
l_str varchar2(255) default NULL;
l_hex varchar2(16) default '0123456789ABCDEF';
if ( p_dec is null or p_base is null ) then
end if;
[Q]怎么样抽取重复记录
(select max(rowed) from table t2
或者
group by col_a,col_b
如果想删除重复记录,可以把第一个语句的select替换为delete
[Q]怎么样设置自治事务
pragma autonomous_transaction;
commit|rollback;
[Q]怎么样在过程中暂停指定时间
如:dbms_lock.sleep(5);表示暂停5秒。
[Q]怎么样快速计算事务的时间与日志量
DECLARE
end_time NUMBER;
end_redo_size NUMBER;
start_time := dbms_utility.get_time;
WHERE m.STATISTIC#=s.STATISTIC#
--transaction start
SELECT * FROM All_Objects;
COMMIT;
SELECT VALUE INTO end_redo_size FROM v$mystat m,v$statname s
AND s.NAME='redo size';
dbms_output.put_line('Redo Size:'||to_char(end_redo_size-start_redo_size)||' bytes');
[Q]怎样创建临时表
create global temporary tablename(column list)
on commit delete rows; --提交删除数据 事务临时表
[Q]怎么样在PL/SQL中执行DDL语句
2、8i以上版本还可以用
dbms_utility.exec_ddl_statement('sql');
[Q]怎么样获取IP地址
客户端:sys_context('userenv','ip_address')
[Q]怎么样加密存储过程
wrap iname=a.sql
Copyright (c) Oracle Corporation 1993, 2000. All Rights Reserved.
提示a.sql转换为a.plb,这就是加密了的脚本,执行a.plb即可生成加密了的存储过程
[Q]怎么样在ORACLE中定时运行存储过程
VARIABLE jobno number;
DBMS_JOB.SUBMIT(:jobno, 'ur_procedure;',SYSDATE,'SYSDATE + 1');
END;
select * from user_jobs;
[Q]怎么样从数据库中获得毫秒
SQL>select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1,
TIME1 TIME2
2003-10-24 10:48:45.656000 24-OCT-03 10.48.45.656000 AM +08:00
8i以上版本可以创建一个如下的java函数
java source
as
import java.sql.Timestamp;
{
{
}
SQL>java created.
SQL>create or replace function my_timestamp return varchar2
name 'MyTimestamp.getTimestamp() return java.lang.String';
SQL>function created.
MY_TIMESTAMP ORACLE_TIME
2003-03-17 19:15:59.688 2003-03-17 19:15:59
[Q]如果存在就更新,不存在就插入可以用一个语句实现吗
如果是单条数据记录,可以写作select …… from dual的子查询。
MERGE INTO table
ON (condition)
WHEN NOT MATCHED THEN insert_clause;
MERGE INTO course c
course_hours
ON (c.course_name = cu.course_name
WHEN MATCHED THEN
SET c.course_hours = cu.course_hours
INSERT (c.course_name, c.period,
VALUES (cu.course_name, cu.period,
[Q]怎么实现左联,右联与外联
左联:
where a.id=b.id(+)
select a.id,a.name,b.address from a,b
外联
FROM a,b
UNION
FROM b
SELECT * FROM a
在9i以上,已经开始支持SQL99标准,所以,以上语句可以写成:
select a.id,a.name,b.address,c.subject
inner join c on b.name = c.name
左联
from a left outer join b on a.id=b.id
右联
from a right outer join b on a.id=b.id
外联
from a full outer join b on a.id=b.id
or
from a full outer join b using (id)
[Q]怎么实现一条记录根据条件多表插入
INSERT ALL
INTO table_1 (id, name)
WHEN (id=2) THEN
values(id,name)
INTO table_other (id, name)
SELECT id,name
如果没有条件的话,则完成每个表的插入,如
INTO table_1 (id, name)
INTO table_2 (id, name)
INTO table_other (id, name)
SELECT id,name
[Q]如何实现行列转换
如
---------------------------
student1 数学 70
student2 语文 90
student2 英语 100
转换为
student1 80 70 60
……
select student,sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'英语', grade,null)) "英语"
group by student
如
--------------
1 是
2 知
3 不
转换为
2 知道
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
RETURN VARCHAR2
Col_c2 VARCHAR2(4000);
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
END LOOP;
RETURN Col_c2;
/
[Q]怎么样实现分组取前N条记录
如获取每个部门薪水前三名的员工或每个班成绩前三名的学生。
(select depno,ename,sal,row_number() over (partition by depno
from emp)
或者unix/linux平台下
windows平台下
总结:HOST 可以直接执行OS命令。
[Q]怎么设置存储过程的调用者权限
create or replace
AUTHID CURRENT_USER
begin
end;
[Q]怎么快速获得用户下每个表或表分区的记录数
SET SERVEROUTPUT ON SIZE 20000
miCount INTEGER;
FOR c_tab IN (SELECT table_name FROM user_tables) LOOP
dbms_output.put_line(rpad(c_tab.table_name,30,'.') || lpad(miCount,10,'.'));
SELECT COUNT(*) INTO miCount FROM User_Part_Tables WHERE table_name = c_tab.table_name;
FOR c_part IN (SELECT partition_name FROM user_tab_partitions WHERE table_name = c_tab.table_name) LOOP
INTO miCount;
END LOOP;
END LOOP;
[A]怎么在Oracle中发邮件
/****************************************************************************
Mail_Content in Varchar2 邮件内容
·只能指定一个邮箱,如果需要发送到多个邮箱,需要另外的辅助程序
CREATE OR REPLACE PROCEDURE sp_send_mail( rcpter IN VARCHAR2,
IS
--write title
BEGIN
END;
--opne connect
utl_smtp.helo(conn, 'oracle');
utl_smtp.rcpt(conn, Rcpter);
--write title
send_header('To', '"Recipient" ');
--write mail content
--close connect
utl_smtp.quit(conn);
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
utl_smtp.quit(conn);
WHEN OTHERS THEN
END;
NULL;
[A]怎么样在Oracle中写操作系统文件,如写日志
/**************************************************************************
desc: ·写日志,把内容记到服务器指定目录下
****************************************************************************/
IS
Write_content VARCHAR2(1024);
BEGIN
write_file_name := 'db_alert.log';
write_content := to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'||'||text_context;
IF utl_file.is_open(file_handle) THEN
END IF;
utl_file.fclose(file_handle);
WHEN OTHERS THEN
IF utl_file.is_open(file_handle) THEN
END IF;
WHEN OTHERS THEN
END;
[A]select * from table where name like 'A_%' escape ''
[Q]如何插入单引号到数据库表中
insert into t values('i'||chr(39)||'m'); -- chr(39)代表字符'
or insert into t values('I''m'); -- 两个''可以表示一个'
[Q]怎样设置事务一致性
set transaction [isolation level] serializable;
[Q]怎么样利用游标更新数据
select * from tablename
……
where current of c1;
[Q]怎样自定义异常
如果立即抛出异常
其中number从-20000到-20999,错误信息最大2048B
SQLCODE 错误代码
[Q]十进制与十六进制的转换
to_char(100,'XX')
8i以下的进制之间的转换参考如下脚本
return varchar2
l_str varchar2(255) default NULL;
l_hex varchar2(16) default '0123456789ABCDEF';
if ( p_dec is null or p_base is null ) then
end if;
[Q]怎么样抽取重复记录
(select max(rowed) from table t2
或者
group by col_a,col_b
如果想删除重复记录,可以把第一个语句的select替换为delete
[Q]怎么样设置自治事务
pragma autonomous_transaction;
commit|rollback;
[Q]怎么样在过程中暂停指定时间
如:dbms_lock.sleep(5);表示暂停5秒。
[Q]怎么样快速计算事务的时间与日志量
DECLARE
end_time NUMBER;
end_redo_size NUMBER;
start_time := dbms_utility.get_time;
WHERE m.STATISTIC#=s.STATISTIC#
--transaction start
SELECT * FROM All_Objects;
COMMIT;
SELECT VALUE INTO end_redo_size FROM v$mystat m,v$statname s
AND s.NAME='redo size';
dbms_output.put_line('Redo Size:'||to_char(end_redo_size-start_redo_size)||' bytes');
[Q]怎样创建临时表
create global temporary tablename(column list)
on commit delete rows; --提交删除数据 事务临时表
[Q]怎么样在PL/SQL中执行DDL语句
2、8i以上版本还可以用
dbms_utility.exec_ddl_statement('sql');
[Q]怎么样获取IP地址
客户端:sys_context('userenv','ip_address')
[Q]怎么样加密存储过程
wrap iname=a.sql
Copyright (c) Oracle Corporation 1993, 2000. All Rights Reserved.
提示a.sql转换为a.plb,这就是加密了的脚本,执行a.plb即可生成加密了的存储过程
[Q]怎么样在ORACLE中定时运行存储过程
VARIABLE jobno number;
DBMS_JOB.SUBMIT(:jobno, 'ur_procedure;',SYSDATE,'SYSDATE + 1');
END;
select * from user_jobs;
[Q]怎么样从数据库中获得毫秒
SQL>select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ssxff') time1,
TIME1 TIME2
2003-10-24 10:48:45.656000 24-OCT-03 10.48.45.656000 AM +08:00
8i以上版本可以创建一个如下的java函数
java source
as
import java.sql.Timestamp;
{
{
}
SQL>java created.
SQL>create or replace function my_timestamp return varchar2
name 'MyTimestamp.getTimestamp() return java.lang.String';
SQL>function created.
MY_TIMESTAMP ORACLE_TIME
2003-03-17 19:15:59.688 2003-03-17 19:15:59
[Q]如果存在就更新,不存在就插入可以用一个语句实现吗
如果是单条数据记录,可以写作select …… from dual的子查询。
MERGE INTO table
ON (condition)
WHEN NOT MATCHED THEN insert_clause;
MERGE INTO course c
course_hours
ON (c.course_name = cu.course_name
WHEN MATCHED THEN
SET c.course_hours = cu.course_hours
INSERT (c.course_name, c.period,
VALUES (cu.course_name, cu.period,
[Q]怎么实现左联,右联与外联
左联:
where a.id=b.id(+)
select a.id,a.name,b.address from a,b
外联
FROM a,b
UNION
FROM b
SELECT * FROM a
在9i以上,已经开始支持SQL99标准,所以,以上语句可以写成:
select a.id,a.name,b.address,c.subject
inner join c on b.name = c.name
左联
from a left outer join b on a.id=b.id
右联
from a right outer join b on a.id=b.id
外联
from a full outer join b on a.id=b.id
or
from a full outer join b using (id)
[Q]怎么实现一条记录根据条件多表插入
INSERT ALL
INTO table_1 (id, name)
WHEN (id=2) THEN
values(id,name)
INTO table_other (id, name)
SELECT id,name
如果没有条件的话,则完成每个表的插入,如
INTO table_1 (id, name)
INTO table_2 (id, name)
INTO table_other (id, name)
SELECT id,name
[Q]如何实现行列转换
如
---------------------------
student1 数学 70
student2 语文 90
student2 英语 100
转换为
student1 80 70 60
……
select student,sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'英语', grade,null)) "英语"
group by student
如
--------------
1 是
2 知
3 不
转换为
2 知道
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
RETURN VARCHAR2
Col_c2 VARCHAR2(4000);
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
END LOOP;
RETURN Col_c2;
/
[Q]怎么样实现分组取前N条记录
如获取每个部门薪水前三名的员工或每个班成绩前三名的学生。
(select depno,ename,sal,row_number() over (partition by depno
from emp)
或者unix/linux平台下
windows平台下
总结:HOST 可以直接执行OS命令。
[Q]怎么设置存储过程的调用者权限
create or replace
AUTHID CURRENT_USER
begin
end;
[Q]怎么快速获得用户下每个表或表分区的记录数
SET SERVEROUTPUT ON SIZE 20000
miCount INTEGER;
FOR c_tab IN (SELECT table_name FROM user_tables) LOOP
dbms_output.put_line(rpad(c_tab.table_name,30,'.') || lpad(miCount,10,'.'));
SELECT COUNT(*) INTO miCount FROM User_Part_Tables WHERE table_name = c_tab.table_name;
FOR c_part IN (SELECT partition_name FROM user_tab_partitions WHERE table_name = c_tab.table_name) LOOP
INTO miCount;
END LOOP;
END LOOP;
[A]怎么在Oracle中发邮件
/****************************************************************************
Mail_Content in Varchar2 邮件内容
·只能指定一个邮箱,如果需要发送到多个邮箱,需要另外的辅助程序
CREATE OR REPLACE PROCEDURE sp_send_mail( rcpter IN VARCHAR2,
IS
--write title
BEGIN
END;
--opne connect
utl_smtp.helo(conn, 'oracle');
utl_smtp.rcpt(conn, Rcpter);
--write title
send_header('To', '"Recipient" ');
--write mail content
--close connect
utl_smtp.quit(conn);
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
utl_smtp.quit(conn);
WHEN OTHERS THEN
END;
NULL;
[A]怎么样在Oracle中写操作系统文件,如写日志
/**************************************************************************
desc: ·写日志,把内容记到服务器指定目录下
****************************************************************************/
IS
Write_content VARCHAR2(1024);
BEGIN
write_file_name := 'db_alert.log';
write_content := to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'||'||text_context;
IF utl_file.is_open(file_handle) THEN
END IF;
utl_file.fclose(file_handle);
WHEN OTHERS THEN
IF utl_file.is_open(file_handle) THEN
END IF;
WHEN OTHERS THEN
END;