oracle 的存储过程中 动态的创建一张表 然后插入一个变量到这个表中,表能动态的创建但是变量不能插入进去
我的代码如下createorreplaceprocedureP_judgeexist(v_namechar,v_birthdatestaff.stbirthdate%ty...
我的代码如下
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..... 展开
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、下次报错,请把你的出错情况提出来。我们怎么知道什么错呢?
就算是 直接执行 的话 也是 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、下次报错,请把你的出错情况提出来。我们怎么知道什么错呢?
更多追问追答
追问
追答
你把你整个sql发出来。。。。肯定其它部分出错了。
展开全部
估计是缺少引号的缘故。v_name是varchar2的吧。
改成 execute immediate ' insert into addtopinfo values('||sysdate||',‘‘'||v_name||'’’)'; 试试,就是v_name变量在语句里要有引号 。拼接字符串时每两个“'” 会被解析成为一个“'”
改成 execute immediate ' insert into addtopinfo values('||sysdate||',‘‘'||v_name||'’’)'; 试试,就是v_name变量在语句里要有引号 。拼接字符串时每两个“'” 会被解析成为一个“'”
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
即使不加引号也可以插入的 最多oracle会做个隐式转换,这不会有问题 而且v_name本身就是char类型,根本不能存在转换问题
我有个疑问P_addstaffnum 这个是楼主干什么用的?
至于报错的问题楼主少了分号和commit才是关键!
我有个疑问P_addstaffnum 这个是楼主干什么用的?
至于报错的问题楼主少了分号和commit才是关键!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
create table 表名 as select * from 表
在存储过程里面加 execute immediate
在存储过程里面加 execute immediate
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
过程里面建表 需要commit后才能插入吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询