質問

OracleのSQL開発者を使用して次の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コマンドが適切に終了する」エラーメッセージが表示されます

役に立ちましたか?

解決

Dayparamsの後のダブルブラケットを見てください。 SQL開発者SQLにはありません。 StackOverFlowをOracle SQL Spell Checkerとして使用することを避けるために、次のことができます。

  1. SQLエディターを使用して、そこにクエリテキストを貼り付けます
  2. 文字列定数を使用して、行ごとではなく、全体に割り当てます

他のヒント

なぜあなたはこれを難しい方法で行うことを主張するのですか? :)

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開発者クエリウィンドウ(またはその他の編集コントロール)に直接貼り付けることができるユーティリティがあります。また、逆を行うものもあります - クエリテキストをクリップボードに選択し、ユーティリティを実行してから、後にコードを貼り付けます const Whatever = 完全に形成されたDelphi文字列を上記のように使用するために定数を作成するために(実際、SQL.ADDステートメントをクリーンアップした後に使用して、組み込みの引用が正しいことを確認しました)。

デルファイでクエリにどのコンポーネントを使用していますか?

クエリに使用しているコンポーネントに応じて、このエラーを引き起こすClause文字列ごとに、注文の最後にセミコロンがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top