各位大侠:
小弟遇到个简单的问题,我在oracle9i上,写了一个存储过程,就是输入一个参数,
在存储过程中,把真个参数后面再加上一个字符串,然后把它插入到一张表中存储过程如下
CREATE OR REPLACE PROCEDURE CMCC.STA_YYTOPERATE_TOTAL(
str1 in varchar2)
ISBEGIN str2 varchar2(16);
sqlstr varchar2(4000); str2 := str1 || 'byebye'; sqlstr := ' insert into CCC(STR) values (' || str2|| ')';execute immediate sqlstr1;
commit;END STA_YYTOPERATE_TOTAL;其中表CCC的字段STR的类型是varchar2,
在代码中调用存储过程后,出错
报的错误是ORA-00984: column not allowed here如果我把插入语句的str2改成str1,直接插入str1,就成功
我只是把str1加了一段字符串,然后赋值给str2,为什么就不能插入呢;我也试图把插入语句改成
sqlstr := ' insert into CCC(STR) values ("hello")';或
sqlstr := ' insert into CCC(STR) values (hello)';
试图直接插入一个字符串,在代码中调用存储过程的时候,也是出错的,但是我单独执行
insert into CCC(STR) values ('hello');这句话,是成功的小弟真的不知道哪里错了,望大家指点,谢谢了!!!
小弟遇到个简单的问题,我在oracle9i上,写了一个存储过程,就是输入一个参数,
在存储过程中,把真个参数后面再加上一个字符串,然后把它插入到一张表中存储过程如下
CREATE OR REPLACE PROCEDURE CMCC.STA_YYTOPERATE_TOTAL(
str1 in varchar2)
ISBEGIN str2 varchar2(16);
sqlstr varchar2(4000); str2 := str1 || 'byebye'; sqlstr := ' insert into CCC(STR) values (' || str2|| ')';execute immediate sqlstr1;
commit;END STA_YYTOPERATE_TOTAL;其中表CCC的字段STR的类型是varchar2,
在代码中调用存储过程后,出错
报的错误是ORA-00984: column not allowed here如果我把插入语句的str2改成str1,直接插入str1,就成功
我只是把str1加了一段字符串,然后赋值给str2,为什么就不能插入呢;我也试图把插入语句改成
sqlstr := ' insert into CCC(STR) values ("hello")';或
sqlstr := ' insert into CCC(STR) values (hello)';
试图直接插入一个字符串,在代码中调用存储过程的时候,也是出错的,但是我单独执行
insert into CCC(STR) values ('hello');这句话,是成功的小弟真的不知道哪里错了,望大家指点,谢谢了!!!
解决方案 »
- 关于Oracle数据库某一段的查询——为了分页
- 救命啊!求能帮忙oracle数据库恢复的高手
- 日期无效问题:TO_DATE('02-09-1980', 'dd-Mon-yyyy HH:MI:SS AM')
- 不能启动Oracle,请帮忙!
- count(*)和count(1) 问题
- 高手指点!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 日期格式匹配
- replace(替换字符串某一位)的问题?
- 急!!! 请问:DB_E_BADORDINAL(0x80040E55) 是什么错,怎么解决?!!!
- HELP!数据库报错! ORA-04031 错误,我该怎么做?
- 求助:触发器的如何取变动行字段信息的问题
- 求:form 中将表的内容导出至二进制文件文件的方法
str1 in varchar2)
IS
str2 varchar2(16);
sqlstr varchar2(4000);
BEGIN
str2 := str1 ¦ ¦ 'byebye ';
sqlstr := ' insert into CCC(STR) values ( ''' ¦ ¦ str2 ¦ ¦ ''') ';
execute immediate sqlstr1;
commit;
END STA_YYTOPERATE_TOTAL; 应该是这样吧
小弟这段代码也是照葫芦画瓢,照着别人的写的,按照您的改了,可以了,想问下您,
1. || 这个符号的作用是什么,连接字符串的吗?
2.为什么您加上'''',即语句变成
sqlstr := ' insert into CCC(STR) values( ''' ¦¦ str2 ¦¦ ''') ';
后就好了呢?是不是''''的原因呢?它的作用是什么呢?谢谢您了
str1 in varchar2)
IS
str2 varchar2(16);
sqlstr varchar2(4000);
BEGIN
str2 := str1 ¦ ¦ 'byebye '; sqlstr := ' insert into CCC(STR) values ( ''' ¦ ¦ str2 ¦ ¦ ''') '; execute immediate sqlstr;
commit; END STA_YYTOPERATE_TOTAL;
1、||是连接字符串的意思
2、'''在我们对sqlstr进行赋值的过程中是为了形成如下的语句:
insert into CCC(STR) values ( 'hello');
我们只好在变量赋值作如下处理:
sqlstr := ' insert into CCC(STR) values ( '''hello''') ';
其中' insert into CCC(STR) values ( '''是当成一个串,用||连接hello(也是一个串),然后再用||连接''') '字符串;
tol_num number(10);现在想从数据库中查出记录的条数,然后赋值给tol_num,然后再执行另外一条插入语句,把tol_num变量的值插入另外一张表中,查询记录条数的语句为
sqlstr := ' select count(*) into ' || ''' || tol_num1 || ''' || ' from AAA '
execute immediate sqlstr1;
commit;
在代码中调用这个存储过程,报错,说ORA-00905: missing keyword把上面的代码写在sql语句中,就是declare tol_num number(10);
begin
select count(*) into tol_num from AAA;
end;单独执行起来是没有问题的,这个原因又出在哪里呢?麻烦您了.问题解决后马上加分结贴,谢谢您了
str1 in varchar2)
IS
tol_num number(10);
sqlstr varchar2(4000);
BEGIN
select count(*) into tol_num from AAA;
sqlstr:= 'insert into CCC(STR) values ('''||to_char(tol_num)||''')';
execute immediate sqlstr;
commit;
END STA_YYTOPERATE_TOTAL; 如果是numbet,要记得to_char
获得这些变量的时候,把他们一起插入表中,用您上面的方法,好像就不太适合
str1 in varchar2)
IS
tol_num number(10);
str2 varchar2(200);
sqlstr varchar2(4000);
BEGIN
str2 := str1 ¦ ¦ 'byebye ';
select count(*) into tol_num from AAA;
可以用这种:
sqlstr:= 'insert into CCC(Field1,field2) values ('''||to_char(tol_num)||''','''||str2||''') ';
execute immediate sqlstr;
也可以用:
insert into CCC(Field1,field2) values(tol_num,str2);
或者多值从一张表:
insert into CCC(Field1,field2,field3) select tol_num,str2......
commit;
END STA_YYTOPERATE_TOTAL;
可能你误解我的意思,我这边只是说明可以用该方法,上面就有很多方法可以实现你的目的
比如
str2 = 'hello'sqlstr := ' insert into CCC(STR) values (' ¦¦ str2 ¦¦ ')';如果把 sqlstr 的值 dbms_output.put_line(sqlstr) 出来的话,应该是: insert into CCC(STR) values( hello ) 而不是 values('hello')这样系统会把hello当作列名来处理,就会出现 ORA-00984: column not allowed here,提示在values中不允许使用列名。按楼上的方法,加上单引号就行了