1:不管过程有没有编译成功,但是这个过程总是会生成的,你可以看到他们打小红叉了(如果有错,编译不成功);pl/sql 程序块其实是匿名的,而过程是有命名的,这样它可以存在数据库里面!因而他们的语法是一样,Pl/sql的意思是可编程的SQL,是对SQL的扩展!
正确代码
create or replace procedure test_p is
begin
if 1=2 then
null;
else if 2 = 3 then
null;
end if;
end if;
end test_p;
create or replace procedure test_p is
begin
if 1=2 then
null;
elsif 2 = 3 then
null;
end if;
end test_p;
恶心的Oracle的if else if...
(2009-04-29 20:44:26)
前段时间写Oracle存储过程就遇到问题.
原来写成这样
if 1=2 then
null;
elseif 1=3 then
null
end if;
在PL/SQL编辑环境下elseif没有变色,说明不是关键字。
后来改成
if 1=2 then
null;
else if 1=3 then
null
end if;
编译时报异常。
去goole上百度了下,很多人都说是 elseif。
又试了N边,编译总不能通过。
怒了,直接写成
if 1=2 then
null;
else if 1=3 then
null
end if;
end if;
问题就解决了。
今天又要在存储过程中用if...else if ...else if...写数据转换的东东,还按原来那样写看着很恶心。
后来发现是写成if...elsif...elsif....end if;
神啊,终于被我找到答案了。
返回来看看,原来不是elseif,而是elsif,少了个"e"。他大爷的,干嘛要少个e啊,万恶的Oracle,真恶心。
不管怎么着,问题总算解决了,把这恶心记在心里,以后不犯同样错误。 贴出我的终极sql
原来写成这样
if 1=2 then
elseif 1=3 then
end if;
在PL/SQL编辑环境下elseif没有变色,说明不是关键字。
后来改成
if 1=2 then
else if 1=3 then
end if;
编译时报异常。
去goole上百度了下,很多人都说是 elseif。
又试了N边,编译总不能通过。
怒了,直接写成
if 1=2 then
else if 1=3 then
end if;
问题就解决了。
今天又要在存储过程中用if...else if ...else if...写数据转换的东东,还按原来那样写看着很恶心。
后来发现是写成if...elsif...elsif....end if;
神啊,终于被我找到答案了。
返回来看看,原来不是elseif,而是elsif,少了个"e"。他大爷的,干嘛要少个e啊,万恶的Oracle,真恶心。
不管怎么着,问题总算解决了,把这恶心记在心里,以后不犯同样错误。 贴出我的终极sql
PROCEDURE SP_UPD_YSJGXYJCSP(IS_JGXYBABH IN VARCHAR2,
IS_YHBH IN VARCHAR2,
IS_YHMC IN VARCHAR2,
IS_SPYJ IN VARCHAR2,
IS_SPZT IN VARCHAR2,
IS_YWLX IN VARCHAR2,
IS_JGMC IN VARCHAR2,
IS_YWBH IN VARCHAR2,
IS_JCLX IN VARCHAR2,
OS_MSG OUT VARCHAR2,
OS_RETURN OUT INTEGER,
OS_ERRORINF OUT VARCHAR2) AS
V_COUNT INTEGER;
V_COUNT2 INTEGER;
V_SQZT VARCHAR(10);
BEGIN
OS_RETURN := 0;
OS_ERRORINF := '';
SELECT COUNT(1)
INTO V_COUNT
FROM ZJJG_JGXYBAXX A
WHERE A.JGXYBABH = IS_JGXYBABH
AND A.JGXYZT = '06';
IF V_COUNT = 0 THEN
OS_MSG := '该监管协议状态已经发生变化!';
RETURN;
END IF;
if IS_YWLX = 'JC02' then
CASE IS_SPZT
WHEN '1' THEN
V_SQZT := '03';
WHEN '0' THEN
V_SQZT := '05';
END CASE;
elsif IS_YWLX = 'JC05' then
CASE IS_SPZT
WHEN '1' THEN
V_SQZT := '09';
WHEN '0' THEN
V_SQZT := '08';
END CASE;
elsif IS_YWLX = 'JC06' then
CASE IS_SPZT
WHEN '1' THEN
V_SQZT := '02';
WHEN '0' THEN
V_SQZT := '10';
END CASE;
end if;
IF IS_SPZT = '1'and IS_YWLX = 'JC02' THEN
if (PKG_ZJJG_YSZJGL.fuc_isyhxz(IS_JGXYBABH,'00008')>0) then
OS_MSG := '该监管协议银行受限,不能审批通过!';
return;
else
IF IS_JCLX = '02' AND IS_JCLX = '03' AND IS_JCLX = '04' THEN
--验证该协议是否存在网签合同
SELECT COUNT(1)
INTO V_COUNT2
FROM ZJJG_JGXYJCSQ A, YW_SPFMMHTZYXX B
WHERE A.JGXYBABH = B.JGXYBABH
AND B.HTZTDM IN ('01', '02', '03', '04', '07', '08', '09', '10')
AND A.JGXYBABH = IS_JGXYBABH
AND A.SQBH = IS_YWBH;
END IF;
IF V_COUNT2 > 0 THEN
V_SQZT := '04'; --提交市局审批
/*ELSE
--更新监管协议状态为注销
UPDATE ZJJG_JGXYBAXX A
SET A.JGXYZT = DECODE(IS_SPZT, '1', '07', A.JGXYZT),
A.XGSJ = TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS')
WHERE A.JGXYBABH = IS_JGXYBABH;*/
END IF;
end if;
ELSif IS_SPZT = '0'and IS_YWLX = 'JC02' then
UPDATE ZJJG_JGXYBAXX A
SET A.JGXYZT = '04',A.BLZT = '00'
WHERE A.JGXYBABH = IS_JGXYBABH;
END IF;
UPDATE ZJJG_JGXYJCSQ A
SET A.SQZT = V_SQZT
WHERE A.SQBH = IS_YWBH;
--添加审批意见
SP_INS_JGXYBLLC(IS_YWBH,IS_JGXYBABH,IS_YWLX,IS_YHBH,IS_YHMC,IS_SPYJ,IS_SPZT,IS_JGMC,OS_RETURN,OS_ERRORINF);
OS_MSG := '00';
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
OS_RETURN := -1;
OS_ERRORINF := '原因:' || SQLERRM;
END SP_UPD_YSJGXYJCSP;
上网一搜,一群人还在犯错中……
抄别人逻辑,写自己代码,让他们郁闷去吧!O(∩_∩)O哈哈~