请各位帮忙看下下面这个存储过程有什么语法错误啊,执行的时候提示我说缺少select关键字
create or replace procedure pro_yg_ztts2(columnname varchar2,
                                         colsnames  varchar2,
                                         zttsidds   varchar2,
                                         tablenames varchar2,
                                         tablename  varchar2,
                                         exams      varchar2,
                                         idx        varchar2,
                                         condition  varchar2) is
   VarSQLStr varchar2(2000);
 begin
   if condition is null then
   
     VarSQLStr := 'insert into yg_ztts(' || columnname ||
                  ',ztid,sourtab,yg_ztts_exam)' || '(select' || colsnames || ',' ||
                  zttsidds || ',' || tablename || ',' || exams || 'from' ||
                  tablenames || 'where id=' || idx||')';
   else
     VarSQLStr := 'insert into yg_ztts(' || columnname ||
                  ',ztid,sourtab,yg_ztts_exam)' || '(select' || colsnames || ',' ||
                  zttsidds || ',' || tablename || ',' || exams || 'from' ||
                  tablenames || 'where id=' || idx||'and'||condition||')';
     end if; 
     Execute Immediate VarSQLStr;
    end;

解决方案 »

  1.   

    'insert into yg_ztts(' ¦ ¦ columnname ¦ ¦ 
                      ',ztid,sourtab,yg_ztts_exam)' 
    为什么用' ¦ ¦
    明显不对么
      

  2.   

    'insert into yg_ztts(' ¦ ¦ columnname ¦ ¦ 
                      ',ztid,sourtab,yg_ztts_exam)' 后面
    为什么用' ¦ ¦ 
    明显不对么
      

  3.   

    不是在数据库里面是||这样的,不知复制出来就变成¦ ¦ 
    应该不是这个问题啊,我现在把后面的select语句的括号去掉又提示我说缺少values关键字。
    各位等着急用帮帮忙吧/
      

  4.   

    每个VarSQLStr里面的select加空格
    另外除了这个以外都要看看哪块少空格
    建议连完后用dbms_output.put_line
    打出来看看写的sql对不对
      

  5.   

    insert into ( 字段1,字段2)
    select 字段1,字段2
        from 表名
      

  6.   

    还是不看具体的语法了,谈谈解决思路吧:1. 执行之前,还是先输出来检查检查吧
       --Execute Immediate VarSQLStr; 
       dbms_output.put_line(VarSQLStr);2. 执行存储过程
    3. 在output中检查输出的语句有没有问题
    4. 可以拷贝出来单独执行看看结果如何
      

  7.   

    INSERT INTO TABLE_NAME1
    (
      ROW1
     ,ROW2
     ,ROW3
     ...
     ,ROWN
    )
    SELECT
      ROW1
     ,ROW2
     ,ROW3
     ...
     ,ROWN
    FROM TABLE_NAME2
    WHERE .....SELECT 语句不要加().
      

  8.   


    改成如下看看:
    CREATE OR REPLACE PROCEDURE PRO_YG_ZTTS2(COLUMNNAME VARCHAR2,
                                             COLSNAMES  VARCHAR2,
                                             ZTTSIDDS   VARCHAR2,
                                             TABLENAMES VARCHAR2,
                                             TABLENAME  VARCHAR2,
                                             EXAMS      VARCHAR2,
                                             IDX        VARCHAR2,
                                             CONDITION  VARCHAR2) IS
      VARSQLSTR VARCHAR2(2000);
    BEGIN
      IF CONDITION IS NULL THEN
        VARSQLSTR := 'insert into yg_ztts(' || COLUMNNAME ||
                     ',ztid,sourtab,yg_ztts_exam)' || '(select ' || COLSNAMES || ',' ||
                     ZTTSIDDS || ',' || TABLENAME || ',' || EXAMS || ' from ' ||
                     TABLENAMES || ' where id=''' || IDX || ''')';
      ELSE
        VARSQLSTR := 'insert into yg_ztts(' || COLUMNNAME ||
                     ',ztid,sourtab,yg_ztts_exam)' || '(select ' || COLSNAMES || ',' ||
                     ZTTSIDDS || ',' || TABLENAME || ',' || EXAMS || ' from ' ||
                     TABLENAMES || ' where id=''' || IDX || ''' and ' ||
                     CONDITION || ')';
      END IF;
      EXECUTE IMMEDIATE VARSQLSTR;
    END;
      

  9.   

    字符串动态连接成SQL语句时一定要记得在其前后加入空格!还有顺便提醒一下:像这种东西,如果有报错,就把这个生成串打印出来,结果就一目了然了!