我们有一个带有函数定义的SQL文件。我们想要读取这个文件,并为第一个SQL文件中的所有函数准备另一个包含所有DDL语句的SQL文件。使用awk提取一对括号之间的文本
例如第一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 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"
}
我读了这3次现在,我不明白的问题 – 2011-05-26 13:17:37
您的示例输出(在第二个代码块)显示2个开头的包袱,这是你真正想要的吗?祝你好运。 – shellter 2011-05-26 14:02:04