У нас есть файл SQL с определениями функций.Мы хотим прочитать этот файл и подготовить другой файл SQL со всеми операторами отбрасывания DDL для всех функций в первом файле SQL.
Например, первый SQL-файл имеет такое содержимое:
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;
Теперь я хочу создать целевой файл SQL как:
DROP FUNCTION folder_cycle_check((folder_key INTEGER, new_parent_folder_key INTEGER)
. Для этого у меня есть файл «genDrop.txt», который я передаю команде awk.exe вместе с первым файлом SQL.,Проблема с «genDrop.txt» заключается в том, что он генерирует только целевой файл SQL с операторами drop в виде:
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)
Кто-нибудь может мне помочь?Я новичок в программировании на awk.К вашему сведению, «genDrop.txt» это:
#######################################################################
# 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"
}