|
谢谢Yong Huang。在我的存储过程里基本上除了select语句以外,就是一些判断语句,即根据输入参数的不同执行不同情况下的select语句。使用case。
CREATE OR REPLACE PROCEDURE SP_SELECT (Login_Name varchar2,
Table_No int,
Condition varchar2,
SelectNo int,
ErrNo out int,
p_cursor OUT SYS_REFCURSOR) AS
--输出select语句的结果集
aLogin_Name varchar2(20);
Mycondition varchar2(300); --根据不同查询的内部查询条件
RoleID int; --判断身份 管理员1 操作员2 用户3
aW_ZDWDM varchar2(20); --操作员的单位代码
aK_LXDWDM varchar2(20); --客户业务联系单位代码(操作员)
aW_ZCID varchar2(6); --注册用户的注册号
QYID varchar2(20); --企业id号,根据企业id决定看自己的企业信息(注册用户)
aW_ZXG varchar2(2); --0 无权查看 1 有权查看 2 有权修改(注册用户)(修改是在sp_update1中限制)
InerSelectNo int;
aW_UID numeric(6); --是否为注册用户,并判断为何种用户(注册用户)
--30 最终用户 只能查看自己的客户信息 InerSelectNo=20
--31 煤矿用户 只能看自己的客户信息和煤矿信息 InerSelectNo=21
--32 运输用户 只能看自己的客户信息和运输信息 InerSelectNo=22
--33 中间商 只能查看自己的客户信息 InerSelectNo=20
--34 洗精煤厂 只能看自己的客户信息和 洗精煤厂信息 InerSelectNo=23
--35 储配煤厂 只能看自己的客户信息和储配煤厂信息 InerSelectNo=24
GFKHID varchar2(20); --用于存放select语句字符串
sqlstr varchar2(5000);
begin
aLogin_Name := trim(Login_Name);
SP_GETUSERGROUPID(aLogin_Name, RoleID, aW_UID, ErrNo);
if (RoleID = -1) --无权查看
then
ErrNo := -1;
return;
end if;
--管理员
if (RoleID = 10 or RoleID = 12 or RoleID = 6 or RoleID = 7 or RoleID = 8 or
RoleID = 9 or RoleID = 11 or RoleID = 13) then
begin
aW_ZDWDM := '';
select W_ZDWDM
into aW_ZDWDM
FROM WT_CZYYH
WHERE UPPER(W_CDLM) = UPPER(aLogin_Name);
aW_ZDWDM := aW_ZDWDM || '%''';
exception
when no_data_found then
ErrNo := -2;
return;
end;
end if;
--注册用户业务关系查询
if (RoleID = 3) then
begin
select W_ZCID, W_ZQYID, W_ZXG
into aW_ZCID, QYID, aW_ZXG --获得注册ID,--获得企业编码,--获得修改权限
FROM WT_ZCYH
WHERE UPPER(W_DLM) = UPPER(aLogin_Name);
QYID:=QYID||'''';
exception
when no_data_found then
ErrNo := -2;
return;
end;
if (aW_ZXG = '0' or aW_zxg is null) then
--无权查看
ErrNo := -1;
return;
end if;
case aW_UID
when 30 then
InerSelectNo := 20;
when 33 then
InerSelectNo := 20;
when 31 then
InerSelectNo := 21;
when 32 then
InerSelectNo := 22;
when 34 then
InerSelectNo := 23;
when 35 then
InerSelectNo := 24;
else
begin
ErrNo := -1;
return;
end;
end case;
if(InerSelectNo=20)then
begin
select K_LXDWDM, K_KHBM
into aK_LXDWDM, GFKHID --获得联系单位 --获得客户编码
from KT_KHXX
where K_ZCID = aW_ZCID;
exception
when no_data_found then
ErrNo := -2;
return;
end;
end if;
end if;
--根据所得业务关系,判断是否有查询权限,根据所给表号,进行操作
case Table_No
when 0 then
if (SelectNo = 0) then
Mycondition := '';
aW_ZDWDM := '';
aK_LXDWDM := '';
aW_ZCID := '';
elsif SelectNo = 1 then
if (RoleID = 1 or RoleID = 5) then
Mycondition := '';
aW_ZDWDM := '';
aK_LXDWDM := '';
aW_ZCID := '';
elsif (RoleID = 10 or RoleID = 12 or RoleID = 6 or RoleID = 7 or
RoleID = 8 or RoleID = 9 or RoleID = 11 or RoleID = 13) then
aW_ZCID := '';
aK_LXDWDM := '';
Mycondition := 'and K_LXDWDM like ''';
elsif (InerSelectNo = 20 and RoleID = 3) then
aK_LXDWDM := '';
aW_ZDWDM := '';
Mycondition := 'and K_ZCID= ';
else
ErrNo := -1;
return;
end if;
end if;
sqlstr := 'select
K_KHID AS "客户序号",
K_ZCID AS "注册号",
K_DSXMC as "所在地区",
K_KHBM AS "客户编码",
K_QYMC AS "企业名称",
K_QYJC AS "企业简称",
K_FDDBR AS "法人",
K_ZCZJ AS "注册金",
K_ZS AS "住所",
a.W_XCSXSZF AS "企业类型",
K_JYFW AS "经营范围",
K_MTZGZH AS "煤资格证号",
K_MTJYFS AS "经营方式",
K_ZZJGDM AS "机构代码",
K_ZZJGLX AS "机构类型",
c.W_XCSXSZF AS "行业流向",
K_NXQZL AS "煤碳年需求量",
K_LXR AS "联系人",
K_GDDH AS "固话",
K_SJ AS "手机",
K_DBGH AS "电报挂号",
K_CZ AS "传真",
K_DZYX AS "电邮",
K_KWZ AS "网址",
K_YZBM AS "邮政编码",
f.W_ZDWMC AS "联系单位"
from KT_KHXX ,WT_XTCYXXSM a,WT_XTCYXXSM c,WT_ZZJG f
where a.W_XCSZ=K_QYLXDM and a.W_XCSLX=''企业类型'' and
c.W_XCSZ= K_HYLXDM and c.W_XCSLX=''行业流向'' and
f.W_ZDWDM=K_LXDWDM
' || Mycondition || aK_LXDWDM || aW_ZDWDM || aW_ZCID ||Condition;
open p_cursor FOR sqlstr;
ErrNo := 0;
.......以下是在其他表上面的查询.......与这一段类似。 |
|