Nous avons un fichier SQL avec des définitions de fonctions. Nous voulons lire ce fichier et préparer un autre fichier SQL avec toutes les instructions drop DDL pour toutes les fonctions du premier fichier SQL.extrait du texte entre une paire de parenthèses en utilisant awk
Par exemple, le premier sql a le contenu comme celui-ci:
CREATE OR REPLACE FUNCTION folder_cycle_check (folder_key INTEGER, new_parent_folder_key INTEGER) RETURNS VOID AS $procedure$
DECLARE
parent_of_parent INTEGER;
BEGIN
IF folder_key = new_parent_folder_key THEN
RAISE EXCEPTION 'Illegal cycle detected',new_parent_folder_key;
END IF;
SELECT INTO parent_of_parent (SELECT parent_folder_key FROM folder where folder_key = new_parent_folder_key);
IF new_parent_folder_key IS NOT NULL THEN
PERFORM folder_cycle_check(folder_key, parent_of_parent);
END IF;
END; $procedure$
LANGUAGE plpgsql;
Maintenant, je veux créer la cible fichier SQL comme:
DROP FUNCTION folder_cycle_check((folder_key INTEGER, new_parent_folder_key INTEGER)
Pour cela pour réaliser que j'ai un « Gendrop. fichier txt "que je passe à la commande awk.exe avec le premier fichier SQL. Le problème avec le « genDrop.txt » est qu'il ne génère la cible fichier SQL avec les instructions de dépôt que:
DROP FUNCTION folder_cycle_check
which is not useful because PostgreSQL wants like this:
DROP FUNCTION folder_cycle_check(folder_key INTEGER, new_parent_folder_key INTEGER)
Quelqu'un peut-il me aider? Je suis nouveau à la programmation awk. Pour votre information, le « genDrop.txt » est la suivante:
#######################################################################
# AWK program to generate drop statements from create table, procedure, and view statements
############################################################################
function dropit(objtype, objname, rulename)
{
# l[lines++] = "DROP " objtype " " objname " -- Line " NR ", Rule " rulename;
l[lines++] = "DROP " objtype " " objname
next
}
function dropitpg(objtype, objname, funcargs, rulename)
{
# l[lines++] = "DROP " objtype " " objname " -- Line " NR ", Rule " rulename;
l[lines++] = "DROP " objtype " " objname " " funcargs
next
}
BEGIN { FS="[ (;]*" }
# trim the line
{$2 = $2 }
# "grab creates"
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Pp][Rr][Oo][Cc]/ {dropit($3, $4, "CPs") }
/^[Cc][Rr][Ee][Aa][Tt][Ee] *[Pp][Rr][Oo][Cc]/ {dropit($2, $3, "CP") }
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Pp][Rr][Oo][Cc]/ {dropit($5, $6, "CPs") }
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Pp][Rr][Oo][Cc]/ {dropit($4, $5, "CP") }
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Vv][Ii][Ee][Ww]/ {dropit($3, $4, "CVs") }
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Vv][Ii][Ee][Ww]/ {dropit($2, $3, "CV") }
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Vv][Ii][Ee][Ww]/ {dropit($5, $6, "CRVs") }
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Vv][Ii][Ee][Ww]/ {dropit($4, $5, "CRV") }
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Tt][Aa][Bb][Ll][Ee]/ {dropit($3, $4, "CTs") }
/^[Cc][Rr][Ee][Aa][Tt][Ee] *[Tt][Aa][Bb][Ll][Ee]/ {dropit($2, $3, "CT") }
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Ss][Ee][Qq][Uu][Ee][Nn][Cc][Ee]/ {dropit($3, $4, "CSs") }
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Ss][Ee][Qq][Uu][Ee][Nn][Cc][Ee]/ {dropit($2, $3, "CS") }
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/ {dropit($3, $4, "CSs") }
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/ {dropit($2, $3, "CS") }
END{
print "-- Beginning " lines " drop statements"
for (i = lines - 1; i >= 0; --i) {
print l[i]
print EOS
print ""
}
print "-- End of " lines " drop statements"
}
BEGIN { FS="[ ;]*" }
/^ +[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/ {dropitpg($5, $7, "CSs") }
/[Cc][Rr][Ee][Aa][Tt][Ee] *[Oo][Rr] *[Rr][Ee][Pp][Ll][Aa][Cc][Ee] *[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/ {sed -nr "s/\s*\[([^\]+)\]/\1/p" }
END{
print "-- Beginning " lines " drop statements"
for (i = lines - 1; i >= 0; --i) {
print l[i]
print EOS
print ""
}
print "-- End of " lines " drop statements"
}
Je l'ai lu 3 fois maintenant et je ne comprends pas la question –
votre exemple de sortie (dans le 2ème bloc de code) montre 2 parens d'ouverture, c'est ce que vous voulez vraiment? Bonne chance. – shellter