如果我使用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 Command nor proper ended"错误消息
查看DayParams后面的双括号。您的SQL Developer SQL中没有它。为了避免使用StackOverflow作为Oracle SQL拼写检查器,您可以:
- 使用SQL编辑器粘贴查询文本there
- 使用字符串常量和赋值它在一个整体,而不是一行一行的行
你为什么非要这么辛苦地做这件事?:)
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。添加语句以确保嵌入的引号是正确的)
您在Delphi中使用什么组件进行查询?
您在ORDER BY子句字符串的末尾有一个分号,这将导致此错误,具体取决于您在查询中使用的组件。