0

如果我使用 Oracle 的 SQL Developer 运行以下 SQL。

select payee_id, to_char(check_date,'d') as DOW,  
(cmcl_bank_cleared - check_date) as DateDiff from AP_Master  
where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=1)  
order by payee_address_zip, DOW, DateDiff  

它工作正常,但是当我尝试使用 Delphi 时

SQL.Add('select payee_id, to_char(check_date, ' + QuotedStr('d') + ') as DOW, ');
SQL.Add('(cmcl_bank_cleared - check_date) as DateDiff from AP_Master ');
SQL.Add('where (cmcl_bank_cleared is not null) AND ((cmcl_bank_cleared - check_date) >=:DaysParam))');
SQL.Add('order by payee_id, DOW, DateDiff;');

我收到“ORA-00933:SQL 命令也没有正确结束”错误消息

4

3 回答 3

5

查看 DayParams 之后的双括号。您的 SQL Developer SQL 中没有它。为了避免您将 StackOverflow 用作 Oracle SQL 拼写检查器,您可以:

  1. 使用 SQL 编辑器并将查询文本粘贴到那里
  2. 使用字符串常量并将其分配为一个整体,而不是逐行分配
于 2011-04-27T18:48:55.827 回答
1

你为什么坚持以艰难的方式做到这一点?:)

const
  SQLText =   'select payee_id, to_char(check_date, ''d'') as DOW,'#13 +
              '(cmcl_bank_cleared - check_date) as DateDiff from AP_Master'#13 +
              'where (cmcl_bank_cleared is not null)'#13 +
              'AND (cmcl_bank_cleared - check_date >=:DaysParam)'#13 +
              'order by payee_id, DOW, DateDiff'#13;

begin
  MyQuery.SQL.Text := SQLText;
  MyQuery.ParamByName('DaysParam').AsInteger := SomeNumberOfDays;
  try
    MyQuery.Open;
    // Use query results
  finally
    MyQuery.Free;
  end;
end;

我有一个实用程序,允许您在 IDE 中选择它并将其复制到剪贴板,运行该实用程序,然后直接粘贴到您的 SQL Developer 查询窗口(或任何其他编辑控件)中。我也有一个做相反的事情 - 你选择任何查询文本到剪贴板,运行实用程序,然后将代码粘贴到后面,const Whatever =以制作一个完美形成的 Delphi 字符串常量,如上使用(实际上,我在清理后使用它起来你的 SQL.Add 语句以确保嵌入的引号是正确的)。

于 2011-04-27T19:47:38.860 回答
0

您在 Delphi 中使用哪些组件进行查询?

您的 ORDER BY 子句字符串末尾有一个分号,这将导致此错误,具体取决于您用于查询的组件。

于 2011-04-27T18:47:32.937 回答