求助,请帮忙看一个Oracle存储过程到底有什么错误,谢谢!
该存储过程,传入一个用户帐号,然后先去SYS_USER 检查这个帐号有没有存在,
如果不存,就根据这个帐号去其他表查询出我要的信息然后分别插入SYS_USER 和SYS_USER_INFO
如果存在,就执行修改操作,也是去其他表将我要修改的字段查询出来,然后再执行UPDATE
存储过程如下:
[解决办法]
1)2-6行是双引号结尾、不是单引号
2)21和24行、select 少了个容器、比如 into
[解决办法]
1、赋值操作有问题
DI_SHI_CODE_TEMP:=SELECT ID FROM CARD_PROVIDER WHERE PROVIDER .......
应该用SELECT ID into DI_SHI_CODE_TEMP FROM CARD_PROVIDER WHERE PROVIDER .......
2、存储过程内不能直接出现select ..... FROM ...
应该和INTO 连接使用
[解决办法]
21和24行应该select 少into
[解决办法]
CREATE OR REPLACE PROCEDURE SYN_SYS_USER(PARTY_ID IN VARCHAR2)
IS
S_COUNT NUMBER;
ORG_COUNT NUMBER;
ORG_COUNT2 NUMBER;
DI_SHI_CODE_TEMP VARCHAR2(50);
ATT1_TEMP VARCHAR2(50);
BEGIN
SELECT COUNT(*)
INTO S_COUNT
FROM SYS_USER SU1
WHERE SU1.PRTY_ID=SYN_SYS_USER.PARTY_ID;
IF (S_COUNT=0) THEN
BEGIN
SELECT COUNT(*)
INTO ORG_COUNT
FROM CARD_PROVIDER
WHERE PROVIDER_ID=(SELECT PA.COMPANY_ID
FROM PERSON_ALL PA
WHERE PA.PARTY_ID=SYN_SYS_USER.PARTY_ID); -- 要引用存储过程传过来的变量,但这个变量又与字段重名,这个时候应该加“对象限定符加以确定!
-- 猪01次!
IF (ORG_COUNT>0) THEN
ATT1_TEMP:='C';
SELECT ID
INTO DI_SHI_CODE_TEMP -- 第一次给变量 DI_SHI_CODE_TEMP 赋值
FROM CARD_PROVIDER
WHERE PROVIDER_ID=(SELECT PA.COMPANY_ID
FROM PERSON_ALL PA
WHERE PA.PARTY_ID=SYN_SYS_USER.PARTY_ID);
END IF;
SELECT COUNT(*)
INTO ORG_COUNT2
FROM LOCATION
WHERE ORGANIZATION_ID=(SELECT PA.COMPANY_ID
FROM PERSON_ALL PA
WHERE PA.PARTY_ID=SYN_SYS_USER.PARTY_ID);
IF (ORG_COUNT2>0) THEN
ATT1_TEMP:='D';
SELECT ID
INTO DI_SHI_CODE_TEMP -- 第二次给变量 DI_SHI_CODE_TEMP 赋值,将覆盖第一次的赋值。
-- -- 猪02次!
FROM LOCATION
WHERE ORGANIZATION_ID=(SELECT PA.COMPANY_ID
FROM PERSON_ALL PA
WHERE PA.PARTY_ID=SYN_SYS_USER.PARTY_ID);
END IF;
INSERT INTO SYS_USER(ID, PARTY_ID, CURRENT_PASSWORD, ENABLED, USER_LOGIN_ID)
SELECT (SELECT MAX(SU.ID)+1 FROM SYS_USER SU) AS SUID,
ULA.PARTY_ID,
ULA.CURRENT_PASSWORD,
ULA.ENABLED,
ULA.PARTY_ID
FROM USER_LOGIN_ALL ULA
WHERE ULA.PARTY_ID=SYN_SYS_USER.PARTY_ID;
INSERT INTO SYS_USER_INFO(ID, USER_ID, LAST_NAME, MOBILEPHONE, TELEPHONE, GENDER, EMAIL, COMMENTS, IS_SEND_MSM, DI_SHI_CODE, ATT1)
SELECT (SELECT MAX(SUI.ID)+1 FROM SYS_USER_INFO SUI) AS SUIID,
(SELECT SU2.ID FROM SYS_USER SU2 WHERE SU2.PARTY_ID=SYN_SYS_USER.PARTY_ID) AS SU2ID,
PA.LAST_NAME,
PA.MOBILEPHONE,
PA.TELEPHONE,
PA.GENDER,
PA.EMAIL,
PA.COMMENTS,
PA.IS_SEND_MSM,
DI_SHI_CODE_TEMP,
ATT1_TEMP
FROM PERSON_ALL PA
WHERE PA.PARTY_ID=SYN_SYS_USER.PARTY_ID;
COMMIT;
END;
ELSE
-- 一个关联更新就搞定了,你就慢慢循环去吧!
-- 猪03次!
FOR TEMP_USER IN (SELECT ULA.PARTY_ID,
DECODE(ULA.ENABLED,'T',1,0) AS ENABLED,
ULA.CURRENT_PASSWORD
FROM USER_LOGIN_ALL ULA
WHERE ULA.PARTY_ID=SYN_SYS_USER.PARTY_ID)
LOOP
UPDATE SYS_USER
SET ENABLED=TEMP_USER.ENABLED,
CURRENT_PASSWORD=TEMP_USER.CURRENT_PASSWORD
WHERE PARTY_ID=TEMP_USER.PARTY_ID;
END LOOP;
-- 一个关联更新就搞定了,你就慢慢循环去吧!
-- 猪04次!
FOR TEMP_USER_INFO IN (SELECT PA.PARTY_ID,
PA.LAST_NAME,
PA.MOBILEPHONE,
PA.TELEPHONE,
PA.GENDER,
PA.EMAIL,
PA.COMMENTS,
PA.IS_SEND_MSM
FROM PERSON_ALL PA
WHERE PA.PARTY_ID=SYN_SYS_USER.PARTY_ID)
LOOP
UPDATE SYS_USER_INFO
SET LAST_NAME=TEMP_USER_INFO.LAST_NAME,
MOBILEPHONE=TEMP_USER_INFO.MOBILEPHONE,
TELEPHONE=TEMP_USER_INFO.TELEPHONE,
GENDER=TEMP_USER_INFO.GENDER,
EMAIL=TEMP_USER_INFO.EMAIL,
COMMENTS=TEMP_USER_INFO.COMMENTS,
IS_SEND_MSM=TEMP_USER_INFO.IS_SEND_MSM
WHERE USER_ID=(SELECT SU.ID
FROM SYS_USER
WHERE SU.PARTY_ID=TEMP_USER_INFO.PARTY_ID)
END LOOP;
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
-- ROLLBACK; -- 出错会自动回滚!
-- 猪05次!
RAISE;
END;
/