你去掉 begin 和 end

解决方案 »

  1.   


    首先你这是内嵌SQL吗?如果是,请继续往下看,不是得话jump out...我是用类似下面得动态SQL执行存储过程得,可以得到正确结果:
    EXEC SQL CALL FirstProc('USERS', :nCount);你的用法是嵌入了PL/SQL,需要设置预编译选项SQLCHECK=SEMANTICS。而且内嵌PL/SQL需要使用类似下面得语法:
    EXEC SQL EXECUTE
        DECLARE
            ...
        BEGIN
            ...
        END;
    END-EXEC;
      

  2.   

    不需要加 begin end
    还有,如果对于v_sql的话,是用execute immediate v_sql
    如果对于proc的话,是用execute proc不过你把proc放到v_sql中,是应该要immediate的
      

  3.   

    ^_^,楼主写程序写晕了吧
    很普通的函数调用为什么要写成动态sql?
      

  4.   

    没晕,我要实现的是动态调用存储过程。参数也是动态的。那段语句是在一个存储过程中的。
    我现在把存储过程名和所需的参数都放到表中,如:table_proc(proc_name ,proc_parameter).
    在执行外层存储过程时还要执行一个内层存储过程,执行那个要根据情况查表。proc_parameter根据存储过程不同也不同。但都是外层存储过程传入参入之一。
    比如:外层存储过程 waiceng(paraA in varchar2,paraB in varchar2).
    在执行waiceng存储过程中,要动态形成一条语句,执行一个内部存储过程。
    如: vsql:='begin '||v_proc_name|| '('|| v_proc_parameter||');' ||'end;';
         execute immediate vsql;
    解释:v_proc_name和v_proc_parameter是通过查表table_proc得到的相应的proc_name和proc_parameter的值。而proc_parameter的值分别可能是'paraA'或'paraB'。也就是指明用哪个传入参数的值。
        我式过了,好像都不行。不知道行不?
        vsql:='begin '||v_proc_name|| '('|| paraA ||');' ||'end;'
        execute immediate vsql;
        这样没问题。但不符合要求。
        我需要:
         vsql:='begin '||v_proc_name|| '('|| v_proc_parameter||');' ||'end;';
         execute immediate vsql;
        用v_proc_parameter指定(paraA或paraB),然后再通过paraA或paraB将其值 插入到vsql语句中,形成动态语句执行。    恳请问问各位大师,是否可行。
      

  5.   

    呵呵...越说越复杂~
    execute immediate '....'  <- sql语句,不用加begin,end
      

  6.   

    明白楼主的意思了。要动态传递参数。
    参考:begin
      execute immediate sql using para1,para2;
      --para1,para2接收外层传入的参数
    end;
      

  7.   

    declare
    a_date   date:=to_date('2005-05-06 08:00:00', 'yyyy-mm-dd hh24:mi:ss');
    vsql    varchar2(100);
    begin
    vsql=vsql || 'get_name('||a_date||');'||' end;';
    execute immediate vsql;
    end;a_date是动态的变量,你的错误就是把a_date作为字符了