delphi 7.0下连oracle:
ADOQuery1.SQL.Add('select charge_type, count(charge_type) from pat_visit where admission_date_time between :l_date and :h_date group by charge_type');
ADOQuery1.Parameters.ParamByName('l_date').Value:=AdvDateTimePicker1.DateTime;
ADOQuery1.Parameters.ParamByName('h_date').Value:=AdvDateTimePicker2.DateTime;为什么报ora-00979错误:not a group by express。
改为
ADOQuery1.SQL.Add('select charge_type from pat_visit where admission_date_time between :l_date and :h_date');
ADOQuery1.Parameters.ParamByName('l_date').Value:=AdvDateTimePicker1.DateTime;
ADOQuery1.Parameters.ParamByName('h_date').Value:=AdvDateTimePicker2.DateTime;
可以运行。谢谢.

解决方案 »

  1.   

    oracle
    就是这个没研究过
    关注一下
      

  2.   

    语法很对
    查了百度,说是版本有bug,要设置_complex_view_merging参数为false才行,试试alter session set "_complex_view_merging"=false
      

  3.   

    那不用参数的方式,改一下试试;若行就不知是Oracle的问题,还是ADO的问题了ADOQuery1.SQL.Add('select charge_type, count(charge_type) AS t from pat_visit');
    ADOQuery1.SQL.Add('where admission_date_time between '''+DateToStr(AdvDateTimePicker1.DateTime)+''' and '''+DateToStr(AdvDateTimePicker2.DateTime)+'''');
    ADOQuery1.SQL.Add('group by charge_type');
      

  4.   

    ADO套件是有很多不尽人意的地方,比如很多公司都用SDAC,ODAC那类组件,估计是ADO的XXOO
      

  5.   

    因admission_date_time字段数据类型为日期型,将其转换为string型,按兄台意见改过后未报错,但未查询到数据,将该语名放到PB上运行则可以查到数据。今天则发现一件更奇怪的事:ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select * from pat_visit');
    ADOQuery1.SQL.Add(' where ADMISSION_DATE_TIME between :l_date and :h_date');
    ADOQuery1.Parameters.ParamByName('l_date').Value:=form6.AdvDateTimePicker1.DateTime;
    ADOQuery1.Parameters.ParamByName('h_date').Value:=form6.AdvDateTimePicker2.DateTime;
    ADOQuery1.Open;ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select CHARGE_TYPE ,count(CHARGE_TYPE) from pat_visit');
    ADOQuery1.SQL.Add(' where ADMISSION_DATE_TIME between :l_date and :h_date group by CHARGE_TYPE');
    ADOQuery1.Parameters.ParamByName('l_date').Value:=form6.AdvDateTimePicker1.DateTime;
    ADOQuery1.Parameters.ParamByName('h_date').Value:=form6.AdvDateTimePicker2.DateTime;
    ADOQuery1.Open;以上两段语句一起运行,没有任何问题,可以得出结果,而单独运行后一段则报错:
    ora-00979错误:not a group by express.
    太奇怪了,为什么呀?谢谢!
      

  6.   

    试试改成count(*),不用count(CHARGE_TYPE)看看。
      

  7.   

    直接到将生气了语句到后台查询,看看有问题么?语法上没有什么问题,把oracle补丁打一下,上次我们公司oracle同样的语句查询,返回的结果还不一样的
      

  8.   

    绝对是ADO的问题!我碰到过最后用BDE了
      

  9.   

    我遇到过,就是有group by的语句在ADOQuery是不能使用Parameters的,没有原因,Oracle也没问题,但可以把参数嵌套在SQL语句里面,就是麻烦了一点
      

  10.   


    我遇到过,就是有group by的语句在ADOQuery是不能使用Parameters的,没有原因,Oracle也没问题,但可以把参数嵌套在SQL语句里面,就是麻烦了一点,老老实实用变量吧~PL/SQL ,toad这些都没问题的,就是ADO的bug
      

  11.   

    没有任何问题呀?ADO也没有任何问题。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, DB, ADODB, Grids, DBGrids;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        ADOQuery2: TADOQuery;
        DateTimePicker1: TDateTimePicker;
        DateTimePicker2: TDateTimePicker;
        Button1: TButton;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('select stationstat ,count(stationstat) as rs from personinfo');
      ADOQuery1.SQL.Add('where birthday between :l_date and :h_date group by stationstat');
      ADOQuery1.Parameters.ParamByName('l_date').Value:=DateTimePicker1.DateTime;
      ADOQuery1.Parameters.ParamByName('h_date').Value:=DateTimePicker2.DateTime;
      ADOQuery1.Open;
    end;end.图片传不上来。查询结果和后台PL/SQL一样正确。
    在连接时,建议楼主使用:OraOLEDB.Oracle.1
      

  12.   

    很确切的说,是驱动的问题。楼主在连接oracle数据库的时候,建议不要使用MSDAORA.1,建议使用OraOLEDB.Oracle.1,我一直使用后者, 没有任何问题。
      

  13.   

    楼上说的是到BDE Administration里配置?使用ADOquery一般都是直接使用 Microsoft OLE DB Provider for Oracle 了。