oracle 的存储过程中 动态的创建一张表 然后插入一个变量到这个表中,表能动态的创建但是变量不能插入进去

我的代码如下
create or replace procedure P_judgeexist
(
v_name char ,
v_birthdate staff.stbirthdate%type,
v_phone staff.stphone%type,
v_depid staff.depid%type,
v_gender staff.stgender%type,
v_money staff.money%type
)
is
a int;
v_sql char(50);
begin
SELECT COUNT(*) into a
FROM all_tables
WHERE table_name= 'ADDTOPINFO';

P_addstaffnum(v_name,v_birthdate,v_phone,v_depid,v_gender,v_money);
if a=0
then
execute immediate 'create table addtopinfo(addtime date,staffname char(15))';
execute immediate ' insert into addtopinfo values('||sysdate||','||v_name||')';

else

execute immediate ' insert into addtopinfo values('||sysdate||','||v_name||')';

end if;
end;

--调用过程
begin
P_judgeexist('王老吉',to_date('1999-11-12','yyyy-mm-dd'),'13880',7,'男',3200);
end;
这句话出错了, execute immediate ' insert into addtopinfo values('||sysdate||','||v_name||')'; 不知道怎么搞的,求教各位
我用 v_sql:= 'insert into addtopinfo values('''||sysdate||''','''||v_name||''')';

成功运行 感谢
帮组解答的童鞋
create 表之后仍然需要commit.....

1、execute immediate ' insert into addtopinfo values('||sysdate||','||v_name||')'; v_name 既然是变量 怎么可能会用' '括号起来;
就算是 直接执行 的话 也是 execute immediate ' insert into addtopinfo values(sysdate,v_name);
2、如果有v_name的话 ,我建议你一般用拼sql的方式来执行
例如 如下格式(这个是我自己的procedure截取的,可以参考下)
v_CreateSql := ' create table ' ||vv_owner||'.'|| vv_name_temp ||
' as select * from ' || iv_name || ' where 1=0';

execute immediate v_CreateSql;

3、下次报错,请把你的出错情况提出来。我们怎么知道什么错呢?追问

我把语句改成

v_sql:= 'insert into addtopinfo values('||sysdate||','||v_name||')';


然后在创建表之后添加了一个

commit


但是提示

追答

你把你整个sql发出来。。。。肯定其它部分出错了。

追问

代码已私信你..请帮忙查看下

插入的v_sql字符串 我打印出来 是:insert into addtopinfo values(14-10月-12,王老吉)
这个语句是对的噻,但是值提示,v_sql缺失逗号,搞晕了

追答

execute immediate v_sql2; v_sql2呢?没定义吧

追问

这不是重点,v_sql 提示缺失逗号,v_sql2只是定义了一个需要打印的东东,发给你的时候没删完.....

追答

create or replace procedure P_judgeexist
(
v_name varchar2
)
is
a int;
v_sql char(150);
begin
v_sql:= 'insert into addtopinfo values('||'sysdate'||','||v_name||')';
dbms_output.put_line(v_sql);
execute immediate v_sql;
commit;
end P_judgeexist;

sysdate 需要用‘ ’括起来就没错了。。。唉。。尼玛 我也以为sysdate也是不需要阔的,但是输出v_sql发现错了,下次注意,还有v_name 写成varchar2类型,不然会继续报错。这次没错了。。你可以直接拿去用了
*****************************************
为了防止更多的同学被你误解,create 表是不需要commit 的;只有delete 或者insert 之后才需要commit; 请尊重事实

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-13
估计是缺少引号的缘故。v_name是varchar2的吧。
改成 execute immediate ' insert into addtopinfo values('||sysdate||',‘‘'||v_name||'’’)'; 试试,就是v_name变量在语句里要有引号 。拼接字符串时每两个“'” 会被解析成为一个“'”
第2个回答  2012-10-15
即使不加引号也可以插入的 最多oracle会做个隐式转换,这不会有问题 而且v_name本身就是char类型,根本不能存在转换问题

我有个疑问P_addstaffnum 这个是楼主干什么用的?

至于报错的问题楼主少了分号和commit才是关键!
第3个回答  2012-10-19
create table 表名 as select * from 表
在存储过程里面加 execute immediate
第4个回答  2012-10-13
过程里面建表 需要commit后才能插入吧