[Postgresql] Lengte varchar functie parameter aangeven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Brainstorm
  • Registratie: November 2000
  • Laatst online: 21:24
Voor een nieuw project ben ik bezig met een applicatie die PostgreSQL als database gebruikt. Er was al een kleine basisapplicatie die draaide op MySQL 5, deze ben ik nu aan het migreren naar de nieuwe database omgeving. Dit is voor 99% klaar. Het is de eerste keer dan ik met Postgres werk.


In de database zitten een aantal tabellen, stored procedures functies, etc. Met behulp van een O/R mapper (LLBLGen Pro 2.5) heb ik de DAL laag gegenereerd, inclusief het aanroepen van de stored procedures. Een aantal procedures accepteren een varchar als parameter. Zoals ik gewend ben van SQL Server waren in de MySQL database hier maximale lengtes aan meegegeven (90 karakters). De definitie van mijn SP is dan ook als volgt (vereenvoudigd):

SQL:
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE FUNCTION spsetservername(pServerId integer, pServerName character varying(90))
  RETURNS void AS
$BODY$
BEGIN
        UPDATE tblServer SET
            last_name = $2
            WHERE server_id = $1;
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;


LLBLGen ziet deze SP wel, maar geeft van de tweede parameter aan dat deze een maximale lengte heeft van 1073741824. Zodra ik de functie vanuit de code aanroep geeft deze dan ook de foutmelding dat de lengte niet klopt ('length for type varchar cannot exceed 10485760'). Als ik dan vervolgens ga kijken naar de definitie van de functie zoals pgAdmin deze weergeeft dan zie ik het volgende:

SQL:
1
CREATE OR REPLACE FUNCTION spsetservername(pServerId integer, pServerName character varying)


Met andere woorden: bij het aanmaken is de lengte qua syntax geen probleem, alleen slaat 'ie hem niet op. Blijkbaar werkt PostgreSQL op dit punt anders dan SQL Server/MySQL. Vraag is alleen, hoe krijg ik de lengte nu wel goed ingesteld?

Het grappige is dat de documentatie hier helemaal niets over zegt en dat in de meeste voorbeelden die ik op internet tegenkom in de functie definitie de lengte ook niet opgenomen is. In sommige voorbeelden staat deze dan wel weer expliciet aangegeven, precies op dezelfde manier als ik het ook had.

Als ik de query handmatig aanroep is het geen probleem. Het betreft trouwens PostgresSQL 8.3.1

Programmer's Drinking Song: 99 little bugs in the code, 99 bugs in the code, Fix one bug, compile it again, 100 little bugs in the code. (go to start if bugs>0)


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

De lengte van een varchar kan en hoef je vziw bij een functie in postgresql niet op( te )geven. Maar helemaal zeker ben ik er niet van.

Maar een varchar van 1GB invoeren is wellicht sowieso niet erg handig? Misschien doe je wat anders fout als je die melding krijgt.

[ Voor 11% gewijzigd door ACM op 02-05-2008 17:30 ]


Acties:
  • 0 Henk 'm!

  • Brainstorm
  • Registratie: November 2000
  • Laatst online: 21:24
Nou ik heb een varchar van maximaal 90 karakters, de string in mijn testcase is maar 4 karakters. Waar het op fout gaat is dat in het uiteindelijke SQL statement in .NET er een maxlength van 1073741824 meegegeven wordt. Ook al is de eigenlijke lengte van de string maar 4 bytes, de driver geeft wel een fout.

Wat ik eigenlijk wil is dat LLBLGen de juiste maximale lengte ziet. Ik vermoedde eigenlijk dat net zoals in andere database systemen je bij de definitie van de parameter van de functie ergens de maximale lengte mee kon geven. Maar misschien dat deze maximale waarde in PostgreSQL impliciet en altijd op 1 MB staat?

Programmer's Drinking Song: 99 little bugs in the code, 99 bugs in the code, Fix one bug, compile it again, 100 little bugs in the code. (go to start if bugs>0)


Acties:
  • 0 Henk 'm!

  • Brainstorm
  • Registratie: November 2000
  • Laatst online: 21:24
Ik begin inderdaad sterk het vermoeden te krijgen dat LLBLGen gewoon 1 GB als maximum ziet. Niet geheel toevallig is dit ook de maximale grootte van een (var)char in postgresql (alhoewel je niet zoveel karakters kwijt kunt i.v.m. multibyte encodings). Ik heb op het forum van LLBLGen deze vraag neergelegd.

Workaround: in de gegenereerde code vervang ik 1073741824 door 10485760. De functies worden dan wel aangeroepen.

Programmer's Drinking Song: 99 little bugs in the code, 99 bugs in the code, Fix one bug, compile it again, 100 little bugs in the code. (go to start if bugs>0)