各位大侠:
小弟遇到个简单的问题,我在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');这句话,是成功的小弟真的不知道哪里错了,望大家指点,谢谢了!!!

解决方案 »

  1.   

    CREATE   OR   REPLACE   PROCEDURE   CMCC.STA_YYTOPERATE_TOTAL( 
      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; 应该是这样吧
      

  2.   

    不怕guo0399见笑,
    小弟这段代码也是照葫芦画瓢,照着别人的写的,按照您的改了,可以了,想问下您,
    1. || 这个符号的作用是什么,连接字符串的吗?
    2.为什么您加上'''',即语句变成 
    sqlstr := ' insert into CCC(STR) values( ''' ¦¦ str2 ¦¦ ''') '; 
    后就好了呢?是不是''''的原因呢?它的作用是什么呢?谢谢您了
      

  3.   

    CREATE   OR   REPLACE   PROCEDURE   CMCC.STA_YYTOPERATE_TOTAL( 
      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; 
      

  4.   

    回答:
    1、||是连接字符串的意思
    2、'''在我们对sqlstr进行赋值的过程中是为了形成如下的语句:
      insert   into   CCC(STR)   values   ( 'hello');
      我们只好在变量赋值作如下处理:
      sqlstr   :=   '   insert   into   CCC(STR)   values   ( '''hello''') ';
      其中'   insert   into   CCC(STR)   values   ( '''是当成一个串,用||连接hello(也是一个串),然后再用||连接''') '字符串;     
      

  5.   

    哦,谢谢!还得问您一下,我在存储过程中申明了一个变量
     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;单独执行起来是没有问题的,这个原因又出在哪里呢?麻烦您了.问题解决后马上加分结贴,谢谢您了
      

  6.   

    CREATE  OR   REPLACE   PROCEDURE  CMCC.STA_YYTOPERATE_TOTAL(   
        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
      

  7.   

    guo0399,我提问的时候把我遇到的情况简化了,实际上又很多个变量,每个变量都是从另外一张表中提取出来的信息,
    获得这些变量的时候,把他们一起插入表中,用您上面的方法,好像就不太适合
      

  8.   

    CREATE OR REPLACE PROCEDURE CMCC.STA_YYTOPERATE_TOTAL(       
    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;       
    可能你误解我的意思,我这边只是说明可以用该方法,上面就有很多方法可以实现你的目的
      

  9.   

    构建dynamic sql 需要把字符串需要的单引号也包括进去。
    比如
    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中不允许使用列名。按楼上的方法,加上单引号就行了  
      

  10.   

    OK问题解决,准备加分的时候说帖子发布不足5天,guo0399别急啊,过几天结贴