2017-08-13 3 views
1

Je suis novice dans la création de fonctions dans postgresql. La version que j'utilise est plutôt ancienne. C'est 8.2.15 (pas mon choix, mais mon organisation). L'exemple suivant tente d'appliquer une fonction à une table temporaire dans une autre fonction.Application de la fonction à la table temporaire à l'intérieur d'une autre fonction

-- First function 
create or replace function inner_func(_tbl anyelement) 
RETURNS void AS 
$$ 
BEGIN 
    EXECUTE 'ALTER TABLE ' || _tbl || ' ADD COLUMN d_amount INTEGER'; 
    EXECUTE 'UPDATE ' || _tbl || ' SET d_amount = 2* amount'; 
    RETURN; 
END; 
$$ 
LANGUAGE plpgsql volatile; 

-- Second function 
CREATE OR REPLACE FUNCTION outer_func() 
RETURNS void AS 
$$ 
BEGIN 
    DROP TABLE IF EXISTS my_temp; 
    CREATE TEMP TABLE my_temp 
    (id serial primary key, 
    amount integer 
); 
    INSERT into my_temp (amount) values (10),(20); 

    -- now apply the inner_func right here 
    EXECUTE 'SELECT inner_func(' || quote_ident('my_temp') || ')'; 

    RETURN; 
END; 
LANGUAGE plpgsql volatile; 

Quand je lance

SELECT outer_func(); 

Il recrache une erreur:

column "my_temp" does not exist 

Mais le inner_func fonctionne si je l'utilise lui-même comme ce qui suit:

create temp table my_temp2 
(id serial primary key, 
amount integer 
); 
INSERT INTO my_temp2 (amount) values (10),(20); 
SELECT inner_func(quote_ident('my_temp2')); 
SELECT * from my_temp2; 

id amount d_amount 
1 10  20 
2 20  40 

Comment faire pour que inner_func fonctionne à l'intérieur outer_func? Une idée?

Répondre

1

Il semble que le problème est ici:

EXECUTE 'SELECT inner_func(' || quote_ident('my_temp') || ')'; 

=> 

EXECUTE 'SELECT inner_func(quote_ident(' || quote_literal('my_temp') || '));'; 

DBFiddle Demo

+1

Merci lad2025. Il fonctionne comme un charme! – midtownguru

+0

@midtownguru heureux d'entendre que je pourrais aider :) – lad2025