??xml version="1.0" encoding="utf-8" standalone="yes"?>
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
* @author semovy 试向oracle ?写文件Blob ?写大文本Clob
*/
public class OracleBlobTest {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@localhost:1521:teckotooling";
private String user = "scott";
private String pwd = "tiger";
public OracleBlobTest() {
}
public static void main(String[] args) {
OracleBlobTest obt = new OracleBlobTest();
obt.writeBlob();
obt.readBlob();
obt.writeClob();
obt.readClob();
}
/**
* Mq制文g
*
*/
private void readBlob() {
Connection conn = null;
try {
conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from test where id=1");
byte[] buffer = new byte[1024];
OutputStream out = new FileOutputStream("d:/360安全卫士?.exe");
int tempLen = 0;
int amount = 0;
if (rs.next()) {
Blob blob = rs.getBlob("BINARYCONTENT");
InputStream in = blob.getBinaryStream();
while ((tempLen = in.read(buffer)) != -1) {
out.write(buffer, 0, tempLen);
amount += tempLen;
System.out.println("已经dq写:" + amount + " 字节");
}
System.out.println("已经dq写:完成");
out.flush();
out.close();
in.close();
rs.close();
stmt.close();
}
} catch (ClassNotFoundException e) {
System.out.println(e.getLocalizedMessage());
} catch (SQLException e) {
System.out.println(e.getLocalizedMessage());
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
System.out.println(e.getLocalizedMessage());
}
}
}
/**
* 写二q制文g
*
*/
private void writeBlob() {
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
String sql = null;
Statement stmt = conn.createStatement();
sql = "delete from test where id=1";
stmt.executeUpdate(sql);
sql = "insert into test(1,BINARYCONTENT,CLOBCONTENT) values(1,empty_blob(),empty_clob())";
stmt.executeUpdate(sql);
ResultSet rs = stmt.executeQuery("select * from test where id=1");
if (rs.next()) {
Blob blob = rs.getBlob("BINARYCONTENT");
OutputStream out = ((oracle.sql.BLOB) blob).setBinaryStream(0);// ?开?否则写出的文件有差错
int bufferSize = ((oracle.sql.BLOB) blob).getBufferSize();
System.out.println("bufferSize :" + bufferSize);
BufferedInputStream in = new BufferedInputStream(
new FileInputStream("d:/360安全卫士?exe"), bufferSize);
byte[] b = new byte[bufferSize];
int count = in.read(b, 0, bufferSize);
int amount = 0;
while (count != -1) {
out.write(b, 0, count);
amount += count;
System.out.println("处理?" + amount + " 字节");
count = in.read(b, 0, bufferSize);
System.out.println("处理?" + amount + " 字节,成功");
}
out.close();
out = null;
in.close();
conn.commit();
}
} catch (ClassNotFoundException e) {
System.out.println(e.getLocalizedMessage());
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
System.out.println(e1.getLocalizedMessage());
}
System.out.println(e.getLocalizedMessage());
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
System.out.println(e.getLocalizedMessage());
}
}
}
/**
* d文本
*
*/
private void readClob() {
Connection conn = null;
try {
conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from test where id=2");
String tempStr = null;
if (rs.next()) {
Clob clob = rs.getClob("CLOBCONTENT");
if (clob != null) {
Reader in = clob.getCharacterStream();
BufferedReader br = new BufferedReader(in);
System.out.println("开始读....");
while ((tempStr = br.readLine()) != null) {
System.out.println(tempStr);
}
System.out.println("d?...");
in.close();
}
rs.close();
stmt.close();
}
} catch (ClassNotFoundException e) {
System.out.println(e.getLocalizedMessage());
} catch (SQLException e) {
System.out.println(e.getLocalizedMessage());
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
System.out.println(e.getLocalizedMessage());
}
}
}
/**
* 写大文本
*
*/
private void writeClob() {
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false);
String sql = null;
Statement stmt = conn.createStatement();
sql = "delete from test where id=2";
stmt.executeUpdate(sql);
sql = "insert into test values(2,empty_blob(),empty_clob())";
stmt.executeUpdate(sql);
ResultSet rs = stmt.executeQuery("select * from test where id=2");
if (rs.next()) {
Clob clob = rs.getClob("CLOBCONTENT");
PrintWriter out = new PrintWriter(new BufferedWriter(
((oracle.sql.CLOB) clob).setCharacterStream(0)));
BufferedReader in = new BufferedReader(new InputStreamReader(
new FileInputStream(
"d:/在北大校园BBS引v轰动的一文章请热爱国的h转发Q!Q!.mht")));
String str = null;
System.out.println("开始写...");
while ((str = in.readLine()) != null) {
out.println(str);
System.out.println(str);
}
in.close();
out.close();
rs.close();
conn.commit();
}
} catch (ClassNotFoundException e) {
System.out.println(e.getLocalizedMessage());
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
System.out.println(e1.getLocalizedMessage());
}
System.out.println(e.getLocalizedMessage());
} catch (IOException e) {
System.out.println(e.getLocalizedMessage());
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
System.out.println(e.getLocalizedMessage());
}
}
}
private Connection getConnection() throws ClassNotFoundException,
SQLException {
Class.forName(driver);
return DriverManager.getConnection(url, user, pwd);
}
/**
*
* @param rs
* @throws SQLException
*/
private void displayResultSet(ResultSet rs) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int colnum = rsmd.getColumnCount();
while (rs.next()) {
for (int i = 0; i < colnum; i++) {
if (i == colnum - 1)
System.out.print(rsmd.getColumnLabel(i + 1) + ": "
+ rs.getObject(i + 1));
else
System.out.print(rsmd.getColumnLabel(i + 1) + ": "
+ rs.getObject(i + 1) + " , ");
}
System.out.println();
}
}
}
增删字段
alter table test2 drop column f
修改字段cd和大?img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />
alter table test2 modify d varchar(40)
alter table test2 modify f varchar(40)
alter table test2 add c varchar2(30)
处理U束
1.创徏表空_
create tablespace tablespace_name datafile 'filepath' size filesize autoextend on next autosize maxsize filemaxsize [unlimited]
eg:
create tablespace sales datafile 'c:\1.txt' size 10m autoextend on next 1m maxsize 100m
2.I间增加数据文gQ?/span>
alter tablespace tablespace_name add datafile 'filepath' size filesize autoextend on next autosize maxsize filemaxsize[unlimited]
eg:
alter tablespace sales datafile 'c:\2.txt' size 10m autoextend on next 1m maxsize unlimited
3.调整表空_
alter database datafile 'filepath' resize filesize--重置表空间的大小
eg:
alter database datafile 'c:\2.txt' resize 10m
4.关闭表空间的自动扩展属性:
alter database datafile 'filepath' autoextend off
eg:
alter database datafile 'c:\2.txt' autoextend off
5.打开表空间的自动扩展属性:
alter database datafile 'filepath' autoextend on
eg:
alter database datafile 'c:\2.txt' autoextend on
6.使表I间脱机Q?/span>
alter tablespace tablespace_name offline
7.使表I间联机Q?/span>
alter tablespace tablespace_name online
8.讄表空间ؓ只读Q?/span>
alter tablespace tablespace_name read only
9.讄表空间ؓdQ?/span>
alter tablespace tablespace_name read write
11.删除表空_
drop tablespace tablespace_name
12.删除表空间的同时Q删除数据文?/span>
drop tablespace tablespace_name including contents and datefiles
13.查看每个表空间占用空间的大小Q?/span>
select tablespace_name,sum(bytes)/1024/1024 from dba_segments group by tablespace_name
10.Ud表空间数据文件步骤:
a.使表I间脱机Q?/span>alter tablespace tablespace_name offline
b.物理Ud数据文g到目的地Q可以是表空间的部分数据文g或者是修改数据文g的名Uͼ
c.逻辑UdQ?/span>alter tablespace tablespace_name rename datafile '源文件地址'to '目的文g地址'--注意可以多个源文g转移到同一个目的文件地址Q多个源文g地址用逗号分隔Q?/span>
d.表I间联机Q?/span>alter tablespace tablespace_name online
11.查询表空间的信息Q?/span>
select tablespace_name,bytes/1024/1024 file_size_mb,file_name from DBA_DATE_FILES--注意书籍库中的实体都是以大写表示
12.当数据文件被删除的时候,如果对该数据文g操作的时候,oracle会报不能扑ֈ该数据文件的错误。如何处理?/span>
Q?/span>1Q?/span>shutdown?/font>关闭oracle实例
Q?/span>2Q?/span>startup --开?/span>oracle实例q打开数据?/span>
Q?/span>3Q?/span>alter database datafile ‘datafile_name’ offline drop;
Q?/span>4Q?/span>alter database open
------------------------------------------------------------------------------------------------------------------
正规表达式是W号和元素的集合Q这些集合可以用户匚w特定的文本模式。正规表辑ּ采用元符Ll合来定义各U匹配和搜烦标准。在正规表达式中Q匹配是大小写敏感的?/span>
元符?/span> 描述 CZ
* 匚w0个或多个L的字W?/span> bd* 匚wbdqQ?/span>bdabc
Q?/span> 匚w一个Q意的字符 B?d匚w BDd,Bld
^ 表示字符串的开?/span> ^abc?/span>abcedQ?/span>abcfr?/span>acdv
$ 表示字符串的末尾 bas$ ?/span>bas为结所有字W串
x|y 匚wx?/span>y windo|door表示windo或?/span>dr
[] 匚w[]中的L一个字W?/span> ba[a-b]匚wbaa ?/span>bab
{m} 可以匚wm?/span> m[0-9]{3}匚wm7Q?/span>m12Q?/span>m123
{m,n} 臛_mơ最?/span>n?/span>
\n 表示前一个表辑ּ可以重复N ?/span> [aeiou]\2 匚waatldf ?/span>abldf
[Q:] 指定一个字W类Q匹配该cM的Q意一个字W?/span>
使用正规表达式:
函数 描述
Regexp_like() cM?/span>likeq算W,可以使用正规表达式执行模式匹配操?/span>
Regexp_instr() instrq算的扩张,可以用来搜烦匚w正规表达式模式的输入字符?/span>
Regexp_replace() replace的扩展,用户搜烦W合正规表达式模式的输入字符Ԍq用指定的字W代替这些字W串
Regexp_substr() substr函数的扩展,用户搜烦W合正规表达式模式的输入字符Ԍ输出是这些搜索到的字W串
说明Q?/span>
一Q?/span>Regexp_like(search_string,pattern [,match_option]);
(1):search_string是搜索?/span>
(2):parrern 是用得正规表达式且光度限制在512字节?/span>
(3)match_option:是一个文本串Q可以用户讄该函数的匚w行ؓ
Match_option参数表:
?/span> 描述
C 匚wӞ大小写敏感,是默认设|?/span>
I 匚wӞ大小写不敏感
N 允许使用圆点Q。)匚wM新增的字W?/span>
M
EgQ?/span>
Select author_id,last_name from author where regexp_liek(last_name,’e$’);--搜烦?/span>el尾的作者姓?/span>
二:regexp_instr(search_string,pattern,[,position [,occurrence [,return_option [,match_option ]]]]);
(1) :search_string是搜索?/span>
(2):parrern 是用得正规表达式且光度限制在512字节?/span>
(3)position 是一个表C搜索开始位|的正整敎ͼ默认Z?/span>
(4)occurrence定义了搜索模式的发生ơ数Q默认ؓ一Q?/span>
(5)return_optionshi 是一个数字,表示该函数应该返回的倹{该数字可以?/span>0Q表C开始匹配的位置Q也可以是非0Q表C匹配的l束位置Q?/span>
(6)match_option 是设|该函数匚w行ؓ的参?/span>
EgQ?/span>
Select regexp_instr(‘orcale database 10g’,’a’,1,2) from dual;
三:
regexp_replace((search_string,pattern,[,position[,occurrence[,return_option [,match_option ]]]]);
(1) :search_string是搜索?/span>
(2):parrern 是用得正规表达式且光度限制在512字节?/span>
(3)position 是一个表C搜索开始位|的正整敎ͼ默认Z?/span>
(4)occurrence定义了搜索模式的发生ơ数Q默认ؓ一Q?/span>
(5)return_optionshi 是一个数字,表示该函数应该返回的倹{该数字可以?/span>0Q表C开始匹配的位置Q也可以是非0Q表C匹配的l束位置Q?/span>
(6)match_option 是设|该函数匚w行ؓ的参?/span>
)
Select last_name,regexp_replace(last_name,’e’,’E’) from duthors where author_id<3
四:
Regexp_substr(seach_string,pattern [,position ,[,occurrence [,match_option]]])
(1) :search_string是搜索?/span>
(2):parrern 是用得正规表达式且光度限制在512字节?/span>
(3)position 是一个表C搜索开始位|的正整敎ͼ默认Z?/span>
(4)occurrence定义了搜索模式的发生ơ数Q默认ؓ一Q?/span>
(5)match_option 是设|该函数匚w行ؓ的参?/span>
Eg:
Select last_name,regexp_substr(last_name,’[rst][a-z]{4}’) from authors where length(regexp_sustr(last_name,[rst][a_z]{4}));
1Q原子?/span>(atomicity) --事务处理要么全部q行Q要么不q行?/span>
2Q一致?/span>(consistency) –事务处理要将数据库从一U状态{变ؓ?/span> 一U状态?/span>
3Q隔L?/span>(isolation) –在事务处理提交之前,事务处理的效果不能由pȝ中的其他事务看到?/span>
4Q持久?/span>(durability) –一旦提交了事务Q他永q生效?/span>
5Q?/span>set autocommit on--讄数据库系l环境ؓ自动提交事务Q?/span>
SQL> set autocommit on;
SQL> insert into t values(1,'2','2');
已创?/span> 1 行?/span>
提交完成?/span>
SQL> set autocommit off;
SQL> insert into t values(1,'2','2');
已创?/span> 1 行?/span>
SQL> commit;
提交完成?/span>
6Q锁Q(防止q程之间因ؓ抢占资源Q生死锁而设定一U预防死锁生的机制Q?/span>
允许或者拒l资源访问的一U机?/span>
Z防止用户在同一旉内ƈ发的讉K和修Ҏ据库资源Q?/span>orcale中用不同类型的锁控制对数据的ƈ发访问,以防止用户之间出现破坏性的操作?/span>
锁定的类型:
Q?/span>1Q行U锁Q行被排他锁?/span>
Q?/span>2Q表U锁Q共享锁Q共享更新锁Q排他锁
---------------------------------------------------------
行锁:
行被排他锁定Q在某行的锁被释放之前,其他用户不能修改此行Q?/span> commit ?/span> rollback 命o释放?/span>
Oracle 通过使用 INSERT?/span>UPDATE ?/span> SELECT…FOR UPDATE 语句自动获取行?/span>
SELECT…FOR UPDATE 子句
在表的一行或多行上放|排他锁Q用于防止其他用h新该行,可以执行除更C外的其他操作Q只有该用户提交事务Q其他用h能够更新gname
select * from goods where gid=1001
for update of gname;
server1Q?/span> server2
create table goods (gid int );
insert into goods values(1)
insert into goods values(2)
别的q程讉K该表?/span>,可以执行除更C外的其他操作
select * from goods where gid=1 for update of gid 讉Kserver1Ӟ可以?/span>goods表进行添加,删除Q查询,但不能修?/span>
FOR UPDATE WAIT 子句?/span>Oracle9i 中的新增功能Q?/span>
Z防止无限期地{待锁定的行Q等待间隔必L定ؓ数值文字,{待间隔不能是表辑ּ、赋值变量或 PL/SQL?/span>
变量
select * from goods where gid=1001 for update of gname wait 3
{待用户释放更新锁的旉?/span>3U,否则时?/span>
-------------------------------------------
表锁:
保护表的数据
在多个用户同时访问数据时保数据的完整?/span>
可以讄ZU模式:׃n、共享更新和排他
语法Q?/span>
Lock table < table_name> in <mode>;
--------------------
׃n锁:仅允许其他用h行查询操作,不能插入、更新和删除Q多个用户可以同时在同一表中攄此锁
Lock table table_name
in share mode [nowait];
rollback ?/span>commit命o释放?/span>
Nowait 关键字告诉其他用户不用等?/span>
lock table<tabale_name>[,<table_name>,....]
in share mode[nowait]
---------------------
׃n更新锁:
锁定要被更新的行
允许其他用户同时查询、插入、更新未被锁定的?/span>
?/span> SELECT 语句中?#8220;FOR UPDATE”子句Q可以强制用共享更新锁
允许多个用户同时锁定表的不同?/span>
加锁的两U方?/span>
(1)lock table tab_name in share update mode;
(2)Select column1, column2 From goods Where gid=1001 For update of column1, column2
lock table<tabale_name>[,<table_name>,....] in share update mode [nowait]
-------------------------
排他锁:
与其他两U锁相比Q排他锁是限制性最强的表锁Q仅允许其他用户查询数据Q不允许执行插入、删除和更新操作Q在同一旉仅允怸位用户在表上攄排他?/span>
׃n锁与此相?/span>
lock table<tabale_name>[,<table_name>,....]
in exclusive mode [nowait]
1Q表的创建:
create table table_name(column_name datatype[,column_name datatype])
2Q表数据的插入:
insert into table_name values(column_instance)
3Q更新数据:
update table_name set column_instance=? where column_name=?
4Q查询数据:
select * from table_name where condition1 group by column_name1... having.... order by column_name[desc,[asc]]
5Q删除数据:
delete from table_name where column_name1=?
6Q在表空间上建立表:
create table tablename(column_name,datatype)tablespace tablespace_name
7Q?/span>oracle中提?/span>5U约束:
CheckQ?/span>not nullQ?/span>uniqueQ?/span>primary keyQ?/span>foreign key
(a)checkU束
Create table policies(policy_id number ,holder_name varchar2(40),gender varchar2 (1) constraint chk_gender check (gender in ('M','F'),marital_status varchar2 (1),
date_of_birth date ,constraint chk_marital check (marital_status in('S','M','D','W')));
(b)not nullU束
Create table policies(policy_id number ,holder_name varchar2 (40) not null,gender varchar2(1),marital_status varchar2(1),date_of_birth date not null);
对于not null?/span>alter table语句与其他约束稍微有点不同?/span>Alter table policies modify holder_name not null
(c)uniqueU束
create table emp(eid int ,ename varchar2(10),constraint uq unique(eid,ename))
create table emp (eid int ,ename varchar(10))
alter table emp add constraint pk primary key(eid,ename);
8?/span>
(a)d新列
alter table table_name add column_name datatype [constraint][constraint_name]
(b) d新列q指定默认?/span>
alter table table_name add column_name datatype default expression
alter table table_name drop column column_name--删除?/span>
alter table table_name modify column_name datatype--修改cd?/span>
alter table table_name disable constraint constraint_name--用U束
alter table table_name enable constraint constraint_name--启用U束
alter table table_name add constraint constraint_name constraint_type(column_name)--dU束
alter table table_name drop constraint constraint_name [cascade]--删除U束
--l合dQ可以用多个列组合成一个主健)
alter table table_name add constraint constraint_name primary key (column_name, column_name...)--匿名块的实例Q?br />
CREATE TABLE authors (
id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50)
);
CREATE TABLE books (
isbn CHAR(10) PRIMARY KEY,
category VARCHAR2(20),
title VARCHAR2(100),
num_pages NUMBER,
price NUMBER,
copyright NUMBER(4),
author1 NUMBER CONSTRAINT books_author1
REFERENCES authors(id),
author2 NUMBER CONSTRAINT books_author2
REFERENCES authors(id),
author3 NUMBER CONSTRAINT books_author3
REFERENCES authors(id)
);
CREATE TABLE inventory (
isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES books (isbn),
status VARCHAR2(25) CHECK (status IN ('IN STOCK', 'BACKORDERED', 'FUTURE')),
status_date DATE,
amount NUMBER
);
INSERT INTO authors (id, first_name, last_name)
VALUES (1, 'Marlene', 'Theriault');
INSERT INTO authors (id, first_name, last_name)
VALUES (2, 'Rachel', 'Carmichael');
INSERT INTO authors (id, first_name, last_name)
VALUES (3, 'James', 'Viscusi');
INSERT INTO books (isbn, category, title, num_pages, price, copyright, author1, author2, author3)
VALUES ('72121203', 'Oracle Basics', 'Oracle DBA 101', 563, 39.99, 1999, 1, 2, 3);
INSERT INTO inventory (isbn, status, status_date, amount)
VALUES ('72121203', 'BACKORDERED', TO_DATE('06-JUN-2004', 'DD-MON-YYYY'), 1000);
SET SERVEROUTPUT ON ESCAPE OFF--当退匿名块时关闭SERVEROUTPUT
DECLARE
v_first_name authors.first_name%TYPE; --声明和定义变?br />
v_last_name authors.last_name%TYPE;
v_row_count PLS_INTEGER := 0;
CURSOR auth_cur IS --声明游标
SELECT a.first_name, a.last_name, count(b.title)
FROM authors a, books b
WHERE a.id = b.author1
OR a.id = b.author2
OR a.id = b.author3
GROUP BY a.first_name, a.last_name
HAVING count(b.title) > 0
ORDER BY a.last_name;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
OPEN auth_cur; --打开游标
LOOP
FETCH auth_cur INTO v_first_name, v_last_name, v_row_count;--推进游标
EXIT WHEN auth_cur%NOTFOUND; --当没有发现数据时Q推?br />
DBMS_OUTPUT.PUT_LINE(v_last_name
||', '
||v_first_name
||' wrote '
||v_row_count
||' book(s).');
END LOOP;
CLOSE auth_cur; --关闭游标
EXCEPTION --异常处理部分
WHEN OTHERS --others表示其它别的异常
THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
可以直接在insert into test values(SEQNAME.NEXTVAL) 是可以用q样Q?nbsp;
SELECT tmpdata_seq.NEXTVAL
INTO id_temp
FROM DUAL; 然后可以用id_temp
(2)PLS-00103: 出现W号 ">"在需要下列之一Ӟ
代码如下Q?nbsp;
IF (sum>0)
THEN
begin
INSERT INTO emesp.tp_sn_production_log
VALUES (r_serial_number, , id_temp);
EXIT;
end;
一直报sum>0 q是个很郁闷的问?因ؓ变量用了sum 所以不行,后改为i_sum>0
(3)oracle 语法
1. Oracle应用~辑Ҏ概览
{:1) Pro*C/C++/... : C语言和数据库打交道的ҎQ比OCI更常?
2) ODBC
3) OCI: C语言和数据库打交道的ҎQ和ProC很相|更底层,很少?
4) SQLJ: 很新的一U用Java讉KOracle数据库的ҎQ会的h不多;
5) JDBC
6) PL/SQL: 存储在数据内q行, 其他Ҏ为在数据库外Ҏ据库讉K;
2. PL/SQL
{:1) PL/SQL(Procedual language/SQL)是在标准SQL的基上增加了q程化处理的语言;
2) Oracle客户端工兯问Oracle服务器的操作语言;
3) Oracle对SQL的扩?
4. PL/SQL的优~点
{:优点Q?br />
1) l构化模块化~程Q不是面向对?
2) 良好的可UL?不管Oracleq行在何U操作系l?;
3) 良好的可l护?~译通过后存储在数据库里);
4) 提升pȝ性能;
W二?/font>
PL/SQLE序l构
1. PL/SQL?br />
{:1) x部分, DECLARE(不可?;
2) 执行部分, BEGIN...END;
3) 异常处理QEXCEPTION(可以没有);
2. PL/SQL开发环?br /> {:可以q用MU文本的~辑器编辑,例如QVI Qtoad很好?/font>
3. PL/SQL字符?br /> {:PL/SQL对大写不敏?/font>
4. 标识W命名规?br />
{:1) 字母开?
2) 后跟L的非I格字符、数字、货币符受下划线、或# ;
3) 最大长度ؓ30个字W?八个字符左右最合?;
5. 变量声明
{:语法
Var_name type [CONSTANT][NOT NULL][:=value];
注:1) x时可以有默认g可以没有;
2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始?
3) 赋D句ؓ“:=”;
4) 变量可以认ؓ是数据库里一个字D?
5) 规定没有初始化的变量为NULL;
W三?/font>
1. 数据cd
{:1) 标量型:数字型、字W型、布型、日期型;
2) l合型:RECORD(常用)、TABLE(常用)、VARRAY(较少?
3) 参考型QREF CURSOR(游标)、REF object_type
4) LOB(Large Object)
2. %TYPE
{:变量h与数据库的表中某一字段相同的类?br />
例:v_FirstName studengts.first_name%TYPE;
3. RECORDcd
{:TYPE record_name IS RECORD( /*其中TYPEQISQRECORD为关键字Qrecord_name为变量名U?/
field1 type [NOT NULL][:=expr1], /*每个{h的成员间用逗号分隔*/
field2 type [NOT NULL][:=expr2], /*如果一个字D限定NOT NULLQ那么它必须拥有一个初始?/
... /*所有没有初始化的字D都会初始ؓNULL
fieldn type [NOT NULL][:=exprn]);
4. %ROWTYPE
{:q回一个基于数据库定义的类?br />
DECLARE
v_StuRec Student%ROWTYPE; /*Student的名?/
注:?中定一个record相比Q一步就完成Q?中定义分二步Qa. 所有的成员变量都要x; b. 实例化变?
5. TABLEcd
{:TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER;
例:DECLARE
TYPE t_StuTable IS TABLE OF Student%ROWTYPE INDEX BY BINARY_INTERGER;
v_Student t_StuTable;
BEGIN
SELECT * INTO v_Student(100) FROM Student WHERE id = 1001;
END;
注:1) 行的数目的限制由BINARY_INTEGER的范围决?
6. 变量的作用域和可见?br />
{:1) 执行块里可以嵌入执行?
2) 里层执行块的变量对外层不可见;
3) 里层执行块对外层执行块变量的修改会媄响外层块变量的?
W四?/font>
1. 条g语句
{:IF boolean_expression1 THEN
...
ELSIF boolean_expression2 THEN /*注意是ELSIFQ而不是ELSEIF*/
... /*ELSE语句不是必须的,但END IF;是必ȝ*/
ELSE
...
END IF;
2. 循环语句
{:1) Loop
...
IF boolean_expr THEN /* */
EXIT; /* EXIT WHEN boolean_expr */
END IF; /* */
END LOOP;
2) WHILE boolean_expr LOOP
...
END LOOP;
3) FOR loop_counter IN [REVERSE] low_blound..high_bound LOOP
...
END LOOP;
注:a. 加上REVERSE 表示递减Q从l束边界到v始边界,递减步长Z;
b. low_blound 起始边界; high_bound l束边界;
3. GOTO语句
{:GOTO label_name;
1) 只能由内部块跛_外部?
2) 讄标签Q?lt;<label_name>>
3) CZQ?br />
LOOP
...
IF D%ROWCOUNT = 50 THEN
GOTO l_close;
END IF;
...
END LOOP;
<<l_close>>;
...
4. NULL语句
{:在语句块中加I句,用于补充语句的完整性。示例:
IF boolean_expr THEN
...
ELSE
NULL;
END IF;
5. SQL in PL/SQL
{:1) 只有DML SQL可以直接在PL/SQL中?
W五?/font>
1. 游标(CURSOR)
{:1) 作用Q用于提取多行数据集;
2) 声明Qa. 普通申明:DELCARE CURSOR CURSOR_NAME IS select_statement /* CURSOR的内容必L一条查询语?/
b. 带参数申明:DELCARE CURSOR c_stu(p_id student.ID%TYPE) SELECT * FROM student WHERE ID = p_id;
3) 打开游标QOPEN Cursor_name; /*相当于执行select语句Q且把执行结果存入CURSOR;
4) 从游标中取数Qa. FETCH cursor_name INTO var1, var2, ...; /*变量的数量、类型、顺序要和Table中字D一?*/
b. FETCH cursor_name INTO record_var;
注:gCURSOR取出攑օ变量中,每FETCH一ơ取一条记?
5) 关闭游标: CLOSE Cursor_name;
注:a. 游标使用后应该关?
b. 关闭后的游标不能FETCH和再ơCLOSE;
c. 关闭游标相当于将内存中CURSOR的内ҎI?
2. 游标的属?br />
{:1) %FOUND: 是否有?
2) %NOTFOUND: 是否没有?
3) %ISOPEN: 是否是打开状?
4) %ROWCOUNT: CURSOR当前的记录号;
3. 游标的FETCH循环
{:1) LOOP
FETCH cursor INTO ...
EXIT WHEN cursor%NOTFOUND; /*当cursor中没记录后退?/
END LOOP;
2) WHILE cursor%FOUND LOOP
FETCH cursor INTO ...
END LOOP;
3) FOR var IN cursor LOOP
FETCH cursor INTO...
END LOOP;
W六?/font>
1. 异常
{:DECLARE
...
e_TooManyStudents EXCEPTION; /* x异常 */
...
BEGIN
...
RAISE e_TooManyStudents; /* 触发异常 */
...
EXCEPTION
WHEN e_TooManyStudents THEN /* 触发异常 */
...
WHEN OTHERS THEN /* 处理所有其他异?*/
...
END;
2004-9-8 星期?nbsp; ?/font>
PL/SQL数据库编E??
1. 存储q程(PROCEDURE)
{:创徏q程Q?br />
CREATE [OR REPLACE] PROCEDURE proc_name
[(arg_name[{IN|OUT|IN OUT}]TYPE,
arg_name[{IN|OUT|IN OUT}]TYPE)]
{IS|AS}
procedure_body
1) IN: 表示该参C能被赋?只能位于{号双);
2) OUT:表示该参数只能被赋?只能位于{号左边);
3) IN OUT: 表示该类型既能被赋g能传?
2. 存储q程例子
{:CREATE OR REPLACE PROCEDURE ModeTest(
p_InParm IN NUMBER,
p_OutParm OUT NUMBER,
p_InOutParm IN OUT NUMBER)
IS
v_LocalVar NUMBER; /* 声明部分 */
BEGIN
v_LocalVar:=p_InParm; /* 执行部分 */
p_OutParm:=7;
p_InOutParm:=7;
...
EXCEPTION
... /* 异常处理部分 */
END ModeTest;
3. 调用PROCEDURE的例?br />
{:1) 匿名块可以调;
2) 其他PROCDEURE可以调用;
例:
DECLARE
v_var1 NUMBER;
BEGIN
ModeTest(12, v_var1, 10);
END;
注:此时v_var1{于7
4. 指定实参的模?br />
{:1) 位置标示法:调用时添入所有参敎ͼ实参与Ş参按序一一对应;
2) 名字标示法:调用时给出Ş参名字,q给出实?br />
ModeTest(p_InParm=>12, p_OutParm=>v_var1, p_Inout=>10);
注:a. 两种Ҏ可以L;
b. L时第一个参数必通过位置来指定?/font>
5. 函数(Function)与过E?Procedure)的区?br />
{:1) q程调用本n是一个PL/SQL语句(可以在命令行中通过exec语句直接调用);
2) 函数调用是表辑ּ的一部分;
6. 函数的声?br />
{:CREATE [OR REPLACE] PROCEDURE proc_name
[(arg_name[{IN|OUT|IN OUT}]TYPE,
arg_name[{IN|OUT|IN OUT}]TYPE)]
RETURN TYPE
{IS|AS}
procedure_body
注:1) 没有q回语句的函数将是一个错?
7. 删除q程与函?br />
{:DROP PROCEDURE proc_name;
DROP FUNCTION func_name;
W八?/font>
1. ?br />
{:1) 包是可以相兛_象存储在一LPL/SQL的结?
2) 包只能存储在数据库中Q不能是本地?
3) 包是一个带有名字的声明;
4) 相当于一个PL/SQL块的声明部分;
5) 在块的声明部分出现的M东西都能出现在包?
6) 包中可以包含q程、函数、游标与变量;
7) 可以从其他PL/SQL块中引用包,包提供了可用于PL/SQL的全局变量?br />
8) 包有包头和包MQ如包头中没有Q何函Cq程Q则包主体可以不需要?/font>
2. 包头
{:1) 包头包含了有兛_的内容的信息Q包头不含Q何过E的代码?br />
2) 语法Q?br />
CREATE [OR REPLACE] PACKAGE pack_name {IS|AS}
procedure_specification|function_specification|
variable_declaration|type_definition|exception_declaration|
cursor_declaration
END pack_name;
3) CZQ?br />
CREATE OR REPLACE PACKAGE pak_test AS
PROCEDURE RemoveStudent(p_StuID IN students.id%TYPE);
TYPE t_StuIDTable IS TABLE OF students.id%TYPE INDEX BY BINARY_INTEGER;
END pak_test;
3. 包主?br />
{:1) 包主体是可选的Q如包头中没有Q何函Cq程Q则包主体可以不需要?br />
2) 包主体与包头存放在不同的数据字典中?br />
3) 如包头编译不成功Q包M无法正确~译?br />
4) 包主体包含了所有在包头中声明的所有过E与函数的代码?br />
5) CZQ?br />
CREATE OR REPLACE PACKAGE BODY pak_test AS
PROCEDURE RemoveStudent(p_StuID IN students.id%TYPE) IS
BEGIN
...
END RemoveStudent;
TYPE t_StuIDTable IS TABLE OF students.id%TYPE INDEX BY BINARY_INTEGER;
END pak_test;
4. 包的作用?br />
{:1) 在包外调用包中过E?需加包?Qpak_test.AddStudent(100010, 'CS', 101);
2) 在包M中可以直接用包头中声明的对象和q程(不需加包?;
5. 包中子程序的重蝲
{:1) 同一个包中的q程与函数都可以重蝲;
2) 相同的过E或函数名字Q但参数不同;
6. 包的初始?br />
{:1) 包存攑֜数据库中;
2) 在第一ơ被调用的时候,包从数据库中调入内存q被初始?
3) 包中定义的所有变量都被分配内?
4) 每个会话都将拥有自己的包内变量的副本?/font>
W九?/font>
1. 触发?br />
{:1) 触发器与q程/函数的相同点
a. 都是带有名字的执行块;
b. 都有声明、执行体和异帔R?
2) 触发器与q程/函数的不同点
a. 触发器必d储在数据库中;
b. 触发器自动执?
2. 创徏触发?br />
{:1) 语法Q?br />
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE|AFTER} triggering_event ON table_reference
[FOR EACH ROW [WHEN trigger_condition]]
trigger_body;
2) 范例Q?br />
CREATE OR REPLACE TRIGGER UpdateMajorStats AFTER INSERT OR DELETE OR UPDATE ON students
DECLARE
CURSOR c_Statistics IS
SELECT * FROM students GROUP BY major;
BEGIN
...
END Up;
3. 触发?br />
{:1) 三个语句(INSERT/UPDATE/DELETE);
2) 二种cd(之前/之后);
3) 二种U别(row-level/statement-level);
所以一共有 3 X 2 X 2 = 12
4. 触发器的限制
{:1) 不应该用事务控制语?
2) 不能声明MLONG或LONG RAW变量;
3) 可以讉K的表有限?/font>
5. 触发器的M可以讉K的表
{:1) 不可以读取或修改M变化?被DML语句正在修改的表);
2) 不可以读取或修改限制?带有U束的表)的主键、唯一倹{外键列?/font>
(4)Java开发中使用Oracle的ORA-01000
很多朋友在Java开发中Q用Oracle数据库的时候,l常会碰到有ORA-01000: maximum open cursors exceeded.的错误?br />
实际上,q个错误的原因,主要q是代码问题引v的?
ora-01000: maximum open cursors exceeded.
表示已经辑ֈ一个进E打开的最大游标数?
q样的错误很Ҏ出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是Q如果你的createStatement和prepareStatement是在一个@环里面的话,׃非常Ҏ出现q个问题。因为游标一直在不停的打开Q而且没有关闭?br />
一般来_我们在写Java代码的时候,createStatement和prepareStatement都应该要攑֜循环外面Q而且使用了这些Statment后,及时关闭。最好是在执行了一ơexecuteQuery、executeUpdate{之后,如果不需要用结果集QResultSetQ的数据Q就马上Statment关闭?br />
对于出现ORA-01000错误q种情况Q单U的加大open_cursorsq不是好办法Q那只是L不治本。实际上Q代码中的隐患ƈ没有解除?
而且Q绝大部分情况下Qopen_cursors只需要设|一个比较小的|p够用了Q除非有非常特别的要求?/font>
(5)在store procedure中执?DDL语句
一是:execute immediate 'update '||table_chan||' set '||column_changed||' = '''||v_trans_name||''' where empid = '''||v_empid||'''' ;
二是Q?/font>The DBMS_SQL package can be used to execute DDL statements directly from PL/SQL.
q是一个创Z个表的过E的例子。该q程有两个参敎ͼ表名和字D及其类型的列表?br />
CREATE OR REPLACE PROCEDURE ddlproc (tablename varchar2, cols varchar2) AS
cursor1 INTEGER;
BEGIN
cursor1 := dbms_sql.open_cursor;
dbms_sql.parse(cursor1, 'CREATE TABLE ' || tablename || ' ( ' || cols || ' )', dbms_sql.v7);
dbms_sql.close_cursor(cursor1);
end;
/
2 如何找数据库表的主键字段的名U?
SQL>SELECT * FROM user_constraints
WHERE CONSTRAINT_TYPE='P' and table_name='TABLE_NAME';
3 如何查询数据库有多少?
SQL>select * from all_tables;
4 使用sqll配W?/font>
通配W?描述 CZ % 包含零个或更多字W的L字符丌Ӏ?WHERE title LIKE '%computer%' 查扑֤于书名Q意位|的包含单词 computer 的所有书名?_Q下划线Q?M单个字符?WHERE au_fname LIKE '_ean' 查找以 ean l尾的所?4 个字母的名字QDean、Sean {)?[ ] 指定范围 ([a-f]) 或集?([abcdef]) 中的M单个字符?WHERE au_lname LIKE '[C-P]arsen' 查找以arsen l尾且以介于 C ?P 之间的Q何单个字W开始的作者姓氏,例如QCarsen、Larsen、Karsen {?[^] 不属于指定范?([a-f]) 或集?([abcdef]) 的Q何单个字W?WHERE au_lname LIKE 'de[^l]%' 查找以 de 开始且其后的字母不?l 的所有作者的姓氏?/font>
5使普通用h查看v$Session的权?/font>
GRANT SELECT
ON "SYS"."V_$OPEN_CURSOR" TO "SFISM4";
GRANT SELECT
ON "SYS"."V_$SESSION" TO "SFISM4";
常用函数
distinct
L重复?br />
minus 相减
在第一个表但不在第二个?br />
SELECT * FROM FOOTBALL MINUS SELECT * FROM SOFTBALL;
intersect 怺
INTERSECT q回两个表中共有的行?br />
SELECT * FROM FOOTBALQ?br />
UNION ALL 与UNION 一样对表进行了合ƈ但是它不L重复的记录?br />
汇d?br />
count
select count(*) from test;
SUM
SUM 如同它的本意一样它q回某一列的所有数值的和?br />
SELECT SUM(SINGLES) TOTAL_SINGLES FROM TEST;
SUM 只能处理数字如果它的处理目标不是数字你将会收到如下信?br />
输入/输出
SQL>SELECT SUM(NAME) FROM TEAMSTATS;
ERROR
ORA-01722 invalid number
no rows selected
该错误信息当然的合理的因为NAME 字段是无法进行汇ȝ?br />
AVG
AVG 可以q回某一列的q_倹{?br />
SELECT AVG(SO) AVE_STRIKE_OUTS FROM TEAMSTATSQ?br />
MAX
如果你想知道某一列中的最大D使用MAX?br />
SELECT MAX(HITS) FROM TEAMSTATS;
MIN
MIN 与MAX cM它返回一列中的最数倹{?br />
VARIANCE
VARIANCE 方差不是标准中所定义的但它却是统计领域中的一个至关重要的数倹{?br />
SELECT VARIANCE(HITS) FROM TEAMSTATS;
STDDEV
q是最后一个统计函数STDDEV q回某一列数值的标准差?br />
SELECT STDDEV HITS FROM TEAMSTATSQ?br />
日期旉函数
ADD_MONTHS
ADD_MONTHS也可以工作在select 之外
该函数的功能是将l定的日期增加一个月举例来说׃一些特D的原因上述的计划需要推q两个月那么qC?br />
LAST_DAY
LAST_DAY 可以q回指定月䆾的最后一?
MONTHS_BETWEEN
如果你想知道在给定的两个日期中有多少个月可以使用MONTHS_BETWEEN?br />
select task, startdate, enddate ,months between(Startdate,enddate) duration from project;
q回l果有可能是负?
可以利用负值来判断某一日期是否在另一个日期之前下例将会显C所有在1995 q? ?9 日以前开始的比赛.
SELECT * FROM PROJECT
WHERE MONTHS_BETWEEN ('19-MAY-95', STARTDATE)>0;
NEW_TIME
如果你想把时间调整到你所在的时区你可以用NEW_TIME.
SQL>SELECT ENDDATE EDT, NEW_TIME('ENDDATE',' EDT',' PDT') FROM PROJECT;
NEXT_DAY
NEXT_DAY 返回与指定日期在同一个星期或之后一个星期内的你所要求的星期天
数的切日期如果你想知道你所指定的日期的星期五是几号可以q样?
SQL>SELECT STARTDATE, NEXT_DAY(STARTDATE,' FRIDAY') FROM PROJECT;
SYSDATE
SYSDATE 返回系l的日期和时间?br />
SELECT DISTINCT SYSDATE FROM PROJECTQ?br />
数学函数
ABS
ABS 函数q回l定数字的绝对?br />
CEIL 和FLOOR
CEIL q回与给定参数相{或比给定参数在的最整?FLOOR 则正好相反它q回
与给定参数相{或比给定参数小的最大整?
COS COSH SIN SINH TAN TANH
COS SIN TAN 函数可以q回l定参数的三角函数值默认的参数认定为弧度制.
EXP
EXP 会q回以给定的参数为指Ce 为底数的q?
LN and LOG
q是两个Ҏ函数其中LN q回l定参数的自然对?
MOD
知道在ANSI 标准中规定取模运的W号?在一些解释器中被函数MOD 所取代.
POWER
该函数可以返回某一个数对另一个数的幂在用幂函数时第一个参Cؓ底数W二个ؓ指数?br />
SIGN
如果参数的gؓ负数那么SIGN q回-1 如果参数的gؓ正数那么SIGN q回1,如果参数为零那么SIGN 也返回零.
SQRT
该函数返回参数的qx?׃负数是不能开qx的所以我们不能将该函数应用于负数.
字符函数
CHR
该函数返回与所l数值参数等当的字符q回的字W取决于数据库所依赖的字W集.
CONCAT
和||一个作用,把两个字W串q接h.
INITCAP
该函数将参数的第一个字母变为大写此外其它的字母则{换成写.
LOWER 和UPPER
如你所料LOWER 参数{换ؓ全部写字母而UPPER 则把参数全部转换成大写字?
LPAD 与RPAD
q两个函数最需要两个参数最多需要三个参数每一个参数是需要处理的字符?br />
W二个参数是需要将字符串扩充的宽度W三个参数表C加宽部分用什么字W来做填?br />
W三个参数的默认gؓI格但也可以是单个的字符或字W串.
LTRIM 与RTRIM
LTRIM 和RTRIM臛_需要一个参数最多允怸个参数第一个参CLPAD 和RPAD
cM是一个字W串W二个参C是一个字W或字符串默认则是空格如果第二个
C是空格的话那么该函数会像剪除空格那样剪除所指定的字W?
REPLACE
它的工作如果它的名字所说的那样该函数需要三个参数第一个参数是需要搜?br />
的字W串(列名Q,W二个参数是搜烦的内容第三个参数则是需要替换成的字W串如果W三?br />
参数省略或者是NULL 那么只执行搜烦操作而不会替换Q何内?
SUBSTR
q个函数有三个参数允怽目标字W串的一部䆾输出Q第一个参Cؓ目标字符Ԍ
W二个字W串是将要输出的子串的v点,W三个参数是要输出的子串的长度?br />
如果W二个参Cؓ负数那么会从源串的N开始向前定位至负数的绝对值的位置?br />
TRANSLATE
q一函数有三个参敎ͼ目标字符丌Ӏ源字符串和目的字符Ԍ在目标字W串与源字符
串中均出现的字符会被替换成对应的目的字W串的字W?br />
INSTR
如果需要知道在一个字W串中满特定的内容的位|可以用INSTR Q它的第一个参
数是目标字符ԌW二个参数是匚w的内容,W三和第四个参数是数字用以指定开始搜
索的L以及指出W几个满x件的会被返回?br />
LENGTH
LENGTH返回指定字W串的长度?br />
转换函数
转换函数有三个可以你方便地数据从一U类型变换ؓ另一U类型?br />
TO_CHAR
该函数的最初功能是一个数字{换ؓ字符型,不同的解释器可能会用它来{换其它的
数据cd例如日期型{换ؓ字符型或者是拥有更多的参数?br />
TO_NUMBER
该函CTO_CHAR 函数相对应显而易见它是将一个字W串型数字{换ؓ数值型?br />
其他函数
GREATEST 与LEAST
q两个函数将q回几个表达式中最大的和最的?br />
SELECT GREATESTQ?#8216;ALPHA’Q?#8216; BRAVO’Q?#8216; FOXTROT’Q?#8216; DELTA’Q?FROM CONVERTQ?br />
看来有必要用FROM 子句可是如果FROM 子句没有的话你将会收C个错误信息每
一个SELECT 语句都需要FROM 子句?br />
USER
该函数返回当前用数据库的用L名字
字段cd 中文说明 限制条g 其它说明 |
存储q程为:
CREATE OR REPLACE PROCEDURE TESTA(PARA
BEGIN
INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);
END TESTA;
然后呢,?/span>java里调用时q下面的代码:
package com.hyq.src;
import java.sql.*;
import java.sql.ResultSet;
public class TestProcedureOne {
public TestProcedureOne() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
CallableStatement proc = null;
proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");
proc.setString(1, "100");
proc.setString(2, "TestOne");
proc.execute();
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
当然了,q就先要求要建张?/span>TESTTB,里面两个字段Q?/span>I_IDQ?/span>I_NAMEQ?/span>
二:有返回值的存储q程Q非列表Q?/span>
存储q程为:
CREATE OR REPLACE PROCEDURE TESTB(PARA
BEGIN
SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;
?/span>java里调用时q下面的代码:
package com.hyq.src;
public class TestProcedureTWO {
public TestProcedureTWO() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
CallableStatement proc = null;
proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
proc.setString(1, "100");
proc.registerOutParameter(2, Types.VARCHAR);
proc.execute();
String testPrint = proc.getString(2);
System.out.println("=testPrint=is="+testPrint);
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
}
注意Q这里的proc.getString(2)中的数?/span>2qL的,而是和存储过E中?/span>out列对应的Q如?/span>out是在W一个位|,那就?/span>proc.getString(1)Q如果是W三个位|,是proc.getString(3)Q当然也可以同时有多个返回|那就是再多加几个out参数了?/span>
三:q回列表
׃oracle存储q程没有q回|它的所有返回值都是通过out参数来替代的Q列表同样也不例外,但由于是集合Q所以不能用一般的参数Q必要?/span>pagkage?/span>.所以要分两部分Q?/span>
1Q?span> Z个程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
2Q徏?/span>存储q程Q存储过EؓQ?/span>
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
BEGIN
OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;
可以看到Q它是把游标Q可以理解ؓ一个指针)Q作Z?/span>out 参数来返回值的?/span>
?/span>java里调用时q下面的代码:
package com.hyq.src;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;
public class TestProcedureTHREE {
public TestProcedureTHREE() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, "hyq", "hyq");
CallableStatement proc = null;
proc = conn.prepareCall("{ call hyq.testc(?) }");
proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
rs = (ResultSet)proc.getObject(1);
while(rs.next())
{
System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");
}
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
在这里要注意Q在执行前一定要先把oracle的驱动包攑ֈclass路径里,否则会报错的?/span>
Oracle对Oracle9i SQL 做了一些很重要的改q,包括一些o人兴奋的新特点,支持1Q?的数量和ISO99中的SQL标准。作为Oracle的补充,它包括以下新的TABLE JOIN的句法结构:
CROSS IN——它在两个表g创徏了一个卡q尔列,p是在Oracle8i中没写WHERE旉栗?/p>
NATURAL JOIN——这是一个很有用的Oracle9i的句法,它通过从WHERE子句中移动连接标准来改善SQL的稳定?
USING子句——它可以通过名字来具体指定连?
ON子句——这个句法允许在两个表格中ؓq接具体指定栏目的名?
LEFT OUTER JOIN——它q回表格中左边的行和双的数|如果没有搭配的行的话Q则q回?
RIGHT OUTER JOIN——它q回表格中右边的行和左边的数|如果没有搭配的行的话Q则q回?
FULL OUTER JOIN——它q回的是两个表格中所有的行,用零填满每一个空根{这在Oracle8i中则没有相应的此U句?
大多数改q都是ؓ了让那些非Oracle的请求以快速的q入Oracle数据库而引q的Qƈ且必记住这些只是句法上的不同,ISO99标准q没有给Oracle9i SQL带来M新的功能?br />
The CROSS JOIN
在Oracle中,CROSS JOIN产生了一?#8220;卡_的产物QCartesian productQ?#8221;Q就象是在连接两个表格时忘记加入一个WHERE子句一?
select last_name,dept_id
from emp,depts;
在Oracle9i中,我们使用CROSS JOIN 来达到相同的l果
select last_name.dept_id
from emp
CROSS JOIN dept;
NATURAL JOIN
我喜ƢNATURAL JOIN的原因在于它能够通过在两个表g配对的栏目的名头来自动的查join。它同时q简化了Oracle9i SQL,׃where子句仅仅只能qo谓语Q当ӞNATURAL JOIN要求在每一个表g的栏目的名字相同。很有意思的是,q种Ҏ甚臛_没有主要的或是外来的关键词作为参考是也能起作?
Oracle8i,
Select book_title, sum(quantity)
From book, sales
Where book.book_id = sales.book_id
group by book_title;
Oracle9i
Select book_title, sum(quantity)
from book
natural join sales
group by book_title;
USING子句
假如几个栏目有同L名字Q而你又不想用所有的q些栏目来连接的时候,你就可以用USING子句。在USING子句中所列的栏目的句子中不会有Q何的修饰词,包括where子句也不会有
Oracle8i
select dept_id, city
from departments, locations
where departments.location_id = location.location_id;
Oracle9i
select department_name, city
from departments
JOIN locations
USING (location_id);
ON子句
ON子句被用于当在两个表g的栏目名字不搭配时来q接表格。而连接条件就是where子句中的qo条g
Oracle8i
select department_name, city
from department, location
where department.location_id = location.loc_id;
Oracle9i
select department_name, city
from department d
JOIN location l
ON (d.location_id = l.id);
易变的连?
易变的连接就是两个以上的表格被连接所用的。ISO SQL 1999标准通常假设表格从左臛_q接Q连接的条g是能够ؓ现在的连接或以前的与左边的连接相兌的栏目提供参考?
Oracle8i
select emp_id, city_name, dept_name
from location l, department d, emp e
where d.location_id = l.location_id
and d.department_id = e.department_id;
Oracle9i
select emp_id, city_name, dept_name
from locations l
JOIN departments d ON (d.location_id = l.location_id)
JOIN employees e ON (d.department_id = e.department_id);
新的OUTER JOIN句法
ISO99标准把复杂的加号从Oracle outer join中拿出去Qƈ使得outer join SQL更容易理解?/p>
LEFT OUTER JOIN
在LEFT OUTER JOIN中,会返回所有左边表g的行Q甚臛_被连接的表格中没有可配对的栏目的情况下也如此。在下边的例子中Q返回了所有雇员的姓,甚至包括了那些没有分配到部门的雇员?
Oracle8i
select last_name, dept_id
from emp e, dept d
where e.department_id = d.department_id(+);
Oracle9i
select last_name, dept_id
from emp
LEFT OUTER JOIN Dept
ON e.dept_id = d.dept_id;
RIGHT OUTER JOIN
在RIGHT OUTER JOIN中返回的是表g所有右边的行,甚至在被q接的表g没有可配对的栏目的情况下也如此。在q个例子中,q回了所有部门的ID,包括那些没有一个雇员的的部门?
Oracle8i
select last_name, d.dept_id
from employees e, departments d
where e.department_id(+) = d.department_id;
Oracle9i
select last_name, d.dept_id
from employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
ȝ
ISO99标准是Oracle改进SQL工具的另一个例子。NATURAL JOIN LEFT OUTER JOIN ?RIGHT OUTER JOIN是这些改q中最受欢q的Q它们分别简化了SQL句法以及消除了对于复杂句法(比如+Q的需要?
SQL*Plus system/manager
2、显C当前连接用?
SQL> show user
3、查看系l拥有哪些用?
SQL> select * from all_users;
4、新建用户ƈ授权
SQL> create user a identified by a;Q默认徏在SYSTEM表空间下Q?
SQL> grant connect,resource to a;
5、连接到新用?
SQL> conn a/a
6、查询当前用户下所有对?
SQL> select * from tab;
7、徏立第一个表
SQL> create table a(a number);
8、查询表l构
SQL> desc a
9、插入新记录
SQL> insert into a values(1);
10、查询记?
SQL> select * from a;
11、更改记?
SQL> update a set a=2;
12、删除记?
SQL> delete from a;
13、回?
SQL> roll;
SQL> rollback;
14、提?
SQL> commit;
---------------------------------------------------------------
http://www.oradb.net/newuser/cg_sys.htm
---------------------------------------------------------------
|上资料很多Q?
http://www.oraclefan.net/ocp/sql/dba_monitor.txt
----------------------------------------------------------------
用户授权:
GRANT ALTER ANY INDEX TO "user_id "
GRANT "dba " TO "user_id ";
ALTER USER "user_id " DEFAULT ROLE ALL
创徏用户:
CREATE USER "user_id " PROFILE "DEFAULT " IDENTIFIED BY " DEFAULT TABLESPACE "USERS " TEMPORARY TABLESPACE "TEMP " ACCOUNT UNLOCK;
GRANT "CONNECT " TO "user_id ";
用户密码讑֮:
ALTER USER "CMSDB " IDENTIFIED BY "pass_word "
表空间创?
CREATE TABLESPACE "table_space " LOGGING DATAFILE 'C:\ORACLE\ORADATA\dbs\table_space.ora' SIZE 5M
------------------------------------------------------------------------
1、查看当前所有对?
SQL > select * from tab;
2、徏一个和a表结构一LI
SQL > create table b as select * from a where 1=2;
SQL > create table b(b1,b2,b3) as select a1,a2,a3 from a where 1=2;
3、察看数据库的大,和空间用情?
SQL > col tablespace format a20
SQL > select b.file_id 文gID,
b.tablespace_name 表空?
b.file_name 物理文g?
b.bytes d节数,
(b.bytes-sum(nvl(a.bytes,0))) 已?
sum(nvl(a.bytes,0)) 剩余,
sum(nvl(a.bytes,0))/(b.bytes)*100 剩余癑ֈ?
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_name,b.file_id,b.bytes
order by b.tablespace_name
/
dba_free_space --表空间剩余空间状?
dba_data_files --数据文gI间占用情况
4、查看现有回滚段及其状?
SQL > col segment format a30
SQL > SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS;
5、查看数据文件放|的路径
SQL > col file_name format a50
SQL > select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;
6、显C当前连接用?
SQL > show user
7、把SQL*Plus当计器
SQL > select 100*20 from dual;
8、连接字W串
SQL > select ? | |? from ?;
SQL > select concat(?,?) from ?;
9、查询当前日?
SQL > select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;
10、用户间复制数据
SQL > copy from user1 to user2 create table2 using select * from table1;
11、视图中不能使用order byQ但可用group by代替来达到排序目?
SQL > create view a as select b1,b2 from b group by b1,b2;
12、通过授权的方式来创徏用户
SQL > grant connect,resource to test identified by test;
SQL > conn test/test
13、查出当前用h有表名?
select unique tname from col;
-----------------------------------------------------------------------
/* 向一个表格添加字D?*/
alter table alist_table add address varchar2(100);
/* 修改字段 属?字段为空 */
alter table alist_table modify address varchar2(80);
/* 修改字段名字 */
create table alist_table_copy as select ID,NAME,PHONE,EMAIL,
QQ as QQ2, /*qq 改ؓqq2*/
ADDRESS from alist_table;
drop table alist_table;
rename alist_table_copy to alist_table
/* 修改表名 */
I值处?
有时要求列g能ؓI?
create table dept (deptno number(2) not null, dname char(14), loc char(13));
在基表中增加一?
alter table dept
add (headcnt number(3));
修改已有列属?
alter table dept
modify dname char(20);
注:只有当某列所有值都为空Ӟ才能减小其列值宽度?
只有当某列所有值都为空Ӟ才能改变其列值类型?
只有当某列所有值都ZI时Q才能定义该列ؓnot null?
例:
alter table dept modify (loc char(12));
alter table dept modify loc char(12);
alter table dept modify (dname char(13),loc char(12));
查找未断q接
select process,osuser,username,machine,logon_time ,sql_text
from v$session a,v$sqltext b where a.sql_address=b.address;
-----------------------------------------------------------------
1.以USER_开始的数据字典视图包含当前用户所拥有的信? 查询当前用户所拥有的表信息:
select * from user_tables;
2.以ALL_开始的数据字典视图包含ORACLE用户所拥有的信?
查询用户拥有或有权访问的所有表信息:
select * from all_tables;
3.以DBA_开始的视图一般只有ORACLE数据库管理员可以讉K:
select * from dba_tables;
4.查询ORACLE用户Q?
conn sys/change_on_install
select * from dba_users;
conn system/manager;
select * from all_users;
5.创徏数据库用P
CREATE USER user_name IDENTIFIED BY password;
GRANT CONNECT TO user_name;
GRANT RESOURCE TO user_name;
授权的格? grant (权限) on tablename to username;
删除用户(或表):
drop user(table) username(tablename) (cascade);
6.向徏好的用户导入数据?
IMP SYSTEM/MANAGER FROMUSER = FUSER_NAME TOUSER = USER_NAME FILE = C:\EXPDAT.DMP COMMIT = Y
7.索引
create index [index_name] on [table_name]( "column_name ")