--在pl/sql中
--将正式库的零售单A部分数据导到测试库的零售单B中,首先要链接两个数据库
-----创建一个DATABASE LINK
/*-- Drop existing database link
dropdatabaselink TEST;
-- Create database link
createdatabaselink TEST
connectto NEANDS3
using'(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.4)(PORT = 1521)) )
(CONNECT_DATA = (SERVICE_NAME = orcl)))';
*/
--然后将A表中的字段插入到B表中:
insertinto
m_retail(ID,C_STORE_ID,RETAILBILLTYPE,ISACTIVE,DOCNO,STATUS,BILLDATE,TOT_AMT_ACTUAL,CREATION DATE,REFNO,AD_CLIENT_ID )
selectID,C_STORE_ID,RETAILBILLTYPE,ISACTIVE,DOCNO,STATUS,BILLDATE,TOT_AMT_ACTUAL,CREATIONDAT E,REFNO,AD_CLIENT_ID from neands3.m_retail@test where status='2'and billdate='20140823' neands3:用户名
m_retail:表名
@test:链接的名称(已经创建好的)
---定时任务将M_RETAIL里的内容插入到新建的表M_RETAIL_MEN的存储过程:
create or replace procedure P_M_RETAIL_MENDIAN(p_pi_id IN NUMBER) AS
begin
DELETE FROM M_RETAIL_MEN WHERE BILLDATE =TO_CHAR(BILLDATE ,'YYYYMMDD');
commit;
insert into M_RETAIL_MEN(id,C_STORE_ID,BILLDATE,AMT_ACTUAL25)
select
get_sequences('M_RETAIL_MEN'),c_store_id,to_char(sysdate,'yyyymmdd'),sum(TOT_AMT_ACTUAL) from M_RETAIL t where t.billdate=to_char(sysdate,'yyyymmdd') and t.status='2'
group by t.C_STORE_ID,t.BILLDATE;
UPDATE AD_PInstance
SET STATE = 'M', RESULT = 0, ModifiedDate = SYSDATE, ERRORMSG = NULL
WHERE id = p_pi_id;---pl/sql存储过程自带的
end P_M_RETAIL_MENDIAN;
get_sequences(部门):id自增
正则表达式:
在oracle里正则表达式有四个函数可用,分别是regexp_like、regexp_substr、regexp_instr
和regexp_replace
SQL> SELECT * FROM DUAL WHERE regexp_like('+333333' ,'^[\+]*[[:digit:]]+'); --该+转义或者不转义,结果是一样的
^代表开始,*表示出现0次或多次,+表示出现1次或多次,[:digit:]代表0-9的纯数字(还有$代表以什么结尾,如果是[[:digit:]]+$代表以数字结尾)。
该正则的意思就是:
以+0次或多次开头,紧接着后面数字出现一次或多次(即一定要有数字)。
Regexp_like
例:
1、这个就是表示是以1234打头的字符串是不是有匹配的。
这里和like的方式是一样的。
2、这里多了一个[]这里做一个独立字符,这里表示是以1或2开始,并且接着是234这个里的字符就会是匹配的。
3、查询VIP名称中姓是王或者李,名字的第一个字是二的人
注:这里多了一个()这个是做一个为字符串的方式来写的与[]刚好是对应。
这里还有一个“|”来表示或的意思。
(||表示连接符)
select * from test_table
where regexp_like(field_1,'^李[小]*二')
这里我们就可以查询李小二或是李二,再或者是李小小二,都可以,这里我们需要讲一下是[]后面带了一个*,这个是表示0~无穷大字符去匹配。
这个[]我们还可以添加一个“+”来表示1~无穷大的字符去匹配,也可以更加精准一些,在[]后面{1,3}这里就是表示1个到3个相同字符的匹配。
还有一个“?”来说表示1或是0个。
select * from test_table
where regexp_like(field_1,'李[^小]二')
这里我们可以查询到姓李的,但是第二字不是“小”这个字。
select * from test_table
whereregexp_like(field_1,'[0-9]')
这里是表示我们查询字符串含有0-9的数字的字符串。
select * from test_table
whereregexp_like(field_1,'[A-z]')
这里是表示我们查询字符串含有A-z的所有字母的字符串。
select * from test_table
whereregexp_like(name,'[[:alpha:]]')
这里是表示查询匹配任意字母,也包括中文字
select * from test_table
whereregexp_like(name,'[[:alnum:]]')
这里是表示查询匹配任意字母和数字
select * from test_table
whereregexp_like(name,'[[:digit:]]')
这里是表示查询匹配任意数字
Select * from test_table
Where regexp_like(name,’of’,’i’)
这里就是of不区分大小写
Select * from test_table
Where
regexp_like(name,’^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)这样我们可以查询是不是ip格式。