Toon posts:

[PostgreSQL] Stored procedure error

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende stored procudure (functie) gemaakt in PL/pgSQL. Wanneer ik deze aanroep met de volgende regel:

code:
1
select set_update_permissions(3, 1, 1, 1, 1, 1, 1);


krijg ik de volgende error

code:
1
2
3
4
5
NOTICE:  test

ERROR:  syntax error at or near "$1" at character 27
QUERY:  insert into permissions ( $1 , permission_type_id,  $2 ) VALUES ( $3 , $4 , $5 )
CONTEXT:  PL/pgSQL function "set_update_permissions" line 23 at SQL statement


De error onstaat dus bij direct na de if (nieuwe insert van record).

iemand enig idee??

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- Function: set_update_permissions(group_id int4, c int4, r int4, u int4, d int4, table_id int4, user_id int4)

-- DROP FUNCTION set_update_permissions(group_id int4, c int4, r int4, u int4, d int4, table_id int4, user_id int4);

CREATE OR REPLACE FUNCTION set_update_permissions(group_id int4, c int4, r int4, u int4, d int4, table_id int4, user_id int4)
  RETURNS bool AS
$BODY$
DECLARE
    record1 record;
    record2 record;
    perm int;
    perm_type int :=0;
BEGIN
    -- Kijk of er al een permissie bestaat voor de tabel/groep
    FOR record1 IN select p.permission_id as id from permissions as p where p.group_id = $1 and p.table_id = $6 
    LOOP
        perm = record1.id;
    END LOOP; 
    
    -- Haal het bijbehorende permissie type op
    FOR record2 IN select p_t.permission_type_id as id from permission_type as p_t where p_t.c=$2 AND p_t.r=$3 AND p_t.u=$4 AND p_t.d=$5
    LOOP
        perm_type = record2.id;
    END LOOP;
    
    IF perm IS NULL 
    THEN
        -- nieuwe inserten
        raise notice 'test';
        insert into permissions (group_id, permission_type_id, table_id) VALUES ($1,perm_type,$6);
        return TRUE;
    ELSE 
        -- updaten
        update permissions set permission_type_id = perm_type where permissions.table_id = $6 and group_id = $1;
        return TRUE;
    END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION set_update_permissions(group_id int4, c int4, r int4, u int4, d int4, table_id int4, user_id int4) OWNER TO provis;

Verwijderd

Werkt het wel op die manier? D.w.z. met $1? Daar valt ie over, dus ik denk dat dat niet klopt he :)

Geen ervaring met Stored Procedures, maar de foutmelding is duidelijk genoeg dacht ik zo

Verwijderd

Topicstarter
ja, zo moet dat wel, dat zijn de namen van de argumenten die aan de functie mee gegeven worden.

als ik de stored procedure namelijk zo aanroep:

code:
1
select set_update_permissions(1, 1, 1, 1, 1, 1, 1);


werkt het wel, Dan doet hij namelijk gewoon de update na de else omdat de variable perm dan een waarde heeft.

[ Voor 11% gewijzigd door Verwijderd op 08-02-2006 16:08 ]


Verwijderd

Strange...

In je code staat:

code:
1
insert into permissions (group_id, permission_type_id, table_id) VALUES ($1,perm_type,$6);

En de foutmelding:

code:
1
insert into permissions ( $1 , permission_type_id,  $2 ) VALUES ( $3 , $4 , $5 )

:? Lijkt me heel erg vreemd :?

Verwijderd

Topicstarter
ja vindt ik inderdaad ook vreemd, maar ik krijg het zo

Verwijderd

Topicstarter
en als ik deze regel toevoeg om het insert statement als output te printen:

code:
1
raise notice 'insert into permissions (group_id, permission_type_id, table_id) VALUES (%,%,%);',$1,$2,$3;


krijg ik als output het volgende statement

code:
1
insert into permissions (group_id, permission_type_id, table_id) VALUES (3,1,1);


Wanneer ik dit direct als query in de database stop, gaat het wel goed..

heel vreemd allemaal, iemand een idee?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

group_id is ook een parameternaam van je functie. Wellicht dat je met "group_id" de boel netjes kunt escapen en ie begrijpt dat je de tabel-kolomnaam bedoelt ipv de parameter.

Die $x's geven uiteraard aan dat het de x-de parameter is voor die query.

[ Voor 19% gewijzigd door ACM op 08-02-2006 16:40 ]


Verwijderd

Topicstarter
Nee, helaas dat helpt ook niet.

Erg vreemd dit

Verwijderd

Topicstarter
iemand?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Zoals ik al zei lijkt het me te liggen aan de overlap in naamgeving van kolommen en variabelen. Zoek uit hoe je dat kan escapen en je hebt je probleem opgelost gok ik. Naast "group_id" heb je natuurlijk ook al tabel.group_id geprobeerd?

[edit]
Hoewel dat misschien niet zo lekker werkt in een insert...

Misschien maar gewoon je variabelen hernoemen?

[ Voor 39% gewijzigd door ACM op 09-02-2006 12:25 ]

Pagina: 1