一 Orcale的大字段用clob,图像用blob,clob字段在Hibernate的映射文件中用String就可以
二 Orcale备份数据库表:
create table test_bak as select * from test
三 Orcale配置客户端:
D:\oracle\product\10.1.0\Db_1\NETWORK\ADMIN\tnsnames.ora 添加
CSMW =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.93)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = CSMW)
)
)
四 VARCHAR2(10) 可以存10个字符,5个汉字
五
1)复制表结构及其数据:
create table table_name_new as select * from table_name_old
2) 只复制表结构:
create table table_name_new as select * from table_name_old where 1=2;
六 查找表中某列的重复记录
select *
from User u
where u.user_name in (select u.user_name
from User u
group by u.user_name having count(*) > 1)
七 存储过程:
create or replace procedure test(age in number,sex in varchar,a out number) is
v_count number;
v_errorcode number;
v_errormsg varchar2(1024);
begin
v_count :=1;
insert into USERS values(v_count,'zz',age,to_char(sex));
a := v_count;
dbms_output.put_line('aaaa');
commit;
end;
存储过程填给两个参数赋值:
SELECT field_name,data_type into v_fieldName,v_dataType
FROM tapp_field WHERE table_id = p_tableID and field_id = p_fieldID;
八 游标
动态游标: 动态游标虽然可以使游标变的很灵活,但是这使得在使用函数的时候才能确定是用哪个SQL语句,导致性能会差很多,再数据量小的时候再考虑使用。
create or replace function QBLRESULTINFO(Id in varchar2,inputName in varchar2) return varchar2 is Result varchar2(100); --这里必须是varchar2型,因为hi_antigen字段是varchar2型,字符串相加的话 --类型要相同 v_sql varchar2(200); v_str varchar2(200); TYPE c_table IS REF CURSOR; --因为这里要使用动态的字段名称,所以这里要声明为动态游标 getResult c_table; begin if inputName='hi_result' then --不同的字段名称,对应的SQL语句也不同,这样写避免了每个字段写一个函数 v_sql := 'select decode('||inputName||',''1'',''阳性'',''2'',''阴性'') from lws_q_bl_result_info i where i.id_parent = '''||Id||''''; elsif inputName='hi_antigen' then v_sql := 'select (select d.names from lws_dd_dict_qbl d where d.code = '||inputName||' and pid = 17) from lws_q_bl_result_info i where i.id_parent = '''||Id||''''; end if; open getResult for v_sql ; loop fetch getResult into v_str; exit when getResult%notfound; --必须放在Result := Result ||','|| v_str; 这句之前,否则会多执行一次该句, --因为loop是直到见到exit才退出循环的 if(v_str is not null) then Result := Result ||','|| v_str; --结果应为“阳性,阴性”这样 end if; end loop; close getResult; /* for z in (v_str) loop --这里无法使用隐式游标,因为SQL语句是动态的 if(z.hi_antigen is not null) then Result := Result ||','|| z.hi_antigen ; end if; end loop; */ if(substr(Result,1,1)=',') then --去掉字符串开头的逗号 Result := substr(Result,2,length(Result)); end if; return(Result); end;
显示游标:
create or replace function QBLRESULTINFO_SRH_YANG(Id in varchar2) return varchar2 is Result varchar2(100); --这里必须是varchar2型,因为hi_antigen字段是varchar2型,字符串相加的话 --类型要相同 v_str varchar2(200); cursor getResult is select (select d.names --声明游标 from lws_dd_dict d where d.code = srh_yang and pid = 23) from lws_q_bl_result_info i where i.id_parent = Id; begin open getResult; loop fetch getResult into v_str; exit when getResult%notfound; --必须放在Result := Result ||','|| v_str; 这句之前,否则会多执行一次该句, --因为loop是直到见到exit才退出循环的 if(v_str is not null) then Result := Result ||','|| v_str; --结果应为“阳性,阴性”这样 end if; end loop; close getResult; if(substr(Result,1,1)=',') then --去掉字符串开头的逗号 Result := substr(Result,2,length(Result)); end if; return(Result); end;
隐式游标:
create or replace function ANTIGEN(Id in varchar2) return varchar2 is Result varchar2(100); --这里必须是varchar2型,因为hi_antigen字段是varchar2型,字符串相加的话 --类型要相同 begin for z in (select decode(hi_antigen,'1','阳性','2','阴性') hi_antigen from lws_q_bl_result_info i where i.id_parent = Id) loop if(z.hi_antigen is not null) then Result := Result ||','|| z.hi_antigen ; end if; end loop; if(substr(Result,1,1)=',') then --去掉字符串开头的逗号 Result := substr(Result,2,length(Result)); end if; return(Result); end ANTIGEN;
ps: 静态游标(显示游标和隐式游标)要比动态游标效率高。动态游标只有在以下情况下使用。
1)把结果集返回给客户端;
2)在多个子例程之间共享游标;
3)没有其他有效的方法来达到你的目标时,则使用ref游标,正如必须用动态SQL时那样;
普通cursor与REF cursor还有一些大家应该都熟悉的区别,我再浪费点唾沫。
1)PL/SQL静态光标不能返回到客户端,只有PL/SQL才能利用它。ref光标能够被返回到客户端,这就是从Oracle的存储过程返回结果集的方式。
2)PL/SQL静态光标可以是全局的,而ref光标则不是。 也就是说,不能在包说明或包体中的过程或函数之外定义ref光标。 只能在定义ref光标的过程中处理它,或返回到客户端应用程序。
3)ref光标可以从子例程传递到子例程,而光标则不能。 为了共享静态光标,必须在包说明或包体中把它定义为全局光标。 因为使用全局变量通常不是一种很好的编码习惯,因此可以用ref光标来共享PL/SQL中的光标,无需混合使用全局变量。
九 存储过程返回结果集
存储过程返回结果集的话要使用REF CURSUR 游标返回
先创建一个包:
CREATE OR REPLACE PACKAGE pkg_test AS TYPE myrctype IS REF CURSOR; PROCEDURE get (p_rc OUT myrctype); END pkg_test;
再创建包体内容:
CREATE OR REPLACE PACKAGE BODY pkg_test AS PROCEDURE get (p_rc OUT myrctype) --建立存储过程get IS sqlstr VARCHAR2 (500); BEGIN -- 进行所需的增删改查操作,最后通过游标返回结果集 OPEN p_rc FOR select * from sari_j_caseinfo t; END get; END pkg_test;
然后通过JAVA调用该存储过程:
public void testPro() { // TODO Auto-generated method stub System.out.println("调用get存储过程!"); Session s = dao.openSession(); try { CallableStatement cs = s .connection() .prepareCall( "{call pkg_test.get(?)}"); cs.registerOutParameter(1, OracleTypes.CURSOR); cs.execute(); ResultSet r = (ResultSet)cs.getObject(1); cs.close(); List list = new ArrayList(); //取到的结果集转换成LIST while(r.next()){ SariJCaseinfo sariJCaseinfo = new SariJCaseinfo(); sariJCaseinfo.setCaseId(r.getString("case_id")); list.add(sariJCaseinfo); } } catch (Exception e) { e.printStackTrace(); } finally { s.close(); System.out.println("OK..."); } }
ps:
1)identifier 'PKG_TEST.GET' must be declared 的错误可能是用一个用户在数据库中建立了一个存储过程,又用另一个用户去调用导致的。
2)
org.apache.commons.dbcp.DelegatingCallableStatement with address: "oracle.jdbc.driver.OracleCallableStatement@1dc4ead" is closed.
错误是因为之前的 ResultSet r = (ResultSet)cs.getObject(1); 放在了cs.close(); 导致的。
十 批量更新ID,ID号每一行+1
两种方法:
1)建立一个序列:
create sequence SEQ_ZSF_ID
minvalue 1
maxvalue 99999
start with 21
increment by 1
cache 20
order;
然后直接
update table set 字段 = SEQ_ZSF_ID.nextval
2)
create or replace procedure TTT is v_str number; begin v_str := 1; for z in (select * from test_zjj) loop update test_zjj set id = v_str where id = z.id; v_str:=v_str+1; end loop; end TTT;
十一 orcale中取得唯一序列的方法是 select sys_guid() from dual
十二 如果数据库配置的查询中是select * from A where a like '?__' 形式,而?可能被当成字符串来解析,这时可以这样写:select * from A where a like ?||'__' , 或者写个函数 select * from A where a like functionName(?)
十三 触发器
create or replace trigger trigger_eruption_b_detect after insert or update on lab_eruption_b_detect for each row declare -- local variables here -- PRAGMA AUTONOMOUS_TRANSACTION; --① V_MSG VARCHAR2(200); V_CODE VARCHAR2(20); --记录发生错误的操作 begin IF INSERTING THEN --当执行的操作是插入 V_CODE := 'INSERT'; insert into pathogeny_center(id_pathogeny_center, pathogeny_type, pathogeny_name, detect_way, detect_result, sociotomy_result, type_result, first_detect_date, detect_unit, sample_id, sample_type, sample_date, disease, patient_id, symptom, birthday, vis_date, disease_date, area, code_hospital, code_hospital_new, code_address, case_type, age, age_unit, sex, patient_job, is_outbreak, orgcode_add, date_add, age_group) (select lab_seq.nextval,'02' pathogeny_type ,'030201' pathogeny_name,'01' detect_way,d.i_tab_separate, '' sociotomy_result,'' type_result,d.first_detect_date,d.detect_unit,s.sample_id,s.sample_type, s.sample_date,s.disease,p.patient_id,p.syndrome,p.birthday,p.vis_date,p.disease_date,'' area,p.code_hospital, p.code_hospital_new,p.code_address,p.case_type,p.age,p.age_unit,p.sex,p.patient_job,'' is_outbreak,p.orgcode_add, p.date_add,'' age_group from lab_eruption_b_detect d,lab_sampleinfo s,lab_patient p where d.id_sampleinfo = s.id_sampleinfo and s.id_patient = p.id_patient and s.id_sampleinfo = :NEW.id_sampleinfo); commit; ELSIF UPDATING THEN --当执行的操作是修改 V_CODE := 'MODIFY'; update..... END IF; --记录错误日志 EXCEPTION WHEN OTHERS THEN V_MSG := SUBSTR(SQLERRM, 1, 200); V_CODE := V_CODE; INSERT INTO RPT_QUERY_ERR_LOG (OPDATE, FUNCNAME, ERRCODE, ERRMSG) VALUES (SYSDATE, 'trigger_eruption_b_detect', V_CODE, V_MSG); end trigger_eruption_b_detect;
ps:
1. mysql只能对每一行触发一次,而oracle可以对每一行整个表触发一次。
2.mysql只能是表的行激活触发器,但oracle可以做到对列触发。
1:在写trigger的时候,经常会遇到这种情况
当在程序块中需要对trigger本表进行修改或查询的时候,系统会提示错误: ORA-04091: table is mutating, trigger/function may not see it,关于这个错误,其实是由于对本表的操作造成的.ORACLE DB里默认在写TRIGGER的时候把本表锁死,不允许对其进行操作,也就是说这个错误是不能通过系统的手段解决的,只能改用一些其它的SQL来绕开它.
刚接触TRIGGER的时候会经常犯这样的错误,其中有大部分是可以通过:new 来解决的。但是还会有一定要对本表进行修改或查询操作的情况,不能避免.这里的解决办法则是加上①语句。(如上面的SQL语句其实可以把trigger本表lab_eruption_b_detect表去掉,用:NEW的形式,:NEW表示在执行完操作后(插入,修改)后该条字段在表中的值,如:new.first_detect_date,相对的是:old,表示在修改(删除)前的值。
相关推荐
标题“Sql语法转换为Oracle语法”涉及到的主要知识点是SQL Server与Oracle数据库之间的SQL语句转换。这通常是因为在系统迁移或跨平台开发时,需要将SQL Server的查询语句适应Oracle数据库的语法。 描述中提到的...
### pg与oracle语法差异知识点详解 #### 一、空值处理 **PostgreSQL** 和 **Oracle** 在处理空值(`null`)方面存在显著差异: - **PostgreSQL**: `null` 和空字符串(`''`)被视为不同的值。这意味着在进行比较或...
以下是一些关于Oracle语法和个人学习整理的关键知识点: 1. **初始口令**:Oracle安装完成后,预设了一些默认的系统用户及其口令,例如: - internal/oracle - sys/change_on_install - system/manager - scott...
本"Oracle语法指南"提供了全面的Oracle SQL语法参考和实例解析,旨在帮助用户更好地理解和掌握Oracle数据库的操作。 首先,"oracle语法.txt"可能包含了Oracle SQL的基础到高级语法,例如: 1. **数据类型**:...
本篇文章将深入探讨Oracle语法的一些关键点,包括序列、DUAL表的使用以及如何查看系统数据。 首先,我们来看序列(Sequences)。序列在Oracle中用于生成唯一的整数,通常用于主键或者唯一标识符。创建序列后,可以...
Oracle语法是数据库管理中至关重要的组成部分,特别是在大型企业级应用中,Oracle数据库系统因其稳定性、高效性和安全性而被广泛使用。这篇文档将深入探讨Oracle SQL语法的基础和高级特性,包括数据查询、数据操作、...
UltraEdit/UEStudio Oracle 语法高亮/语法着色文件
oracle语法详细介绍,简单易懂,很实用
Oracle数据库系统是全球广泛使用的大型关系数据库管理系统,它在企业级数据存储、管理和处理方面具有卓越性能。Oracle的客户端/服务器架构...《Oracle语法实例讲解》这样的资源可以帮助你进一步提升Oracle技能。
Oracle语法,有关于oracle的基础知识。
对于初学者而言,掌握Oracle语法是迈向数据库管理专业之路的关键步骤。本资料集《Oracle语法大全》旨在提供全面而深入的Oracle语言知识,涵盖了从基础查询到高级特性的各个方面。 一、查询语句(SQL查询) 在Oracle...
Oracle语法详解视频教程(二)part1,一共6个部分,需6个全部下载才能解压。 该视频内容为:介绍Oracle语句的条件查询和排序操作。
Oracle语法大全涵盖了从基本的SQL查询到复杂的数据库管理技术,旨在帮助用户全面理解和掌握Oracle数据库的操作。 一、SQL基础 Oracle SQL是用于与Oracle数据库交互的语言,包括数据查询、插入、更新和删除等操作。...
Oracle 语法及常用命令 Oracle 语法是关系型数据库管理系统的核心语言,用于管理和操作数据库。下面是 Oracle 语法及常用命令的详细知识点: 一、数据库概述 * 数据库是按照数据结构来组织、存储和管理数据的仓库...
了解Oracle语法基础对于数据库管理员(DBA)和开发人员来说至关重要。 1. **数据类型** Oracle 支持多种数据类型,包括数值类型(如 NUMBER)、字符串类型(如 VARCHAR2、CHAR)、日期时间类型(如 DATE)、二进制...
这个“oracle语法.rar”压缩包包含了关于Oracle数据库的一些关键知识点,如递归查询、内置函数、PL/SQL编程以及分页建表等。下面将详细介绍这些内容。 1. **递归查询**:在Oracle中,递归查询通常用于处理层次结构...