--创建包头
CREATE OR REPLACE PACKAGE ELSpkg_proxy
AS
TYPE cursortype IS REF CURSOR;
-- 得到交接确认代理人数据
PROCEDURE get_proxy_info (
v_emp_no IN VARCHAR2, --当前登录用户
v_to_emp_no IN VARCHAR2, --代理人工号
v_to_emp_name IN VARCHAR2, --代理人姓名
v_proxy_date1 IN VARCHAR2, --代理开始时间: yyyy/mm/dd
v_proxy_date2 IN VARCHAR2, --代理结束时间: yyyy/mm/dd
v_from_emp_no IN VARCHAR2, --被代理人工号
v_from_emp_name IN VARCHAR2, --被代理人姓名
p_cursor OUT cursortype
);
END pkg_proxy;
--创建包头
CREATE OR REPLACE PACKAGE BODY ELSpkg_proxy
AS
-- 得到交接确认代理人数据
PROCEDURE get_proxy_info (
v_emp_no IN VARCHAR2, --当前登录用户
v_to_emp_no IN VARCHAR2, --代理人工号
v_to_emp_name IN VARCHAR2, --代理人姓名
v_proxy_date1 IN VARCHAR2, --代理开始时间: yyyy/mm/dd
v_proxy_date2 IN VARCHAR2, --代理结束时间: yyyy/mm/dd
v_from_emp_no IN VARCHAR2, --被代理人工号
v_from_emp_name IN VARCHAR2, --被代理人姓名
p_cursor OUT cursortype
)
AS
BEGIN
OPEN p_cursor FOR
WITH v AS
(
--查找当前登录人是否为管理员
SELECT
FROM employee
WHERE dept_id IN (
SELECT ID
FROM department
START WITH ID =
(SELECT dept_id
FROM employee
WHERE emp_no = v_emp_no
AND is_admin IN (
SELECT r_value
FROM role_conditions
WHERE r_key =
'ProxySearch')
UNION
SELECT dept_id
FROM employee_add
WHERE emp_no = v_emp_no
AND is_admin IN (
SELECT r_value
FROM role_conditions
WHERE r_key =
'ProxySearch'))
CONNECT BY PRIOR ID = parent_id)
UNION
SELECT
FROM employee
WHERE emp_no = v_emp_no)
SELECT DISTINCT
FROM (SELECT acurrentuser, atoagrentuser,
DECODE (aagent_type,
'A', '当前交接确认代理',
'B', '将来离职签核代理',
'C', '当前离职签核代理',
'D', '将来交接确认代理',
''
) agent_type,
afrom_date, aTO_DATE,
DECODE
(ato_date1,
'', '无',
TO_CHAR (aTO_DATE,
'yyyy/mm/dd am hh:mi:ss'
)
) to_date1,
aflowinfo, bemp_cname AS currentusername,
b1emp_cname AS toagrentusername, workitem
FROM (
--当前交接确认代理
SELECT SUBSTR
(xcurrentuser,
1,
INSTR (xcurrentuser, '(') - 1
) AS currentuser,
SUBSTR
(xtoagrentuser,
1,
INSTR (xtoagrentuser, '(') - 1
) AS toagrentuser,
'A' AS agent_type,
xcreate_date AS from_date,
xcreate_date AS TO_DATE,
NULL AS to_date1, xworkid,
NULL AS formid, yNAME workitem,
(SELECT eemp_no
|| '('
|| eemp_cname
|| ')'
FROM employee e
WHERE eemp_no = yemp_no)
AS flowinfo
FROM currentworkagrent x,
worktransferitem_m y
WHERE xworkid = yID
UNION ALL
--将来交接确认代理
SELECT SUBSTR
(currentuser,
1,
INSTR (currentuser, '(') - 1
) AS currentuser,
SUBSTR
(toagrent,
1,
INSTR (toagrent, '(') - 1
) AS toagrent,
'D' AS agent_type, starttime,
endtime, endtime AS to_date1, NULL,
NULL, NULL, NULL
FROM futureagrent) a,
employee b,
employee b1
WHERE acurrentuser = bemp_no(+)
AND atoagrentuser = b1emp_no(+)) a
WHERE currentuser IN (SELECT emp_no
FROM v)
AND (currentuser = v_from_emp_no OR v_from_emp_no IS NULL
)
AND ( currentusername = v_from_emp_name
OR v_from_emp_name IS NULL
)
AND (toagrentuser = v_to_emp_no OR v_to_emp_no IS NULL)
AND ( toagrentusername = v_to_emp_name
OR v_to_emp_name IS NULL
)
AND from_date <=
TO_DATE (NVL (v_proxy_date2, '2099/12/31'),
'yyyy/mm/dd'
)
AND TO_DATE >=
TO_DATE (NVL (v_proxy_date1, '1000/12/31'),
'yyyy/mm/dd'
)
ORDER BY aagent_type, afrom_date DESC;
END;
END pkg_proxy;
exit when NeedCarGroupName_Cursor%notfound;
insert into SGrouPNeedCarCount (d0) values (v_groupName);
把这两句换下位置。
另外,为什么要用游标循环插入呢,一句SQL就可以解决了啊。
在Oracle中rowid唯一标识每条记录所在的位置 它作为一个伪列在查询中出现
select rowid id
from test_table
where rownum<= ;
ROWID ID
AAAVcbAAPAAAAALAAA
AAAVcbAAPAAAAALAAB
AAAVcbAAPAAAAALAAC
AAAVcbAAPAAAAALAAD
AAAVcbAAPAAAAALAAE
AAAVcbAAPAAAAALAAF
AAAVcbAAPAAAAALAAG
AAAVcbAAPAAAAALAAH
AAAVcbAAPAAAAALAAI
AAAVcbAAPAAAAALAAJ
rowid是由 个字符组成分 个部分 分别是
个字符的对象编号 个字符的文件号 个字符的块编号 个字符的行编号
每一个字符的取值范围以及对应的数值是
| A| | | a| | | | |
| B| | | b| | | | |
| C| | | c| | | | |
| D| | | d| | | | |
| E| | | e| | | | |
| F| | | f| | | | |
| G| | | g| | | | |
| H| | | h| | | | |
| I| | | i| | | | |
| J| | | j| | | | |
| K| | | k| | | +| |
| L| | | l| | | /| |
| M| | | m| | | | |
| N| | | n| | | | |
| O| | | o| | | | |
| P| | | p| | | | |
| Q| | | q| | | | |
| R| | | r| | | | |
| S| | | s| | | | |
| T| | | t| | | | |
| U| | | u| | | | |
| V| | | v| | | | |
| W| | | w| | | | |
| X| | | x| | | | |
| Y| | | y| | | | |
| Z| | | z| | | | |
可以看到rowid是一个 进制的表示方式 利用上述对应表即可计算出
对象编号 AAAVcb =
文件号 AAP =
块号 AAAAAL =
行号 AAA~AAJ = ~
进制的转换完全可以交给机器去做 Oracle也是这么认为的 于是提供了一个叫做dbms_rowid的包 它包含了一系列的方法 我们借助这个包就可完成上述的工作了
select rowid
substr(rowid ) || : || dbms_rowid rowid_object(rowid) 数据对象编号/object_id
substr(rowid ) || : || dbms_rowid rowid_relative_fno(rowid) 文件编号/file_id
substr(rowid )|| : || dbms_rowid rowid_block_number(rowid) 块编号/block_id
substr(rowid )|| : || dbms_rowid ROWID_ROW_NUMBER(rowid) 行编号/row_num
from test_table
where rownum<= ;
ROWID 数据对象编号/object_id 文件编号/file_id 块编号/block_id 行编号/row_num
AAAVcbAAPAAAAALAAA AAAVcb : AAP : AAAAAL : AAA :
AAAVcbAAPAAAAALAAB AAAVcb : AAP : AAAAAL : AAB :
AAAVcbAAPAAAAALAAC AAAVcb : AAP : AAAAAL : AAC :
AAAVcbAAPAAAAALAAD AAAVcb : AAP : AAAAAL : AAD :
AAAVcbAAPAAAAALAAE AAAVcb : AAP : AAAAAL : AAE :
AAAVcbAAPAAAAALAAF AAAVcb : AAP : AAAAAL : AAF :
AAAVcbAAPAAAAALAAG AAAVcb : AAP : AAAAAL : AAG :
AAAVcbAAPAAAAALAAH AAAVcb : AAP : AAAAAL : AAH :
AAAVcbAAPAAAAALAAI AAAVcb : AAP : AAAAAL : AAI :
AAAVcbAAPAAAAALAAJ AAAVcb : AAP : AAAAAL : AAJ :
这个结果对不对呢?我们可以这样验证 注意 以下查询需要DBA权限
首先是object_id
select
owner object_name object_id
from dba_objects
where object_name= TEST_TABLE ;
OWNER OBJECT_NAME OBJECT_ID
TEST TEST_TABLE
然后是文件编号和块编号
select
owner segment_name segment_type extent_id
file_id block_id blocks bytes
from dba_extents
where segment_name= TEST_TABLE ;
OWNER SEGMENT_NAME SEGMENT_TYPE EXTENT_ID FILE_ID BLOCK_ID BLOCKS BYTES
TEST TEST_TABLE TABLE
TEST TEST_TABLE TABLE
编号为 的块落在了编号为 的exntent上 只能说是验证了一半 接下来我们将数据块dump出来看看 不过做之前先为这一行打上 标记 看以下过程
test$logdw@logdw SQL> select rowid t from test_table t where rownum<= ;
ROWID ID DATA
AAAVcbAAPAAAAALAAA Q
AAAVcbAAPAAAAALAAB Q
AAAVcbAAPAAAAALAAC Q
AAAVcbAAPAAAAALAAD Q
AAAVcbAAPAAAAALAAE Q
rows selected
test$logdw@logdw SQL> update test_table set data=lpad( killkill ) where id= ;
row updated
test$logdw@logdw SQL> select rowid t from test_table t where rownum<= ;
ROWID ID DATA
AAAVcbAAPAAAAALAAA killkill
AAAVcbAAPAAAAALAAB Q
AAAVcbAAPAAAAALAAC Q
AAAVcbAAPAAAAALAAD Q
AAAVcbAAPAAAAALAAE Q
rows selected
test$logdw@logdw SQL> mit;
做好了 标记 可以dump数据块了
sys$logdw@logdw SQL> select get_trace_name() from dual ;
GET_TRACE_NAME()
/u /app/oracle/diag/rdbms/logdw/logdw/trace/logdw_ora_ trc
sys$logdw@logdw SQL> alter system dump datafile block ;
System altered
打开trc文件 摘录如下
Start dump data blocks tsn: file#: minblk maxblk
Dump of memory from x A F A to x A F A
A F F C B [ kil]
A F F C B C C C E C [lkill ]
block_row_dump:
tab row @ x ac
tl: fb: H FL lb: x cc:
col : [ ] c
col : [ ]
b c
c b c c
lishixinzhi/Article/program/Oracle/201311/17417
clob类型直接插入会报错。参考下面:
>
1、不要用before试一试。
2、“ntwriter in varchar2,pkid in long”,这个数据类型 long 改成number试一下。
3、测试一下所有的同义词是否可以 *** 作,执行更新 *** 作,看是否可以进行。
R语言如何从外部读取数据到R中
R语言可以从键盘,文本,excel,access,数据库,专业处理软件sas
一、使用键盘的输入
mydata<-dataframe(age=numeric(0),gender=character(0),weight=numeric(0))
mydata<-edit(mydata)
二、读入带有分隔符文本格式的数据
data<-readtable(文件,header=true/false,sep="delimeter",rownames=列名)
其中文件可以有很多选项的
file()gzfile(),bzfile(),等一些压缩文件以及url(>
正好刚整理了一个这方面的资料,先贴给你吧
准备ASM环境
ASM使用一个名叫“+ASM”的数据库实例来管理ASM磁盘,因此在配置ASM磁盘之前,需要先启动ASM实例。另外还需要注意,ASM 实例必须要先于数据库实例启动,和数据库实例同步运行,迟于数据库实例关闭。ASM 实例的创建和删除可以用DBCA 工具来 *** 作。在DBCA的第一个界面选择配置自动存储管理就可以进入ASM配置的界面。
根据提示运行脚本就可以配置和启动CSS(Cluster Synchronization Service)了,注意要以root的身份运行这个脚本,运行情况如下:
# /u01/app/oracle/product/1020/db_1/bin/localconfig add
/etc/oracle does not exist Creating it now
Successfully accumulated necessary OCR keys
Creating OCR keys for user 'root', privgrp 'root'
Operation successful
Configuration for local CSS has been initialized
Adding to inittab
Startup will be queued to init within 90 seconds
Checking the status of new Oracle init process
Expecting the CRS daemons to be up within 600 seconds
CSS is active on these nodes
s1
CSS is active on all nodes
Oracle CSS service is installed and running under init(1M)
ASM可以使用裸设备或者ASMLib方式, 因为裸设备的维护更罗嗦一些,本文只讨论ASMLib方式。为了在Linux系统中使用ASMLib方式准备ASM磁盘,需要安装相关的软件,下载链接如下:
下载时注意选择自己的 *** 作系统和内核的版本,我下载到的是以下三个软件:
oracleasm-2618-164el5-205-1el5i686rpm
oracleasmlib-204-1el5i386rpm
oracleasm-support-214-1el5i386rpm
这里特别需要注意第一个软件要和你的Linux内核的版本一致。(其实我的内核版本是2618-155el5,但是在官方网站找不到完全对应的版本,只好使用这个2618-164el5的版本了,后面会讲怎么解决这个问题。)接下来进行软件的安装,只需要使用rpm命令即可。
# rpm -ivh oracleasm
现在安装oracleasm模块可能会报错,像我因为没有找到对应我的内核版本的oracleasm软件就遇到了这个问题。经过一番查找,发现软件将oracleasm的模块文件oracleasmko安装到了目录/lib/modules/2618-164el5/kernel/drivers/addon/oracleasm中,而我的默认的模块文件路径应该是/lib/modules/2618-155el5,因此决定手工建立相关的目录和文件。
# mkdir -p /lib/modules/2618-155el5/kernel/drivers/addon/oracleasm
# cp oracleasmko /lib/modules/2618-155el5/kernel/drivers/addon/oracleasm
然后再安装oracleasm的模块文件就可以通过了:
# depmod -a
# modprobe oracleasm
最后进行oracleasm服务的初始配置
# service oracleasm configure
Configuring the Oracle ASM library driver
This will configure the on-boot properties of the Oracle ASM library
driver The following questions will determine whether the driver is
loaded on boot and what permissions it will have The current values
will be shown in brackets ('[]') Hitting <ENTER> without typing an
answer will keep that current value Ctrl-C will abort
Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]:
Writing Oracle ASM library driver configuration: done
Initializing the Oracle ASMLib driver: [ OK ]
Scanning the system for Oracle ASMLib disks: [ OK ]
好了,现在已经有了初步的ASM配置环境,接下来就可以准备磁盘了。
添加ASM磁盘组
为了实现ASM的磁盘负载均衡和冗余能力,我准备使用四个磁盘建立ASM的磁盘组,因此需要为Linux系统添加四个磁盘。为了搭建这个环境,我使用的是VMware环境,因此添加磁盘就非常容易了。只需要在VMware的设置中选择添加硬件即可,而且现在的VMware版本是可以支持磁盘的热插拔的。无需关闭Linux系统,直接添加磁盘即可。添加完四个磁盘之后,为了让Linux系统马上识别这几个磁盘,可以运行如下命令:
# echo 'scsi add-single-device 0 0 1 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 2 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 3 0' > /proc/scsi/scsi
# echo 'scsi add-single-device 0 0 4 0' > /proc/scsi/scsi
运行fdisk -l命令可以看到系统中增加了/dev/sdb、/dev/sdc、/dev/sdd、/dev/sde四个磁盘。使用fdisk工具在这个四个磁盘上各建立一个分区(具体步骤略,不熟悉的可以查阅Linux的fdisk命令用法)。
然后运行oracleasm createdisk命令添加ASM磁盘:
# oracleasm createdisk VOL1 /dev/sdb1
Writing disk header: done
Instantiating disk: done
依次添加/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1四个磁盘分区,完成后检查如下:
# oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
这时运行DBCA工具的ASM配置向导就可以建立ASM磁盘组了。进入DBCA向导后,选择“Configure Automatic Storage Management”,然后单击“Create New”按钮,可以看到ASM磁盘组的配置界面。输入磁盘组的名称,如“dg1”,关于冗余级别,我选择了Norma,并且将VOL1和VOL2设置为一个Failure Group,而VOL3和VOL4设置为一个Failure Group。
以上 *** 作也可以使用sqlplus连接到ASM实例上,使用命令完成。
为了连接到ASM实例上,首先需要设置ORACLE_SID环境变量,然后再使用sqlplus进行连接:
# ORACLE_SID=+ASM
# sqlplus / as sysdba
创建Disk Group的语句如下:
SQL> create diskgroup dg1 normal redundancy
failgroup fg1 disk 'ORCL:VOL1','ORCL:VOL2'
failgroup fg2 disk 'ORCL:VOL3','ORCL:VOL4';
至此,ASM磁盘组的准备已经完成,终于可以在ASM上建立数据库了。还是使用DBCA工具,选择“Create Database”进入创建数据库的向导。按照向导 *** 作,只是在选择存储机制时,选择ASM类型。
以上就是关于oracle创建包和存储过程全部的内容,包括:oracle创建包和存储过程、求助:Oracle PL/SQL: ORA-00001: 违反必须为唯一的限制条件 我查出的数据没有重复的,为什麽报错、说说Oracle的rowid等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)