--创建包头
创新互联提供成都网站设计、成都网站建设、网页设计,高端网站设计,1元广告等致力于企业网站建设与公司网站制作,10余年的网站开发和建站经验,助力企业信息化建设,成功案例突破近千家,是您实现网站建设的好选择.
CREATE OR REPLACE PACKAGE ELS.pkg_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 ELS.pkg_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 a.currentuser, a.toagrentuser,
DECODE (a.agent_type,
'A', '当前交接确认代理',
'B', '将来离职签核代理',
'C', '当前离职签核代理',
'D', '将来交接确认代理',
''
) agent_type,
a.from_date, a.TO_DATE,
DECODE
(a.to_date1,
'', '无',
TO_CHAR (a.TO_DATE,
'yyyy/mm/dd am hh:mi:ss'
)
) to_date1,
a.flowinfo, b.emp_cname AS currentusername,
b1.emp_cname AS toagrentusername, workitem
FROM (
--当前交接确认代理
SELECT SUBSTR
(x.currentuser,
1,
INSTR (x.currentuser, '(') - 1
) AS currentuser,
SUBSTR
(x.toagrentuser,
1,
INSTR (x.toagrentuser, '(') - 1
) AS toagrentuser,
'A' AS agent_type,
x.create_date AS from_date,
x.create_date AS TO_DATE,
NULL AS to_date1, x.workid,
NULL AS formid, y.NAME workitem,
(SELECT e.emp_no
|| '('
|| e.emp_cname
|| ')'
FROM employee e
WHERE e.emp_no = y.emp_no)
AS flowinfo
FROM currentworkagrent x,
worktransferitem_m y
WHERE x.workid = y.ID
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 a.currentuser = b.emp_no(+)
AND a.toagrentuser = b1.emp_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 a.agent_type, a.from_date DESC;
END;
END pkg_proxy;
IC介绍
许多人正在使用Oracle Instant Client,它提供一个部署基于OCI、OCCI、JDBC OCI应用容易和快速的方法。
通过添加更多的工具,Instant Client可以变成一个更加强大的工具,如下:
1. tnsping
2. sqlldr
3. tkprf
4. exp/imp
5. OCM
6. 你自己的工具
这样做的主要优点是:
1. 安装是一件轻而易举的事情,只要解压即可完成。
2. 体积小,未压缩100MB到150MB或压缩50MB,它可以安装在USB盘上
3. 不涉及到SA(软件架构)
比较一个完整的Oracle安装需要大量的磁盘空间,而且还涉及到SA。
IC需求
1. 一个带有150MB+磁盘空间的Unix/Linux账号:
hadoop@192.168.8.162:/home/hadoop/oracle
2. 安装Oracle 11gR2的相同平台,一个具有读访问权限的账号:
root@192.168.8.192:/u01/product/oracle/11.2.0/db_1
IC安装
从Oracle官方网址下载安装包,
注:请根据操作系统版本下载相应的安装包,这里下载Linux X86-64安装包。
instantclient-basic-linux.x64-11.2.0.4.0.zip
instantclient-jdbc-linux.x64-11.2.0.4.0.zip
instantclient-sdk-linux.x64-11.2.0.4.0.zip
instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
注:下载Instant Client时需要创建一个Oracle账号才能下载。
使用SSH客户端使用安装账号登录到服务器,在根目录下创建一个oracle目录:
$mkdir /home/hadoop/oracle
上传所有压缩包或至少basic和sqlplus两个包到你账号的根目录下oracle中。
解压到当前目录下完成安装。
$ cd /home/hadoop/oracle
$ unzipinstantclient-basic-linux.x64-11.2.0.4.0.zip
$ unzipinstantclient-sqlplus-linux.x64-11.2.0.4.0.zip
$ unzip instantclient-sdk-linux.x64-11.2.0.4.0.zip
$ unzip instantclient-jdbc-linux.x64-11.2.0.4.0.zip
解压完毕后会在当前目录下生成一个instantclient_11_2目录。
$ ll /home/hadoop/oracle/instantclient_11_2
IC配置
配置下面的环境变量到你的Shell配置文件中。
$ vi ~/.bashrc
跳到文件的末尾,添加下面这些环境变量:
export RACLE_IC_HOME=/home/hadoop/oracle/instantclient_11_2
exportORACLE_HOME=$ORACLE_IC_HOME
exportTNS_ADMIN=$ORACLE_IC_HOME
exportPATH=$PATH:$ORACLE_IC_HOME
exportLD_LIBRARY_PATH=$ORACLE_IC_HOME
exportCLASSPATH=$ORACLE_IC_HOME/ojdbc6.jar:./
$ source ~/. bashrc
或 $ . ~/.bashrc
注:如果需要让所有用户都能使用,需要把上面的配置添加/etc/profile中。
在$ORACLE_IC_HOME目录下创建一个tnsnames.ora文件:
$ vi /home/hadoop/oracle/instantclient_11_2/tnsnames.ora
orcl=(description=(address=(protocol=tcp)(host=192.168.8.161)(port=1521))(connect_data=(server=dedicated)(service_name=wcdma)))
或
ora =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.8.161)(PORT = 1521)))(CONNECT_DATA =(SERVER =DEDICATED)(SERVICE_NAME = wcdma)))
SQL*Plus
$ sqlplus kqi/kqi@192.168.8.161:1521/wcdma
或
$ sqlplus kqi/kqi@orcl
SQL*Plus: Release 11.2.0.4.0 Production onThu Nov 20 14:01:49 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise EditionRelease 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Miningand Real Application Testing options
SQL
ERROR:
ORA-12154: TNS:could not resolve theconnect identifier specified
对于这种问题,排除添加的配置格式错误后。可能原因是读取的tnsnames.ora路径根本就不是$ORACLE_HOME/network/admin下。
注:tnsnames.ora文件的查找路径顺序为:
$HOME = $TNS_ADMIN = /etc =$ORACLE_HOME/network/admin/。
现在我们已经有一个构建自己的Instant Client包的基础了。下面是Instant Client的核心文件(位于/home/hadoop/oracle/instantclient_11_2中):
1. libclntsh.so.11.1:客户端代码库
2. libociei.so:OCI InstantClient数据共享库
3. libnnz11.so:安全库
4. libocci.so.11.1:Oracle C++调用接口库
5. libocijdbc11.so:JDBC OCI库
6. ojdbc6/5.jar:JDBC驱动(OCI和Thin)
7. orai18n.jar:字符集转换和本地支持库
Tnsping
从安装Oracle的服务器上拷贝tnsping过来,执行命令:
$ cd /home/hadoop/oracle/instantclient_11_2
$ scp root@192.168.8.192:/u01/product/oracle/11.2.0/db_1/bin/tnsping./
现在让在IC安装服务器上尝试运行下它:
$ tnsping ora
TNS Ping Utility for Linux: Version11.2.0.4.0 - Production on 20-NOV-2014 14:30:21
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Message 3511 not found; No message file forproduct=network, facility=TNSMessage 3512 not found; No message file forproduct=network, facility=TNSMessage 3513 not found; No message file forproduct=network, facility=TNSMessage 3509 not found; No message file forproduct=network, facility=TNS
运行后tnsping抱怨一些文件丢失,更具体的说一个消息文件丢失。现在,我们把该文件从Oracle安装服务器上拷贝过来,进入到instantclient_11_2目录:
$ mkdir -p network/mesg
$ cd network/mesg/
现在从安装Oracle服务上拷贝tnsus.msb文件到该目录中:
$ scp root@192.168.8.192:/u01/product/oracle/11.2.0/db_1/network/mesg/tnsus.msb ./
让我们再尝试一次tnsping,结果如下:
$ tnsping ora
TNS Ping Utility for Linux: Version11.2.0.4.0 - Production on 20-NOV-2014 14:49:54
Copyright (c) 1997, 2013, Oracle. All rights reserved.
Used parameter files:
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION=(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.8.161)(PORT =1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = wcdma)))
OK (0 msec)
Sqlldr
本节将添加另外一个工具sqlldr。
首先,我们从安装Oracle的服务器上拷贝sqlldr到IC安装目录instantclient_11_2下。
$ cd /home/hadoop/oracle/instantclient_11_2
$ scproot@192.168.8.192:/u01/product/oracle/11.2.0/db_1/bin/sqlldr ./
尝试运行它:
$ sqlldr
Message 2100 not found; No message file forproduct=RDBMS, facility=ULMessage 2100 not found; No message file forproduct=RDBMS, facility=UL
首先我们需要在instantclient_11_2下创建rdbms/mesg目录。
$ cd /home/hadoop/oracle/instantclient_11_2
$ mkdir -p rdbms/mesg
$ cd rdbms/mesg
把ORACLE安装目录下rdmsb/mesg/ulus.msb拷贝到当前目录。
$ scp root@192.168.8.192:/u01/product/oracle/11.2.0/db_1/rdbms/mesg/ulus.msb./
现在,让我们再次尝试运行它。
$ sqlldr
SQL*Loader: Release 11.2.0.4.0 - Productionon Thu Nov 20 16:40:10 2014
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates. All rights reserved.
Usage: SQLLDR keyword=value[,keyword=value,...]
Valid Keywords:
Exp/imp
从安装Oracle服务器上拷贝二进制文件过来。
$ cd /home/hadoop/oracle/instantclient_11_2
$ scp root@192.168.8.192:/u01/product/oracle/11.2.0/db_1/bin/imp ./
$ scp root@192.168.8.192:/u01/product/oracle/11.2.0/db_1/bin/exp ./
尝试运行imp和exp,结果如下:
$ imp
Message 100 not found; No message file forproduct=RDBMS, facility=IMP: Release 11.2.0.4.0 - Production on Thu Nov 2017:02:57 2014
Copyright (c) 1982, 2011, Orac
Invalid format of Import utility name
Verify that ORACLE_HOME is properly set
Import terminated unsuccessfully
IMP-00000: Message 0 not found; No messagefile for product=RDBMS, facility=IMP
$ exp
Message 206 not found; No message file forproduct=RDBMS, facility=EXP: Release 11.2.0.4.0 - Production on Thu Nov 20 17:03:392014
Copyright (c) 1982, 2011, Orac
Invalid format of Export utility name
Verify that ORACLE_HOME is properly set
Export terminated unsuccessfully
EXP-00000: Message 0 not found; No messagefile for product=RDBMS, facility=EXP
再从安装Oracle服务器上拷贝rdbms/mesg下的expus.msb和ipus.msb过来。
$ cd rdbms/mesg/
$ scproot@192.168.8.192:/u01/product/oracle/11.2.0/db_1/rdbms/mesg/impus.msb ./
$ scproot@192.168.8.192:/u01/product/oracle/11.2.0/db_1/rdbms/mesg/expus.msb ./
再次运行imp/exp工具错误提示消失,可以正常运行。
Tkprof
现在我们继续添加我最喜欢的工具tkprof。
从安装Oracle的服务器拷贝tkprof到instantclient_11_2目录下。
$ cd /home/hadoop/oracle/instantclient_11_2
$ scp root@192.168.8.192:/u01/product/oracle/11.2.0/db_1/bin/tkprof ./
$ mkdir -p oracore/mesg/
$ cd oracore/mesg/
$ scproot@192.168.8.192:/u01/product/oracle/11.2.0/db_1/oracore/mesg/lrmus.msb ./
使用示例:
$ tkprof test.trc test.out
Instant Client Bundle
现在,我们已经让所有工具都能正常工作。简单的使用工具压缩打包instantclient_11_2目录,这样你就获得你自己的Instant Client包。例如:
$ cd /home/hadoop/oracle
$ tar zcf instantclient_11_2.tar.gzintantclient_11_2
正如你所看到的,打包成的instant client带有tnsping,sqlldr, exp/imp,tkprof工具,这让IC更加的功能强大。
安装自定义的IC包步骤如下:
1. 上传到服务器上解压缩
2. 修改环境变量
$ vi ~/.bashrc
跳到文件的末尾,添加下面这些环境变量:
export ORACLE_IC_HOME=解压目录/instantclient_11_2
export ORACLE_HOME=$ORACLE_IC_HOME
export TNS_ADMIN=$ORACLE_IC_HOME
export PATH=$PATH:$ORACLE_IC_HOME
export LD_LIBRARY_PATH=$ORACLE_IC_HOME
exportCLASSPATH=$ORACLE_IC_HOME/ojdbc6.jar:./
$ source ~/. bashrc
或 $ . ~/.bashrc
3. 添加连接数据库的配置
$ vi $ORACLE_IC_HOME/tnsnames.ora
安装完成,现在就可以使用Instant Client中的工具啦!
先要创建package description 才能创建package body
SQL create or replace package my_package is
2 procedure my_procedure(name varchar2,num number);
3 function my_function(name varchar2) return number;
4 end;
6 /
Package created.
SQL show error
No errors.
先create package,在里面声明procedure
然后再create package body,在package body里面编写procedure的代码即可(相当于create procedure)。
包里没有create procedure
示例如下:
CREATE OR REPLACE PACKAGE pkg_test IS
PROCEDURE pro_test(V_OLD IN VARCHAR2,V_NEW IN VARCHAR2);
...
END test;
/
CREATE OR REPLACE PACKAGE BODY pkg_test IS
...
PROCEDURE pro_test(V_OLD IN VARCHAR2,V_NEW IN VARCHAR2) IS
BEGIN
...
END;
...
END pkg_test;
这是第一问
create or replace procedure proc_SALARY(v_EMPCODE varchar2) Is
v_workoingdays salary_details.workingdays%type;
v_salary salary_details.salary%type;
begin
select salary into v_salary from salary_details where EMPCODE = v_EMPCODE;
v_salary = v_salary * 0.95;
dbms_output.put_line(v_salary);
exception
when no_data_found then
dbms_output.put_line('未找到相应员工');
end;
begin
proc_SALARY('1');
end;