Q&A

  • 오라클 insert시...ㅠ_ㅠ
항상 감사한 마음으로 리플보구 있습니다...모든 분들께 감사합니다

또다시 허접한 질문을 드려서 죄송합니다...

Sqlplus에서는 그냥 insert했더니 잘 됐습니다...

근데 프로그램상에서는 오류가 떠서...ㅠ_ㅠ

begin
  with QryUpdate do
  begin
    Close;
    Sql.Clear;
    Sql.Add(' INSERT INTO 테이블 ');
    Sql.Add(' (appno,regionno,areano,comgubun,telno,regno,basic0006,starttime ,endtime ,parkingtime,origincharge,discntcharge,charge) VALUES ');
    Sql.Add(' (appno+1,:regionno,:areano,:comgubun,:telno,:regno,:basic0006, ');
    Sql.Add(' to_date(:starttime,''yyyy-mm-dd hh24:mi''),to_date(:endtime,''yyyy-mm-dd hh24:mi''),:parkingtime,:origincharge,:discntcharge,to_number,:charge) ');
    ParamByName('regionno').AsString := Query5.FieldByName('regioncode').AsString;
    ParamByName('basic0006').AsString := Query4.FieldByName('code1').AsString;
    ParamByName('areano').AsString := Edit3.Text;
    ParamByName('telno').AsString := Edit9.Text;
    ParamByName('regno').AsString := Edit2.Text;
    ParamByName('starttime').AsString := Edit9.Text;
    ParamByName('endtime').AsString := Edit2.Text;
    ParamByName('parkingtime').AsString := Edit4.Text;
    ParamByName('origincharge').AsString := Edit10.Text;
    ParamByName('discntcharge').AsString := Edit11.Text;
    ParamByName('charge').AsString := Edit5.Text;
    try
    ExecSql;
    ShowMessage('등록되었습니다');
    Query2.close;
    Query2.Open;
    except
      ShowMessage('값을 넣어주세요');
      Exit;
    end;
  end;
end;

실행시 ORA-00984: 열을 사용할 수 없습니다....라고 나옵니다...

컬럼 형식은...
appno              number
regionno          varchar
areano             varchar
comgubun        varchar
telno                varchar
regno               varchar
basic0006        varchar
starttime            date
endtime             date
parkingtime      number
origincharge    number
discntcharge    number
charge             number

이렇게 구성되어있는데여...왜 INSERT시 자꾸 에러가 뜨는지요...

