Chinaunix

标题: 看一段pl sql,很短,有什么语法错误? [打印本页]

作者: TOADLover    时间: 2009-09-10 13:46
标题: 看一段pl sql,很短,有什么语法错误?
begin
           insert into tbl1 values('3', 'abc3');
          
           if '4' not exists(select colid from tbl2) then
                     insert into tbl2 values('4', 'def4');
           end if;
end;

以上的写法有什么问题吗?
-------------------------------------------------------------------------------------
表内的数据:
select * from tbl1;
-----------------------
colid   cola
1        abc
2        abc2
3        abc3
----------------------
select * from tbl2;
----------------------
colid    colb
1         def
2         def2
3         def3
---------------------------------------------------------------------------------------
建表的脚本:
create table tbl1(colid varchar2(20), cola varchar2(20))

create table tbl2(colid varchar2(20), colb varchar2(30))
--------------------------------------------------------------------------------------------
Oracle 不认得if exists这样的语法只好用:
--------------------------------------
declare v_A int;
begin
select count(1) from P_ODR into v_A where A = s_ado(0);

if (v_A = 0) then
insert 。。。。。

[ 本帖最后由 TOADLover 于 2009-9-14 10:56 编辑 ]
作者: 乱叶    时间: 2009-09-10 13:46
我记得 Oracle 中不能用if exists 吧..... 好像是if 不认识exists 的返回的东东
作者: TOADLover    时间: 2009-09-10 14:07
有什么问题吗?这样写有什么问题?
作者: TOADLover    时间: 2009-09-10 14:10
if '4' not exists(select colid from tbl2) then
                     insert into tbl2 values('4', 'def4');
           end if;
------------------------------------------------------------
我的意思就是:
如果 '4' 不在tbl2的colid字段的集合中,才进行插入操作!
作者: TOADLover    时间: 2009-09-10 14:10
这个问题很难吗?有没有路过的高手答一下啊?
作者: TOADLover    时间: 2009-09-10 14:11
我在网上看到一些exists 和in的用法的辨析,可是越看越糊涂。。。。。。。。。。
作者: TOADLover    时间: 2009-09-10 14:13
大部分都是引用同一个地方的
作者: TOADLover    时间: 2009-09-10 14:15
select DOCUMENT_CODE from freight
WHERE
NOT EXISTS (SELECT * FROM TRAFFIC WHERE FREIGHT.DOCUMENT_CODE = TRAFFIC.TRAFFIC_CODE)  
AND FREIGHT_STATE = '0'
---------------------------------------------------------------------------------
这exists一定要有表连接的操作吗?
select DOCUMENT_CODE from freight WHERE DOCUMENT_CODE NOT IN (SELECT TRAFFIC_CODE FROM TRAFFIC) AND FREIGHT_STATE = '0'

----------------------------------------------------------------------------------
http://topic.csdn.net/u/20090505 ... e-d8e3ab6c34c0.html

[ 本帖最后由 TOADLover 于 2009-9-10 14:16 编辑 ]
作者: TOADLover    时间: 2009-09-10 14:28
好么! 没人理我了。。。。呵呵
---------------------------------------
begin
           insert into tbl1 values('4', 'abc4');
          
           if  not exists (select colid from tbl2) then
                     insert into tbl2 values('4', 'def4')
           end if;
end;
------------------------------------------
这么写也不对啊!!!!!!!!!

[ 本帖最后由 TOADLover 于 2009-9-10 14:30 编辑 ]
作者: TOADLover    时间: 2009-09-10 14:30
  
作者: 乱叶    时间: 2009-09-10 15:46
手上没环境
insert into tbl1 values('4', 'abc4') where not exists (select * from tbl2 )
这样不行 就只能 count了
作者: liangmatwo    时间: 2009-09-10 16:00
有这样写的吗?
declare
v_char tbl2.col1id%type;
begin
select max(col1id) into v_char from tbl2 where col1id='4';
exception
when no_data_found then
insert into tbl2 values('4', 'def4');
end;

[ 本帖最后由 liangmatwo 于 2009-9-10 16:02 编辑 ]
作者: doni    时间: 2009-09-11 10:01
试试,不常写,不知道对不对

  1. begin
  2.            insert into tbl1 values('3', 'abc3');
  3.       begin     
  4.            select colid from tbl2
  5.              where colid = 4;
  6.       exception
  7.            when no_data_found then
  8.                      insert into tbl2 values('4', 'def4');
  9.       end;
  10. end;
复制代码

[ 本帖最后由 doni 于 2009-9-11 10:02 编辑 ]
作者: doni    时间: 2009-09-11 10:04
或者这样:

  1. insert into tbl2
  2. select '4', 'def4' from daul
  3.   where not exists (select 'x' from tbl2
  4.                                  where colid = '4')
复制代码

作者: Minsic    时间: 2009-09-11 10:19
标题: 回复 #13 doni 的帖子
pl/sql不能直接这么写的,select colid from tbl2 where colid = 4; 要写成select colid into some_variable from tbl2 where colid;

  1. begin
  2.            insert into tbl1 values('3', 'abc3');
  3.       declare
  4.            l_var varchar2(20);
  5.       begin
  6.            select colid into l_var from tbl2
  7.              where colid = 4;
  8.       exception
  9.            when no_data_found then
  10.                      insert into tbl2 values('4', 'def4');
  11.       end;
  12. end;
复制代码


我觉得和11楼说的那样,不用嵌套块的话也可以用count来做:

  1. declare
  2.         l_cnt number;
  3. begin
  4.            insert into tbl1 values('3', 'abc3');
  5.            select count(colid) into l_cnt from tbl2 where colid='4';
  6.            if l_cnt=0 then
  7.                    insert into tbl2 values('4','def4');
  8.            end if;
  9. end;
复制代码

[ 本帖最后由 Minsic 于 2009-9-11 10:22 编辑 ]
作者: doni    时间: 2009-09-11 10:25
原帖由 Minsic 于 2009-9-11 10:19 发表
pl/sql不能直接这么写的,select colid from tbl2 where colid = 4; 要写成select colid into some_variable from tbl2 where colid;

begin
           insert into tbl1 values('3', 'abc3');
      dec ...


平时不常写pl/sql,只是在forms里写写procedure & trigger,所以不太熟,见笑了
作者: Minsic    时间: 2009-09-11 10:25
标题: 回复 #14 doni 的帖子
这个好,支持
作者: wanlw61    时间: 2009-09-11 11:41
标题: 回复 #1 TOADLover 的帖子
exists 不能这样用的 ! 只能用在关联里面是否存在这种关联,才能用exists;
你这个语句可以这样用
declare
  v_num number;
begin
           insert into tbl1 values('3', 'abc3');
           select count(1) into v_num from tbl2 where colid = 4 ;
           if v_num = 0 then
                     insert into tbl2 values('4', 'def4');
           end if;
end;
作者: TOADLover    时间: 2009-09-15 15:10
标题: 回复 #18 wanlw61 的帖子
嗯,这个说的好,准确的解决方案,呵呵。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2