我們有一個帶有函數定義的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