2

アプリケーションにBDS 2006PostgreSQLを使用しています。
テーブル内の主キー値を見つけるためのクエリで構成される次のコードがあります。

 Query.SQL.Clear;
 Query.SQL.Add('SELECT pg_attribute.attname,format_type(pg_attribute.atttypid, pg_attribute.atttypmod)FROM pg_index, pg_class, pg_attribute WHERE pg_class.oid = '+#39+'tablename'+#39+' ::regclass AND indrelid = pg_class.oid AND pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = any(pg_index.indkey)AND indisprimary');
 Query.Open;

構文エラー メッセージが表示される

 General SQL error.  
 ERROR: syntax error at or near ":";  

#58の代わりに使用してみましたが:、結果は同じです。
次のクエリは、PostgreSQL 内で正常に動作します。

どうすればそれを機能させることができますか

4

3 に答える 3

6

1) BDE タグを付ける場合は、BDE + BDE ODBC SQLLink + PgSQL ODBC ドライバーを使用していると思われます。BDE コンポーネントは':'、param マーカーとして、および'::'に変換されるエスケープ シーケンスとして期待され':'ます。次の 2 つの基本的なオプションがあります。

  • セットTQueryParamCheckFalse に設定しParams、手でコレクションを埋めます。
  • double every one ':'、パラメーター マーカーではありません。となります'::::'

2) PgSQL の意味を理解している AnyDACなど'::'のサードパーティ ライブラリを使用できます。'::'そのため、パラメータ マーカーとして認識されません。

于 2012-01-23T11:32:31.487 に答える
3

テーブル名に大文字が含まれている場合、つまり "MySuperDupleTable" の場合はテーブル名を二重引用符で囲んでみてください。二重引用符で囲まれていない場合、postgres はその名前を小文字に変更します。

それでも問題が解決しない場合は、試してみてください::::regclass。数年前のことを思い出してください。「::」を 2 倍にする必要のある Delphi コンポーネントを使用していました。

お役に立てれば。

于 2012-01-23T09:42:16.407 に答える
2

PostgreSQL 固有の の代わりにCASTに切り替えてみることができます:::

Query.SQL.Add('SELECT pg_attribute.attname,format_type(pg_attribute.atttypid, pg_attribute.atttypmod)FROM pg_index, pg_class, pg_attribute WHERE pg_class.oid = CAST('+#39+'tablename'+#39+' AS regclass) AND indrelid = pg_class.oid AND pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = any(pg_index.indkey) AND indisprimary');

おそらく、Delphi の何かが、名前付きプレースホルダにコロンを使用したいと考えています。

于 2012-01-23T09:23:03.230 に答える