??xml version="1.0" encoding="utf-8" standalone="yes"?>
http://www.oracle.com/
instantclient-basic-win32-11.2.0.1.0.zip
解压?/strong>在客L根目录创建tnsnames.ora文g
XE1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 16.157.1.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE1)
)
XE2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 16.157.1.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SID= XE2)
)
配置PL/SQL Developer
配置PL/SQL的oracle的目录位|?/strong>
tool-->preferences-->
在PL/SQL Developer安装目录下徏立一个start.bat脚本文g
讄环境变量
set path=C:\instantclient_11_2
set ORACLE_HOME=C:\instantclient_
set TNS_ADMIN=C:\instantclient_11_
set NLS_LANG=AMERICAN_AMERICA.
start PLSQLDev.exe
具体说明NLS_LANG的取?br />
格式:NLS_LANG=language_territory.charset
取值来?select * from v$nls_parameters
查询nls的参敎ͼ获得数据库服务器端的字符~码
,需要保证要讄客户端字W集与服务器端字W集一?
NLS_LANGUAGE
NLS_CHARACTERSET
数据库参数NLS Database Parameters
NLS_CHARACTERSET JA16SJIS
NLS_NCHAR_CHARACTERSET AL16UTF16
一Q对于VARCHAR2字段
现象Q在面上输入“~”存入DB后再取出到页面时变成??strong>Q页面的字符讄为charset=shift-jisQ?/strong>
调查Q?br />1 面提交后在java中观察编码ؓ\uff5e
2 java中定义一个字W变量“~”观察编码ؓ\uff5e
3 ~码为\uff5e的字W存入数据库再取出的~码为\u301c
4 用Object Browser观察数据库中字符都正?br />l论Q存入数据库时编码发生了变化\uff5e ---> \u301c
解决Q取出数据时遍历发现\u301cp{换ؓ\uff5e
public String getString(int columnIndex) throws SQLException {
// TODO: ~を変更
String value = rs.getString(columnIndex);
if (value != null){
StringBuffer sbDest = new StringBuffer();
char ch;
for(int j= 0;j< value.length();j++){
ch = value.charAt(j);
if(ch == 0x301c){
sbDest.append("\uff5e"); // ?br /> }else{
sbDest.append(ch);
}
}
value = sbDest.toString();
}
return value;
}
二:对于NVARCHAR2字段
现象Q在面上输入正波浪U쀜~”存入DB后再取出到页面时变成反L线“〜?strong>Q页面的字符讄为charset=UTF-8Q?br />用Object Browser工具察看表中的数?发现是正波浪U쀜~?~码为\u301c。(实际上用Object Browser看\u301c \uff5e都是正L线Q?br />如果用NVARCHAR2字段Q那么正的操作后可以存入\uff5e
试验用表 Products Q表中的列定义如下所C?br />id - VARCHAR2(10) ?产品 id
lang_id ?VARCHAR2(10) ?语言 id
description ?NVARCHAR2(2000) ?Unicode ~码的品描q?br />
JDBC 允许 Java E序讉K Oracle9i 数据库中?NVARCHAR2 数据cd的列。Oracle JDBC 驱动E序?SQL NCHAR/NVARCHAR2 列中的数据从本地字符集编码(UTF8 ?AL16UTF16Q直接{化ؓ UTF-16 ~码?Java 字符丌Ӏ?br />为此Q我们需要把 Java 字符串绑定到一?NVARCHAR2 列。下面的代码D|CZ完成q项d的代码?/p>
// Get an Oracle preparedstatement
OraclePreparedStatement orastmt =(OraclePreparedStatement)connection.prepareStatement(
"INSERT INTO PRODUCTS VALUES(?,?,?)");
// Bind the 3rd parameter to NVARCHAR2 form so that the data is stored as unicode
orastmt.setFormOfUse(3,OraclePreparedStatement.FORM_NCHAR);
orastmt.setString(1,product.getId());
orastmt.setString(2,product.getLangId());
orastmt.setString(3,product.getDescription());
orastmt.executeUpdate();
orastmt.close();
使用 orastmt.setFormOfUse() Ҏ来指定列的类型是 NVARCHAR2。确保数据以Unicode ~码存储?br />
关于NVARCHAR2字段的操作参考:
http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/9i_jdbc/NCHARsupport4UnicodeSample/Readme.html
注意q段话:
The only difference in usage between the SQL CHAR and SQL NCHAR datatypes occur in a data bind situation.
The JDBC program must call the setFormOfUse() method to specify if the data is bound for a SQL NCHAR
datatype and it must be called before binding Java variables to SQL NCHAR datatypes.
必须先setFormOfUse再绑定变量。否则存入数据库中的仍是\u301c
select * from t1 where exists ( select null from t2 where y = x )
执行的过E相当于:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop
表 T1 不可避免的要被完全扫描一?/p>
分别适用在什么情?
以子查询 ( select y from T2 )虑方向
如果子查询的l果集很大需要消耗很多时_但是T1比较执? select null from t2 where y = x.x )非常快,那么exists比较适合用在q里
相对应得子查询的l果集比较小的时候就应该使用in.
2 含义上的比较
在标准的scott/tiger用户?br />
EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | |
1 | 7499 | ALLEN | SALESMAN | 7698 | 1981/02/20 | 1600.00 | 300.00 | 30 |
2 | 7521 | WARD | SALESMAN | 7698 | 1981/02/22 | 1250.00 | 500.00 | 30 |
3 | 7566 | JONES | MANAGER | 7839 | 1981/04/02 | 2975.00 | 20 | |
4 | 7654 | MARTIN | SALESMAN | 7698 | 1981/09/28 | 1250.00 | 1400.00 | 30 |
5 | 7698 | BLAKE | MANAGER | 7839 | 1981/05/01 | 2850.00 | 30 | |
6 | 7782 | CLARK | MANAGER | 7839 | 1981/06/09 | 2450.00 | 10 | |
7 | 7788 | SCOTT | ANALYST | 7566 | 1987/04/19 | 3000.00 | 20 | |
8 | 7839 | KING | PRESIDENT | 1981/11/17 | 5000.00 | 10 | ||
9 | 7844 | TURNER | SALESMAN | 7698 | 1981/09/08 | 1500.00 | 0.00 | 30 |
10 | 7876 | ADAMS | CLERK | 7788 | 1987/05/23 | 1100.00 | 20 | |
11 | 7900 | JAMES | CLERK | 7698 | 1981/12/03 | 950.00 | 30 | |
12 | 7902 | FORD | ANALYST | 7566 | 1981/12/03 | 3000.00 | 20 | |
13 | 7934 | MILLER | CLERK | 7782 | 1982/01/23 | 1300.00 | 10 |
另外在看一下数据库的CPU占用率,如果占用率在l常?0%Q?00%Q那一定要是SQL或存储过E及trigger中写的不好?
不需要从应用层找SQLQ方向性错误,太篏Q也看不出效果?
而应当用pl/SQL, toad{工P分析出最bad的SQL语句Q一看到q些语句后,再修改应用层的查询就是了。又快又方便?
-- 逻辑d的SQL
select * from (select buffer_gets, sql_text
from v$sqlarea
where buffer_gets > 500000
order by buffer_gets desc) where rownum<=30;
-- 执行ơ数多的SQL
select sql_text,executions from
(select sql_text,executions from v$sqlarea order by executions desc)
where rownum<81;
-- ȝ盘多的SQL
select sql_text,disk_reads from
(select sql_text,disk_reads from v$sqlarea order by disk_reads desc)
where rownum<21;
-- 排序多的SQL
select sql_text,sorts from
(select sql_text,sorts from v$sqlarea order by sorts desc)
where rownum<21;
--分析的次数太多,执行的次数太,要用l变量的Ҏ来写sql
set pagesize 600;
set linesize 120;
select substr(sql_text,1,80) "sql", count(*), sum(executions) "totexecs"
from v$sqlarea
where executions < 5
group by substr(sql_text,1,80)
having count(*) > 30
order by 2;
转蝲地址 http://forum.javaeye.com/viewtopic.php?t=19464
CREATE OR REPLACE procedure Test2
as
begin
--set transaction read write;
insert into aaa values(2,5,8);
Test1;
insert into aaa values(3,6,9);
rollback;
end;
/
当execute Test2完了时在AAA表中插入了一行(1Q?Q?Q?BR>
--------------------------------------------------------------------------------------------------------------------------
理论知识:
AUTONOMOUS TRANSACTION(自治事务)的介l?
在基于低版本的ORACLE做一些项目的q程?有时会遇C些头疼的问题.,比如惛_执行当前一个由多个DMLl成的transaction(事务)?为每一步DML记录一些信息到跟踪表中,׃事务的原子?q些跟踪信息的提交将军_于主事务的commit或rollback. q样一来写E序的难度就增大? E序员不得不把这些跟t信息记录到cM数组的结构中,然后在主事务l束后把它们存入跟踪??真是ȝ!
有没有一个简单的Ҏ解决cM问题呢?
ORACLE8i的AUTONOMOUS TRANSACTION(自治事务Q以下AT)是一个很好的回答?/P>
AT 是由M?以下MT)调用但是独立于它的事务。在AT被调用执行时QMT被挂P在AT内部Q一pd的DML可以被执行ƈ且commit或rollback.
注意׃AT的独立性,它的commit和rollbackq不影响MT的执行效果。在AT执行l束后,M务获得控制权Q又可以l箋执行了?/P>
如何实现AT的定义呢Q我们来看一下它的语法。其实非常简单?/P>
只需下列PL/SQL的声明部分加上PRAGMA AUTONOMOUS_TRANSACTION 可以了?/P>
1Q?nbsp; 的匿名PL/SQL?/P>
2Q?nbsp; Functions ?ProcedureQ独立声明或声明在package中都可)
3Q?nbsp; SQL Object Type的方?/P>
4Q?nbsp; 触发器?/P>
比如Q?/P>
在一个独立的procedure中声明AT
CREATE OR REPLACE PROCEDURE
Log_error(error_msg IN VARCHAR2(100))
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
Insert into Error_log values ( sysdate,error_msg);
COMMIT;
END;
下面我们来看一个例子,Qwin2000 advanced server + oracle8.1.6 , connect as scottQ?/P>
建立一个表:
create table msg (msg varchar2(120));
首先,用普通的事务写个匿名PL/SQL块:
declare
cnt number := -1; --} Global variables
procedure local is
begin
select count(*) into cnt from msg;
dbms_output.put_line('local: # of rows is '||cnt);
insert into msg values ('New Record');
commit;
end;
begin
delete from msg ;
commit;
insert into msg values ('Row 1');
local;
select count(*) into cnt from msg;
dbms_output.put_line('main: # of rows is '||cnt);
rollback;
local;
insert into msg values ('Row 2');
commit;
local;
select count(*) into cnt from msg;
dbms_output.put_line('main: # of rows is '||cnt);
end;
q行l果(注意打开serveroutput)
local: # of rows is 1 -> 子程序local中可以’看到’主匿名块中的uncommitted记录
main: # of rows is 2 -> d名块可以’看到?条记?它们都是被local commit掉的)
local: # of rows is 2 -> 子程序local首先’看到?条记?然后又commit了第三条记录
local: # of rows is 4 -> 子程序local又’看到’了新增加的记录(它们都是被local commit掉的),然后又commit了第五条记录
main: # of rows is 5 -> d名块最后’看到’了所有的记录.
从这个例子中,我们看到COMMIT和ROLLBACK的位|无论是在主匿名块中或者在子程序中,都会影响到整个当前事?
现在用AT改写一下匿名块中的procedure local:
...
procedure local is
pragma AUTONOMOUS_TRANSACTION;
begin
...
重新q行(注意打开serveroutput)
local: # of rows is 0 -> 子程序local中无法可以’看到’主匿名块中的uncommitted记录 (因ؓ它是独立?
main: # of rows is 2 -> d名块可以’看到?条记?但只有一条是被commited.
local: # of rows is 1 -> 子程序local中可以’看到’它前一ơcommit的记?但是d名块中的记录已经被提前rollback?/P>
local: # of rows is 3 -> 子程序local 中可以’看到?条记录包括主匿名块commit的记?/P>
main: # of rows is 4 ->d名块最后’看到’了所有的记录.
很明?AT是独立的,在它执行?MT被暂停了. AT的COMMIT,ROLLBACKq不影响MT的执?
q用AT?有一些注意事?单列丑֦?
1. 在匿名PL/SQL块中,只有的匿名PL/SQL块可以被设ؓAT
2. 如果AT试图讉K被MT控制的资?可能有deadlock发生.
3. Package 不能被声明ؓAT,只有package所拥有的function和procedure 才能声明为AT
4. ATE序必须以commit 或rollbackl尾,否则会生Oracle错误ORA-06519: active autonomous transaction detected and rolled back
在程序开发时,如果充分q用AUTONOMOUS TRANSACTION的特?一定能取得事倍功半的效果.
一些PL/SQL的小Ҏ?
DECLARE
-- Local variables here
i INTEGER;
idx VARCHAR2(2000);
TYPE word_list IS TABLE OF idx%TYPE INDEX BY idx%TYPE;
the_list word_list;
wChar VARCHAR2(2000);
wTmp varchar2(2000);
num1 NUMBER(12);
chr1 CHAR(5);
FUNCTION tstChar(inputChr IN CHAR) RETURN NUMBER IS
BEGIN
dbms_output.put_line('|' || inputChr || '|');
RETURN 1;
END;
BEGIN
-------------------------------------------------------------
-- Max Min value
-------------------------------------------------------------
num1 := greatest(100,200,300,210,120,99);
dbms_output.put_line(num1); -- 300
wTmp := greatest('abc','bcd','cde','xxx','zzz','yyy');
dbms_output.put_line(wTmp); -- zzz
wTmp := least('abc','bcd','cde','xxx','zzz','yyy');
dbms_output.put_line(wTmp); -- abc
-------------------------------------------------------------
-- substr
-------------------------------------------------------------
wTmp := 'abcdefg';
wTmp := substr(wTmp,-3,2);
dbms_output.put_line(wTmp); -- ef
-------------------------------------------------------------
-- lpad
-------------------------------------------------------------
wTmp := lpad(wTmp,10,'?');
dbms_output.put_line(wTmp); -- ????????ef
wTmp := NULL;
wTmp := lpad(wTmp,10,'?');
dbms_output.put_line(wTmp); -- null
-------------------------------------------------------------
-- length of char
-------------------------------------------------------------
chr1 := 'aaa';
num1 := tstChar(chr1);
-------------------------------------------------------------
-- table indexed by varchar2
-------------------------------------------------------------
dbms_output.put_line('------ test 1 collection index by varchar2------');
the_list('key1') := 'value1';
the_list('key2') := 'value2';
the_list('key3') := 'value3';
the_list('key0') := NULL;
idx := the_list.FIRST();
WHILE idx IS NOT NULL LOOP
Dbms_Output.Put_line(idx || ' ' || the_list(idx));
idx := the_list.NEXT(idx);
END LOOP;
IF the_list.EXISTS('aaa') THEN
Dbms_Output.Put_line('aaa');
ELSE
Dbms_Output.Put_line('no aaa');
END IF;
Dbms_Output.Put_line(the_list.COUNT);
the_list.delete('key1');
Dbms_Output.Put_line(the_list.COUNT);
-------------------------------------------------------------
-- handle null
-------------------------------------------------------------
dbms_output.put_line('------ test 2 handle null------');
idx := NULL;
idx := CASE WHEN idx IS NULL THEN 'is null' WHEN idx IS NOT NULL THEN 'is not null' ELSE 'else' END;
Dbms_Output.Put_line(idx);
idx := NULL;
SELECT decode(idx, NULL, 'is null', 'is not null', 'else')
INTO idx
FROM dual;
Dbms_Output.Put_line(idx);
idx := NULL;
idx := REPLACE('old_string_1', NULL, 'replace null');
Dbms_Output.Put_line(idx);
idx := REPLACE('old_string_2', '_', NULL);
Dbms_Output.Put_line(idx);
idx := 'apple' || NULL || NULL || 'sauce';
Dbms_Output.Put_line(idx);
-------------------------------------------------------------
-- 动态sql
-------------------------------------------------------------
wChar := 'select to_char(sysdate,''yyyy/mm/dd'') from dual ';
execute immediate wChar into idx;
Dbms_Output.Put_line('test execute immediate = ' || idx);
-------------------------------------------------------------
-- 隐式光标
-------------------------------------------------------------
-- for rec in (select * from mststrc21) loop
-- Dbms_Output.Put_line('rec = ' || rec.pantpatternno);
-- end loop;
-------------------------------------------------------------
-- trim()
-------------------------------------------------------------
--Trim(Leading|Trailing|Both trim_character from trim_source)
idx := TRIM(' abc ');
Dbms_Output.Put_line('|' || idx || '|');
idx := TRIM(' abc '); -- full space
Dbms_Output.Put_line('|' || idx || '|');
idx := TRIM(leading ' ' FROM ' abc '); -- full space
Dbms_Output.Put_line('|' || idx || '|');
idx := TRIM(leading 'ab' FROM 'abc');
Dbms_Output.Put_line('|' || idx || '|'); -- ORA-30001: 切捨てセットの文字は1つにする必要がありま?BR>
EXCEPTION
WHEN NO_DATA_FOUND THEN
Dbms_Output.Put_line('NO_DATA_FOUND');
Dbms_Output.Put_line(SQLCODE);
Dbms_Output.Put_line(SQLERRM);
WHEN TOO_MANY_ROWS THEN
Dbms_Output.Put_line('TOO_MANY_ROWS');
Dbms_Output.Put_line(SQLCODE);
Dbms_Output.Put_line(SQLERRM);
WHEN OTHERS THEN
Dbms_Output.Put_line('OTHERS');
Dbms_Output.Put_line(SQLCODE);
Dbms_Output.Put_line(SQLERRM);
END;
http://forum.javaeye.com/viewtopic.php?t=1603
但是q没有得出明的l论。先让我们看看事务的定义Q?
引用:
Transactions are described in terms of ACID properties, which are as follows:
n Atomic: all changes to the database made in a transaction are rolled back if any
change fails.
n Consistent: the effects of a transaction take the database from one consistent
state to another consistent state.
n Isolated: the intermediate steps in a transaction are not visible to other users of
the database.
n Durable: when a transaction is completed (committed or rolled back), its effects
persist in the database.
即ACID的定义,从上面看来,g除了isolated之外Q和只读查询都没有关pR那么是否只L询不需要事务呢Q?
再看看Oracle对于只读事务的定义:
引用:
Read-Only Transactions
By default, Oracle guarantees statement-level read consistency. The set of data returned by a single query is consistent with respect to a single point in time. However, in some situations, you might also require transaction-level read consistency. This is the ability to run multiple queries within a single transaction, all of which are read-consistent with respect to the same point in time, so that queries in this transaction do not see the effects of intervening committed transactions.
If you want to run a number of queries against multiple tables and if you are not doing any updating, you prefer a read-only transaction. After indicating that your transaction is read-only, you can run as many queries as you like against any table, knowing that the results of each query are consistent with respect to the same point in time.
Oracle默认情况下保证了SQL语句U别的读一致性,卛_该条SQL语句执行期间Q它只会看到执行前点的数据状态,而不会看到执行期间数据被其他SQL改变的状态?
而Oracle的只L?read-only transaction)则保证了事务U别的读一致性,卛_该事务范围内执行的多条SQL都只会看到执行前点的数据状态,而不会看C务期间的M被其他SQL改变的状态?
因此我们可以得出l论Q?
如果你一ơ执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL执行期间的读一致性;
如果你一ơ执行多条查询语句,例如l计查询Q报表查询,在这U场景下Q多条查询SQL必须保证整体的读一致性,否则Q在前条SQL查询之后Q后条SQL查询之前Q数据被其他用户改变Q则该次整体的统计查询将会出现读数据不一致的状态,此时Q应该启用事务支持?
只读事务与读写事务区?
对于只读查询Q可以指定事务类型ؓreadonlyQ即只读事务。由于只M务不存在数据的修改,因此数据库将会ؓ只读事务提供一些优化手D,例如Oracle对于只读事务Q不启动回滚D,不记录回滚log?
在JDBC中,指定只读事务的办法ؓQ?
connection.setReadOnly(true);
在Hibernate中,指定只读事务的办法ؓQ?
session.setFlushMode(FlushMode.NEVER);
此时QHibernate也会为只M务提供Session斚w的一些优化手D?
在Spring的Hibernate装中,指定只读事务的办法ؓQ?
bean配置文g中,prop属性增加“readOnly?/FONT>
我在MySQL4.1试验了一下,q程和结果如下:
数据库:MySQL4.1
表类型:InnoDB
SpringQ?.1.2
HibernateQ?.1.7
使用Spring的声明式事务理
试验q程如下Q?
不设|查询方法的事务cd(即不需要事?Q访问查询页面,后台执行Spring的BeanҎQ让Hibernate发送select语句Q然后手工在MySQL里面修改该记录某字段|再访问查询页面,发现被修改过的字D值ƈ没有变化QHibernate输出的log昄Q数据库q是把老的字段D回,而没有返回新的字D倹{?
讄查询Ҏ的事务类?只读事务)Q访问查询页面,后台执行Spring的BeanҎQ让Hibernate发送select语句Q然后手工在MySQL里面修改该记录某字段|再访问查询页面,发现被修改过的字D值已l变化,Hibernate输出的log昄Q数据库q回新的字段倹{?
q个试验说明Q至在MySQL4.1的InnoDB情况下,不用只M务的查询无法读取到数据更新|必须使用只读事务来保证读记录的数据一致性。这个结果非o我诧异,和我预期完全两样?
我将在Oracleq_上试试看会有什么样的结果?
BTW: 如果MySQL的表cd改ؓMyISAMQ那么即使不讄事务Q也不会出现L据不一致的现象?/FONT>
oracle有两U方法保证在事务U读数据一致?Transaction-Level Read Consistency)
一是用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ,
当执行这条命令后L据时会生一些重复copy, 你也可以做数据修? 但在大量数据修改的情况下Ҏ造成deadlock或异? 用commit或rollback把ISOLATION LEVEL讑֛为缺省模式read committed,
二是用SET TRANSCATION READ ONLY
当执行这条命令时数据库会生成一个快照的latch, q个latch会耗费一些resource, 如果你想q行数据修改会导致异? 用commit或rollback会把latch释放? 也将把ISOLATION LEVEL讑֛为缺省模式read committed,
------ Test Oracle text
CREATE TABLE hdocs (
ID NUMBER PRIMARY KEY,
fmt VARCHAR2(10),
text VARCHAR2(80)
);
CREATE INDEX hdocsx ON hdocs(text) INDEXTYPE IS ctxsys.CONTEXT
PARAMETERS ('datastore ctxsys.file_datastore
filter ctxsys.inso_filter
format column fmt
');
-- charset column cset // can set charset
INSERT INTO hdocs VALUES(1, 'binary', 'D:\OracleText\Oracle.pdf');
INSERT INTO hdocs VALUES(2, 'text', 'D:\OracleText\1.txt');
INSERT INTO hdocs VALUES(3, 'binary', 'D:\OracleText\mydoc.doc');
COMMIT;
select t.*, score(1) from hdocs t WHERE contains(text,'索引ѝプの構文', 1) > 0
-- 索引の同期化
BEGIN
ctx_ddl.sync_index('hdocsx', '2M');
END;
/
-- sync
SET SERVEROUTPUT ON
DECLARE
job NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job, 'ctx_ddl.sync_index(''hdocsx'');', SYSDATE, 'SYSDATE + (3/1440)');
DBMS_OUTPUT.PUT_LINE('job '||job||' has been submitted.');
END;
/
-- optimizer
DECLARE
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''hdocsx'',''FULL'');', SYSDATE, 'SYSDATE + 1');
COMMIT;
END;
/
create or replace procedure syncidx
is
begin
execute immediate
'alter index hdocsx rebuild online' ||
' parameters ( ''sync'' )' ;
execute immediate
'alter index hdocsx rebuild online' ||
' parameters ( ''optimize full maxtime unlimited'' )' ;
end syncidx;
/
SET SERVEROUTPUT ON
DECLARE
job NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job, 'syncidx;', SYSDATE, 'SYSDATE + (3/1440)');
DBMS_JOB.RUN(job);
DBMS_OUTPUT.PUT_LINE('job '||job||' has been submitted.');
END;
/
Ҏ?: PL/SQL?select into 一个变量和直接l这个个变量赋值效果不?
DECLARE
vTmp VARCHAR2(1000);
BEGIN
SELECT to_char(sysdate,'EE','NLS_CALENDAR=''Japanese Imperial''') -- q号
INTO vTmp
FROM dual;
END;
l果: PL/SQL procedure successfully completed
DECLARE
vTmp VARCHAR2(1000);
BEGIN
vTmp := to_char(sysdate,'EE','NLS_CALENDAR=''Japanese Imperial'''); -- vTmp := 'qx'
END;
l果: ORA-06502: PL/SQL: 数値または値のエラヹ{発生しました
ORA-06512: ?
Ҏ?:用一个record变量直接修改表的记录.record中字D和表的字段的对应关p?
create table EMP
(
EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
)
create table EMP_2
(
EMPNO NUMBER(4) not null,
JOB VARCHAR2(9),
ENAME VARCHAR2(10),
MGR NUMBER(4),
HIREDATE DATE,
COMM NUMBER(7,2),
SAL NUMBER(7,2),
DEPTNO NUMBER(2)
)
DECLARE
rec EMP_2%ROWTYPE;
BEGIN
SELECT *
INTO rec
FROM emp
WHERE empno = 9999 ;
INSERT INTO EMP_2 VALUES rec;
END;
EMP
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
1 9999 terry1 CLERK 7782 1982/01/23 1300.00 10
EMP_2
EMPNO JOB ENAME MGR HIREDATE COMM SAL DEPTNO
1 9999 terry1 CLERK 7782 1982/01/23 1300.00 10
Ҏ?:取日本年?/FONT>
SELECT to_char(SYSDATE, 'EEYY MONTH DAY MM/DD HH24:MI:SS', 'NLS_CALENDAR=''Japanese Imperial''') FROM dual
>>>
qx17 4?nbsp; 火曜?nbsp; 04/19 17:34:15
选择?calvinxiu ?Blog http://dev.csdn.net/user/calvinxiu
天寒地冻Q呆在家里又d了《Mastering Oracle SQL?ndQ发现Oracle的功能还是很强悍Q光函数有两百个,HSQL是很难比拟的。接下来的硬骨头Q看来要么冒险用Hibernate3.0 的SQL Mapping功能Q要么就自己跑JDBCl装VO了?
在ORACLE7?数据库中只有数据库名(db_name)和数据库实例?instance_name)。在ORACLE8i?i中出C新的参数Q即数据库域?db_domain)、服务名(service_name)、以及操作系l环境变?ORACLE_SID)。这些都存在于同一个数据库中的标识Q用于区分不同数据库的参数?
一、什么是数据库名(db_name)? 数据库名是用于区分数据的内部标识Q是以二q制方式存储于数据库控制文g中的参数Q在数据安装或创Z后将不得修改。数据库安装完成后,该参数被写入数据库参数文件pfile中,格式如下Q?
db_name="orcl"
db_domain=dbcenter.toys.com
instance_name=orcl
service_names=orcl.dbcenter.toys.com
control_file=...............
在每一个运行的ORACLE8i数据库中都有一个数据库?db_name),如果一个服务器E序中创Z两个数据库,则有两个数据库名。其控制参数据分属在不同的pfile中控制着相关的数据库?
二、什么是数据库实例名(instance_name) 数据库实例名则用于和操作pȝ之间的联p,用于对外部连接时使用。在操作pȝ中要取得与数据库之间的交互,必须使用数据库实例名。例如,要和某一个数据库serverq接Q就必须知道其数据库实例名,只知道数据库名是没有用的Q与数据库名不同Q在数据安装或创建数据库之后Q实例名可以被修攏V数据库安装完成后,该实例名被写入数据库参数文gpfile中,格式如下Q?
db_name="orcl" #(不允怿?
db_domain=dbcenter.toys.com
instance_name=orcl #(可以修改,可以与db_name相同也可不同)
service_names=orcl.dbcenter.toys.com
control_file=...............
数据库名与实例名之间的关pR?数据库名与实例名之间的关pM般是一一对应关系Q有一个数据库名就有一个实例名Q如果在一个服务器中创Z个数据库Q则有两个数据库名,两个数据库实例名Q用两个标识定一个数据库Q用户和实例相连接?但在8i?i的ƈ行服务器l构中,数据库与实例之间不存在一一对应关系Q而是一对多关系Q?一个数据库对应多个实例Q同一旉内用户只一个实例相联系Q当某一实例出现故障Q其它实例自动服务,以保证数据库安全q行?
三、操作系l环境变?ORACLE_SID) 在实际中Q对于数据库实例名的描述有时使用实例?instance_name)参数Q有时用ORACLE_SID参数。这两个都是数据库实例名Q它们有什么区别呢Q?l常弄)
(ORACLE_SID) OS<----------------> ORACLE 数据?<--------(Instance_name(实例?)
上图表示实例名instance_name、ORACLE_SID与数据库及操作系l之间的关系Q虽然这里列出的两个参数都是数据库实例名Q但instance_name参数是ORACLE数据库的参数Q此参数可以在参数文件中查询刎ͼ而ORACLE_SID参数则是操作pȝ环境变量?操作pȝ环境变量ORACLE_SID用于和操作系l交互。也是_在操作系l中要想得到实例名,必M用ORACLE_SID。此参数与ORACLE_BASE、ORACLE_HOME{用法相同。在数据库安装之后,ORACLE_SID被用于定义数据库参数文g的名U。如Q?$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora?定义Ҏ: export ORACLE_SID=orcl
如果在同一服务器中创徏了多个数据库Q则必然同时存在多个数据库实?q时可以重复上述定义q程Q以选择不同实例?
q可以用 [oracle@Datacent]$ . oraenv 来切换不同的ORACLE_SID来通过操作pȝ来启动不同的实例(instance)
private void updateChar(Connection conn,int index) throws SQLException{
String SQL = " UPDATE KMD_DOWNLOADRRK_T SET OUTPUTQUERY = ? " +
" WHERE RRKCD = ?";
PreparedStatement pstmt = null;
try{
pstmt=conn.prepareStatement(SQL);
//パラメーѝゅR?BR> String query = "length must <= 2000";
StringReader read = new StringReader(query);
pstmt.setCharacterStream(1,read,query.length());
pstmt.setString(2, "001");
pstmt.executeUpdate();
}finally{
if(pstmt != null) pstmt.close();
}
}
setCharacterStream() 的用比较复? Oracle|站上还介绍了一U解军_?用两个参数对应一个字D?BR>比如emp表中有一个字Dmemo
insert into emp(memo) values (?||?); 只要保证l每个参数赋的g过限制长度卛_.
题外话:
2000对于oracle PL/SQL中的VARCHAR2变量来说是比较特D的是数字?BR>定义一个小?000的VARCHAR2变量Q那么oracle把它放在栈内存 如果大于2000放在堆内存?BR>