고수님들의 조언 부탁드립니다
2  COMMENTS
  • Profile
    이동준 2002.11.07 08:35
    제가 델파이로 데이터베이스 프로그래밍은 많이 해보지 않았지만 오라클을 조금 다뤄봐서.. 쿼리를 보니..

    일단
    VALUES ');
        Sql.Add(' (appno+1,
    라는 부분이 있네요. 이것은 쿼리의 규칙에 어긋납니다. appno라는 것이 특정값을 갖는 변수라면 몰라도 그냥 테이블의 필드에 무작정 +1을 한 값이 무엇인지 명확하지가 않기 때문입니다.

    그리도 아래부분에서 하나 더 틀린 부분이 있는데..

    :discntcharge,to_number,:charge) ');

    여기서 ,to_number, :charge로 표현한다면 전체 필드는 13개인데 넣는 값이 14개가 되어서 오류입니다.

    to_number(:charge) 가 맞습니다.

    charge 뿐 아니라 parkingtime, origincharge,discntcharge 등이 모두 숫자타입이네요. 이것들의 변수들이 스트링이라면 모두 to_number를 붙여줘야 합니다.
  • Profile
    최병철 2002.11.06 23:02
    도움이 될지 모르겠지만 참고 하세요.
    제가 오라클이 없어 테스트는 하지않고 보냅니다.
    참고 옛적에 일부 프로젝트 참여가 한 부분입니다.


             2:with Query1 do begin { 추가 }
                    Close;
                    Sql.Clear;
                    Sql.Add('begin ');
                    Sql.Add('   declare x_sno number(5); ');
                    Sql.Add('   begin ');
                    Sql.Add('      select nvl(max(AC_SNO)+1,1) into x_sno from ACC.AC_CODE; ');
                    Sql.Add('      insert into ACC.AC_CODE(AC_SCODE,AC_CODE,AC_NAME,AC_BUNLU11,AC_BUNLU12,AC_BUNLU13 ');
                    Sql.Add('                             ,AC_COMP,AC_SISAN,AC_SISAN_CD,AC_COST,AC_MI,AC_FUND ');
                    Sql.Add('                             ,AC_AUTO,AC_REPARE,AC_PLUS ');
                    Sql.Add('                             ,T_COMP,T_BNAME11,T_BNAME12,T_BNAME13,AC_SNO) ');
                    Sql.Add('                       values(:x00,:x01,:x02,:x03,:x04,:x05   ');
                    Sql.Add('                             ,:x06,:x07,:x08,:x09,:x10,:x11   ');
                    Sql.Add('                             ,:x12,:x13,:x14  ');
                    Sql.Add('                             ,:x15,:x16,:x17,:x18,x_sno); ');
                    Sql.Add('      commit; ');
                    Sql.Add('   end; ');
                    Sql.Add(' exception ');
                    Sql.Add('   when others then ');
                    Sql.Add('   rollback; ');
                    Sql.Add('   raise_application_error(-20001,sqlerrm(sqlcode)); ');
                    Sql.Add('end; ');
                    Params[ 0].AsString :=MaskEditAC_SCODE   .Hint;
                    Params[ 1].AsString :=MaskEditAC_SCODE   .Text+MaskEditAC_CODE.Text;
                    Params[ 2].AsString :=MaskEditAC_NAME    .Text;
                    Params[ 3].AsInteger:=MaskEditAC_BNAME11 .Tag;
                    Params[ 4].AsInteger:=MaskEditAC_BNAME12 .Tag;
                    Params[ 5].AsInteger:=MaskEditAC_BNAME13 .Tag;
                    Params[ 6].AsInteger:=ComboBoxAC_COMP    .ItemIndex;
                    Params[ 7].AsInteger:=ComboBoxAC_SISAN   .ItemIndex;
                    Params[ 8].AsInteger:=ComboBoxAC_SISAN_CD.ItemIndex;
                    Params[ 9].AsInteger:=ComboBoxAC_COST    .ItemIndex;
                    Params[10].AsInteger:=ComboBoxAC_MI      .ItemIndex;
                    Params[11].AsInteger:=ComboBoxAC_FUND    .ItemIndex;
                    Params[12].AsInteger:=ComboBoxAC_AUTO    .ItemIndex;
                    Params[13].AsInteger:=ComboBoxAC_REPARE  .ItemIndex;
                    Params[14].AsString :=MaskEditAC_PLUS    .Text;
                    Params[15].AsInteger:=t_comp;
                    Params[16].AsInteger:=t_bname11;
                    Params[17].AsInteger:=t_bname12;
                    Params[18].AsInteger:=t_bname13;
                    ExecSql;
               end;
             3:with Query1 do begin { 수정 }
                    Close;
                    Sql.Clear;
                    Sql.Add('begin ');
                    Sql.Add('   update ACC.AC_CODE ');
                    Sql.Add('      set AC_NAME    =:x00 ');
                    Sql.Add('         ,AC_SCODE   =:x01 ');
                    Sql.Add('         ,AC_CODE    =:x02 ');
                    Sql.Add('         ,AC_BUNLU11 =:x03 ');
                    Sql.Add('         ,AC_BUNLU12 =:x04 ');
                    Sql.Add('         ,AC_BUNLU13 =:x05 ');
                    Sql.Add('         ,AC_COMP    =:x06 ');
                    Sql.Add('         ,AC_SISAN   =:x07 ');
                    Sql.Add('         ,AC_SISAN_CD=:x08 ');
                    Sql.Add('         ,AC_COST    =:x09 ');
                    Sql.Add('         ,AC_MI      =:x10 ');
                    Sql.Add('         ,AC_FUND    =:x11');
                    Sql.Add('         ,AC_AUTO    =:x12');
                    Sql.Add('         ,AC_REPARE  =:x13');
                    Sql.Add('         ,AC_PLUS    =:x14');
                    Sql.Add('         ,T_COMP     =:x15');
                    Sql.Add('         ,T_BNAME11  =:x16');
                    Sql.Add('         ,T_BNAME12  =:x17');
                    Sql.Add('         ,T_BNAME13  =:x18');
                    Sql.Add('    where AC_SNO=:x19;');
                    Sql.Add('   commit; ');
                    Sql.Add(' exception ');
                    Sql.Add('   when others then ');
                    Sql.Add('   rollback; ');
                    Sql.Add('   raise_application_error(-20001,sqlerrm(sqlcode)); ');
                    Sql.Add('end; ');
                    Params[ 0].AsString :=MaskEditAC_NAME    .Text;
                    Params[ 1].AsString :=MaskEditAC_SCODE   .Hint;
                    Params[ 2].AsString :=MaskEditAC_SCODE   .Text+MaskEditAC_CODE.Text;
                    Params[ 3].AsInteger:=MaskEditAC_BNAME11 .Tag;
                    Params[ 4].AsInteger:=MaskEditAC_BNAME12 .Tag;
                    Params[ 5].AsInteger:=MaskEditAC_BNAME13 .Tag;
                    Params[ 6].AsInteger:=ComboBoxAC_COMP    .ItemIndex;
                    Params[ 7].AsInteger:=ComboBoxAC_SISAN   .ItemIndex;
                    Params[ 8].AsInteger:=ComboBoxAC_SISAN_CD.ItemIndex;
                    Params[ 9].AsInteger:=ComboBoxAC_COST    .ItemIndex;
                    Params[10].AsInteger:=ComboBoxAC_MI      .ItemIndex;
                    Params[11].AsInteger:=ComboBoxAC_FUND    .ItemIndex;
                    Params[12].AsInteger:=ComboBoxAC_AUTO    .ItemIndex;
                    Params[13].AsInteger:=ComboBoxAC_REPARE  .ItemIndex;
                    Params[14].AsString :=MaskEditAC_PLUS    .Text;
                    Params[15].AsInteger:=t_comp;
                    Params[16].AsInteger:=t_bname11;
                    Params[17].AsInteger:=t_bname12;
                    Params[18].AsInteger:=t_bname13;
                    Params[19].AsInteger:=MaskEditAC_CODE    .Tag;
                    ExecSql;
               end;