Vous n'êtes pas identifié(e).
Bonjour,
Je m'y connais pas du tout en pl/pgsql et j'ai eu un travail à faire.
J'ai créé une fonction pl/pgsql et au moment de l'exécuter j'ai une erreur "SQL Error [42601]: Unterminated dollar quote at position 93 in SQL -- (tout mon code) ".
Je ne comprends pas pourquoi j'ai cette erreur et en cherchant sur internet, je n'arrive pas à résoudre ce problème.
Voilà mon code, mon principal problème est cette histoire de '$$' mais si vous voyez d'autres problèmes n'hésitez pas à les montrer ! :
create or replace function GenUnifCatal() returns void as $$
declare
-- Curseur pour parcourir la table META
meta_cursor cursor for select table_name, trans_code from META;
-- Variables pour stocker les données de chaque catalogue
catalog_name VARCHAR(255);
transformation_code VARCHAR(10);
-- Variables pour stocker les attributs de catalogue
name_attribute VARCHAR(50);
price_attribute numeric(8, 2);
-- Variables pour stocker les données à charger dans C_ALL
product_name VARCHAR(50);
product_price NUMERIC(8, 2);
begin
-- detruit C_ALL si existe
drop table if exists C_ALL;
-- crée la table C_ALL
create table C_ALL (pid serial primary key,
pname varchar,
pprice numeric);
-- Ouvre le curseur
open meta_cursor;
-- Boucle pour parcourir la table META
fetch meta_cursor into catalog_name, transformation_code;
while found loop
-- Recherche dynamique des attributs "name" et "price" dans le catalogue
select column_name into name_attribute from information_schema.columns where table_name = catalog_name and column_name LIKE '%name%';
select column_name into price_attribute from information_schema.columns where table_name = catalog_name and column_name LIKE '%price%';
-- Dynamiquement charge les données de chaque catalogue
EXECUTE format("insert into C_ALL (pname, pprice)
values( case when %I like '%CAP%' then upper(%I)
else %I
end,
case when %I like '%CUR%' then (%I * 1.05)
else %I
end);") using transformation_code, name_attribute, name_attribute, transformation_code, price_attribute, price_attribute);
fetch meta_cursor into catalog_name, transformation_code;
end loop;
-- Ferme le curseur
close meta_cursor;
end;
$$ language plpgsql;
Et le code pour les tables:
CREATE TABLE C1(
product_id NUMERIC(5) PRIMARY KEY,
product_name VARCHAR(50),
product_price NUMERIC(8,2)
);
INSERT INTO C1 VALUES(1, 'COMPUTER', 799.9);
INSERT INTO C1 VALUES(2, 'MONITOR', 349.9);
CREATE TABLE C2(
id NUMERIC(5) PRIMARY KEY,
price NUMERIC(8,2),
name VARCHAR(50)
);
INSERT INTO C2 VALUES(10, 299.9, 'Printer');
INSERT INTO C2 VALUES(20, 149.9, 'Scanner');
CREATE TABLE C3(
pname VARCHAR(50),
pprice NUMERIC(8,2)
);
INSERT INTO C3 VALUES('mouse', 29.9);
INSERT INTO C3 VALUES('webcam', 19.9);
CREATE TABLE meta(
table_name VARCHAR(255),
trans_code VARCHAR(10)
);
INSERT INTO meta VALUES('C1', NULL);
INSERT INTO meta VALUES('C2', 'CAP');
INSERT INTO meta VALUES('C3', 'CAP+CUR');
COMMIT;
Merci pour toute aide apportée !
Hors ligne
Il y a plein d'erreurs dans ce code. On peut commencer avec les guillemets doubles qui doivent être remplacés par des guillemets simples mais doublés. Ceci n'est peut être pas à faire car la présence du format me parait très douteuse. Pour moi, c'est "EXECUTE INSERT... USING...".
Et enfin, le "Unterminated dollar quote" me paraît peu croyable pour cette fonction.
Guillaume.
Hors ligne