2011-05-26 2 views
0

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" 
} 
+1

Je l'ai lu 3 fois maintenant et je ne comprends pas la question –

+0

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

Répondre

1

Si votre exemple de sortie (moins l'open-paren supplémentaire) est tout ce que vous avez besoin alors je pense que votre script est trop tuer. Que dis-tu de ça?

#! /bin/awk -f 
{ 
    if ($2 ~ /[Ff][Uu][Nn][Cc][Tt][Ii][Oo][Nn]/) { 
     funcName=$3 
     argSig=$0 
     srchTarg= "^.*" funcName 
     sub(srchTarg,"",argSig) 
     # print "argSig=" argSig 
     sub(/[\)].*$/, ")", argSig) 
     # print "argSig=" argSig 
     print "DROP FUNCTION " funcName argSig 
    } 
} 

assurez-vous chmod 755 genDrop.awk

échantillon analysé

(j'ai changé la première ligne de votre entrée d'échantillon)

CREATE FONCTION folder_cycle_check (....

échantillon run

$ genDrop.awk dropFunction.txt 
DROP FUNCTION folder_cycle_check (folder_key INTEGER, new_parent_folder_key INTEGER) 

Aussi, en nommant votre script awk comme genDrop.txt n'a pas aidé à communiquer ce que votre intention est sûrement vous dire genDrop.awk

J'espère que cela aide. Permettez-moi de vous souhaiter la bienvenue à StackOverflow et de rappeler trois choses que nous faisons habituellement ici: 1) Comme vous recevez de l'aide, essayez de le donner aussi, répondre aux questions de votre domaine d'expertise 2) Lire la FAQ, http://tinyurl.com/2vycnvr, 3) Quand vous voyez bien Q & A, votez-les en utilisant les triangles gris, http://i.stack.imgur.com/kygEP.png, car la crédibilité du système est basée sur la réputation que les utilisateurs gagnent en partageant leurs connaissances. Rappelez-vous également d'accepter la réponse qui résout mieux votre problème, le cas échéant, en appuyant sur le signe coche, http://i.stack.imgur.com/uqJeW.png

Questions connexes