你去掉 begin 和 end
解决方案 »
- 求多CASE情况的语句
- linux 下装oracle,如何让存储过程也支持中文?
- 请人帮忙送分的:Oracle中在不使用序列,不使用主键,只允许使用SQL语
- 大家开发ebs画面(forms),用的是什么开发软件呢?
- SQL 语句统计问题
- 请教sql *plus的使用方法
- Window2000 + Oracle ,做备份实验,在Oracle运行时,如何破坏数据?
- 关于表空间与数据文件的大小问题,大家帮忙看看
- 有用ORACLE 8I做过数据仓库的高手吗?我愿意出1000元人民币拜师!如果你只要分数,我愿意给2000分。
- 表根据 日期字段 testDate 做了 PARTITION 然后写sql
- 大家帮我理解这一句
- rownum大于查询时无效
首先你这是内嵌SQL吗?如果是,请继续往下看,不是得话jump out...我是用类似下面得动态SQL执行存储过程得,可以得到正确结果:
EXEC SQL CALL FirstProc('USERS', :nCount);你的用法是嵌入了PL/SQL,需要设置预编译选项SQLCHECK=SEMANTICS。而且内嵌PL/SQL需要使用类似下面得语法:
EXEC SQL EXECUTE
DECLARE
...
BEGIN
...
END;
END-EXEC;
还有,如果对于v_sql的话,是用execute immediate v_sql
如果对于proc的话,是用execute proc不过你把proc放到v_sql中,是应该要immediate的
很普通的函数调用为什么要写成动态sql?
我现在把存储过程名和所需的参数都放到表中,如: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语句中,形成动态语句执行。 恳请问问各位大师,是否可行。
execute immediate '....' <- sql语句,不用加begin,end
参考:begin
execute immediate sql using para1,para2;
--para1,para2接收外层传入的参数
end;
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作为字符了