CREATE or REPLACE PROCEDURE proc_rb_test
(pmjyrq varchar2,pmshbh varchar2)
AS
rq varchar2(8);
sh varchar2(3);
BEGIN
rq := pmjyrq;
sh := pmshbh;
delete from table1;
insert into tbale1 (a,b,c) 
select a,b,c
from table2 where a = sh
commit;
END;
以上代码怎么不行呢。
CREATE or REPLACE PROCEDURE proc_rb_test
(pmjyrq varchar2,pmshbh varchar2)
AS
rq varchar2(8);
sh varchar2(3);
sqlstr varchar2(3000);
BEGIN
rq := pmjyrq;
sh := pmshbh;
delete from table1;
sqlstr := 'insert into tbale1 (a,b,c) 
select a,b,c
from table2 where a = '''||sh||'''';
execute immediate sqlstr;
commit;
END;
这样到是可以,难道只能用这样执行动态语句????????????

解决方案 »

  1.   

    奇怪了。我这里这样都可以的呀declare
    rq varchar2(10);
    sh integer;
    BEGIN
    rq := 'f';
    sh := 6;
    insert into t (username,price) values(rq,sh);
    commit;
    END;
    /
      

  2.   

    CREATE or REPLACE PROCEDURE proc_rb_test
    (pmjyrq varchar2,pmshbh varchar2)
    AS
    rq varchar2(8);
    sh varchar2(3);
    BEGIN
    rq := pmjyrq;
    sh := pmshbh;
    delete from table1;
    insert into tbale1 (a,b,c) 
    select a,b,c
    from table2 where a = sh;//这里没分号
    commit;
    END;
    如果不是这个,那么报什么错了
      

  3.   

    tbale1 tbale2 的字段类型能对应上吗?
      

  4.   

    这里没分号没有漏掉,贴上来时候手误,tbale1 tbale2 字段当然没有问题。
    设置成常量insert into tbale1 (a,b,c) 
    select a,b,c
    from table2 where a = '001' 可以直接执行,唯独才过程里执行的时候就不行。是不是这个语句是一次插入很多条记录所以不能这样用参数呢。
      

  5.   

    在procedure中不能直接用dml语句,如果要用,你必须是使用exexute immediate来执行
      

  6.   

    CREATE or REPLACE PROCEDURE proc_rb_test
    (pmjyrq varchar2,pmshbh varchar2)---- 改成:CREATE or REPLACE PROCEDURE proc_rb_test
    (pmjyrq IN varchar2,pmshbh IN varchar2)另外,你所谓的不能执行,是报什么错误信息呢?还是根本就编译不能通过呢?把错误信息贴出来
      

  7.   

    boydgmx 你说的两种参数定义是都没有问题的。
    而且程序本身能编译通过,而且执行也没有错误,我还在PL*sql里分步执行 参数传递都正常,但是就是没有结果。
    难道真的是chliang315()所说在procedure中不能直接用dml语句,如果要用,你必须是使用exexute immediate来执行。如果这样的话写些复杂的存储过程那就麻烦了。
      

  8.   

    对于根据条件组合的Sql语言必须是EXECUTE IMMEDIATE来执行的。