Pregunta

estoy usando BDS 2006 con PostgreSQL para mi solicitud.
Tengo el siguiente código que consta de la consulta para encontrar los valores de la clave principal dentro de mi tabla.

 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;

Recibo un mensaje de error de sintaxis

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

Intenté usar #58 en lugar de : pero resulta lo mismo.
La siguiente consulta funciona bien dentro de mi PostgreSQL.

¿Alguna opinión sobre cómo puedo hacerlo funcionar?

¿Fue útil?

Solución

1) Si coloca la etiqueta BDE, espero que haya utilizado el controlador BDE + BDE ODBC SQLLink + PgSQL ODBC.Los componentes BDE esperan ':' como marcador de parámetros, y '::' como una secuencia de escape que se traduce en ':'.Tienes dos opciones básicas:

  • colocar TQuery.ParamCheck a Falso y completar Params recogida a mano;
  • duplicar cada uno ':', que no es un marcador de parámetro.Así será '::::'.

2) Puedes usar bibliotecas de terceros, como CualquierDAC, que entienden qué es PgSQL '::' medio.Entonces no reconocerán '::' como marcador de parámetro.

Otros consejos

Intente poner el nombre de la tabla entre comillas dobles si su nombre contiene caracteres en mayúscula, es decir"MySuperDupleTable", postgres cambia su nombre a minúsculas si no está entre comillas dobles.

Si eso no soluciona tu problema, quizás también quieras intentarlo. ::::regclass Recuerdo que hace un par de años estábamos usando algunos componentes de Delphi que requerían duplicar "::".

Espero que esto ayude.

Podrías intentar cambiar a ELENCO en lugar del específico de PostgreSQL :::

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');

Quizás algo en Delphi quiera usar dos puntos para los marcadores de posición con nombre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top