<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Pr%C3%A0ctica_ASI-C6-ASGBD%3A_Scripts_amb_PostgreSQL</id>
	<title>Pràctica ASI-C6-ASGBD: Scripts amb PostgreSQL - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Pr%C3%A0ctica_ASI-C6-ASGBD%3A_Scripts_amb_PostgreSQL"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Pr%C3%A0ctica_ASI-C6-ASGBD:_Scripts_amb_PostgreSQL&amp;action=history"/>
	<updated>2026-08-30T13:24:40Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Pr%C3%A0ctica_ASI-C6-ASGBD:_Scripts_amb_PostgreSQL&amp;diff=58130&amp;oldid=prev</id>
		<title>Joan: /* Fer els informes de vendes */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Pr%C3%A0ctica_ASI-C6-ASGBD:_Scripts_amb_PostgreSQL&amp;diff=58130&amp;oldid=prev"/>
		<updated>2011-04-29T15:11:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Fer els informes de vendes&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Objectius: Automating PostgreSQL Tasks==&lt;br /&gt;
Anem a automatitzar tasques administratives amb diferents tècniques i scripts. Concretament, utilitzaràs scripts fets amb SQL, bash i Perl, i diferents opcions de la comanda psql. Aquesta pràctica és un exemple de com els administradors de sistema i DBAs han de conèixer i no tenir por a treballar en la consola per tal d'automatitzar tasques i estalviar-se feina.&lt;br /&gt;
&lt;br /&gt;
==Desenvolupament Pràctica==&lt;br /&gt;
*http://www.onlamp.com/pub/a/onlamp/2004/12/09/pg_automation.html&lt;br /&gt;
&lt;br /&gt;
===omplir la taula PRODUCTS amb valors que vénen en format CSV===&lt;br /&gt;
Per començar a treballar, primer de tot hem de crear en el postgres la taula '''products'''. En l'exemple s'utilitza la base de dades ''postgres'' i l'usuari ''postgres''. Fés servir el script ''creacio_taula_productes.sql''.&lt;br /&gt;
&lt;br /&gt;
Ja tenim la taula. Les dades estan en el fitxer products.csv, en format CSV. En aquest cas només hi ha tres files, però n'hi podria haver centenars o milers. Per convertir el format CSV al format INSERT INTO que entén el Postgres, utilitzem un script fet amb llenguatge PERL: create_input_sql.pl. Aquest script l'integrem en el script bash ''load_new_products.sh'', de manera que ara ja tenim tot el procés: com a origen tenim el fitxer products.csv, i com a destí hem de comprovar que s'han importat les dades en la taula PRODUCTS.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo ./load_new_products.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
on s'executa la comanda:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./create_input_sql.pl products.csv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per comprovar el bon funcionament del procés podem editar els fitxer load_new_products.log i runme.postgresql.&lt;br /&gt;
&lt;br /&gt;
===Fer els informes de vendes===&lt;br /&gt;
Primer de tot, dades d'exemple per a la taula sales (vendes):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
insert into sales (first_name, last_name, city, state, zip, email_address, product_id, product_name, product_sale_date) values ('John', 'Hancock', 'Medford', 'MA', '02145', 'john_hancock@pretendmail.com', 234, 'The Signature Widget', '2004-10-13');&lt;br /&gt;
&lt;br /&gt;
insert into sales (first_name, last_name, city, state, zip, email_address, product_id, product_name, product_sale_date) values ('Bob', 'Smith', 'Boston', 'MA', '02123', 'bob_smith@pretendmail.com', 234, 'The Bigger Widget', '2004-10-14');&lt;br /&gt;
&lt;br /&gt;
insert into sales (first_name, last_name, city, state, zip, email_address, product_id, product_name, product_sale_date) values ('Jane', 'Doe', 'Somerville', 'MA', '02144', 'jane_doe@pretendmail.com', 234, 'The Nuclear Widget', '2004-10-15');&lt;br /&gt;
&lt;br /&gt;
insert into sales (first_name, last_name, city, state, zip, email_address, product_id, product_name, product_sale_date) values ('John', 'Adams', 'Cambridge', 'MA', '02122', 'john_adams@pretendmail.com', 234, 'The Beer Widget', '2004-10-16');&lt;br /&gt;
&lt;br /&gt;
insert into sales (first_name, last_name, city, state, zip, email_address, product_id, product_name, product_sale_date) values ('Joe', 'Random', 'New York', 'NY', '02122', 'john_smith@pretendmail.com', 234, 'The Stylish Widget', '2004-10-17');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ara ja podem fer els informes. Els farem amb un script on li passis dos paràmetres, les dates d'inici i fi a partir de les quals fer el report. Per exemple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./gen_sales_report_param.sh 2004/10/14 2004/10/16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
# gen_sales_report.sh&lt;br /&gt;
PGUSER=postgres&lt;br /&gt;
PGPASSWORD=postgres&lt;br /&gt;
PGHOST=localhost&lt;br /&gt;
PGPORT=5432&lt;br /&gt;
&lt;br /&gt;
export PGUSER PGPASSWORD PGHOST PGPORT&lt;br /&gt;
&lt;br /&gt;
psql --set start_date=\'$1\' \&lt;br /&gt;
     --set end_date=\'$2\' \&lt;br /&gt;
     -f generate_monthly_sales_report.postgresql sales_db&lt;br /&gt;
&lt;br /&gt;
#reset PGUSER and PGPASSWORD  &lt;br /&gt;
PGUSER=&amp;quot;&amp;quot;&lt;br /&gt;
PGPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
PGHOST=&amp;quot;&amp;quot;&lt;br /&gt;
PGPORT=&amp;quot;&amp;quot;&lt;br /&gt;
export PGUSER PGPASSWORD PGHOST PGPORT  &lt;br /&gt;
 &lt;br /&gt;
#End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on el fitxer '''generate_monthly_sales_report.postgresql''' és:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- generate_monthly_sales_report.postgresql&lt;br /&gt;
-- &lt;br /&gt;
-- Outputs one month's-worth of sales to a CSV file that&lt;br /&gt;
-- is easily imported into spreadsheet software.&lt;br /&gt;
&lt;br /&gt;
\o report.csv&lt;br /&gt;
\a&lt;br /&gt;
\f ,&lt;br /&gt;
select product_id, product_name, product_sale_date from sales where &lt;br /&gt;
product_sale_date &amp;gt;= :start_date and product_sale_date &amp;lt;= :end_date;&lt;br /&gt;
\o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L'informe que heu d'obtenir en el fitxer '''report.csv''' és similar a:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 product_id,product_name,product_sale_date&lt;br /&gt;
 234,The Big Widget,2004-10-13&lt;br /&gt;
 234,The Signature Widget,2004-10-13&lt;br /&gt;
 234,The Bigger Widget,2004-10-14&lt;br /&gt;
 234,The Nuclear Widget,2004-10-15&lt;br /&gt;
 234,The Beer Widget,2004-10-16&lt;br /&gt;
 234,The Stylish Widget,2004-10-17&lt;br /&gt;
(6 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Escollim el format CSV perquè és el format natural per importar la informació als fulls de càlcul.&lt;br /&gt;
&lt;br /&gt;
===Per acabar, cron===&lt;br /&gt;
Finalment l'execució d'aquests scripts i la generació dels informes es poden automatitzar de manera que s'executin de forma periòdic. Per exemple, un problema a plantejar seria la generació automàtica d'un informe setmanal de vendes. Hauríem de modificar el script anterior i crear una tasca '''cron''' que ens generi l'informe. Aquest, en comptes de dir-se ''report.csv'' s'hauria de dir report_ddmmyyy.csv (ddmmyyy es substitueix pel dia, mes i any).&lt;br /&gt;
&lt;br /&gt;
==Entrega==&lt;br /&gt;
Moodle&lt;br /&gt;
&lt;br /&gt;
==Recursos==&lt;br /&gt;
script '''creacio_taula_productes.sql''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
drop sequence products_row_num_seq;&lt;br /&gt;
 &lt;br /&gt;
create sequence products_row_num_seq cycle;&lt;br /&gt;
 &lt;br /&gt;
drop table products;&lt;br /&gt;
 &lt;br /&gt;
create table products (&lt;br /&gt;
  row_num int not null default nextval('products_row_num_seq'),&lt;br /&gt;
  id int primary key,&lt;br /&gt;
  name varchar(35) not null,&lt;br /&gt;
  description varchar(1024) null,&lt;br /&gt;
  price numeric(8, 2) not null);&lt;br /&gt;
 &lt;br /&gt;
comment on table products is 'Records of products sold at the bookstore.';&lt;br /&gt;
comment on column products.row_num is 'For de-duping purposes;&lt;br /&gt;
&lt;br /&gt;
drop sequence sales_row_num_seq;&lt;br /&gt;
&lt;br /&gt;
create sequence sales_row_num_seq cycle;&lt;br /&gt;
&lt;br /&gt;
drop table sales;&lt;br /&gt;
&lt;br /&gt;
create table sales (&lt;br /&gt;
  row_num int not null default nextval('sales_row_num_seq'),&lt;br /&gt;
  first_name varchar(35) not null,&lt;br /&gt;
  middle_name varchar(35) null,&lt;br /&gt;
  last_name varchar(35) not null,&lt;br /&gt;
  city varchar(35) not null,&lt;br /&gt;
  state char(2) not null,&lt;br /&gt;
  zip varchar(5) not null,&lt;br /&gt;
  email_address varchar(50) not null,&lt;br /&gt;
  product_id int not null,&lt;br /&gt;
  product_name varchar(50) not null,&lt;br /&gt;
  product_sale_date date not null);&lt;br /&gt;
&lt;br /&gt;
comment on table sales is 'Conains records of books sold from the bookstore.';&lt;br /&gt;
comment on column sales.row_num is 'For de-duping purposes.';&lt;br /&gt;
&lt;br /&gt;
-- PLEASE don't regard this as good database design; customers should be&lt;br /&gt;
-- foreign keys, as should products.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
script perl per crear els inserts de forma automàtica: '''create_input_sql.pl''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
# create_input_sql.pl --&amp;gt; Create PostgreSQL sql statements from&lt;br /&gt;
# .csv file for products table, and put them in a file called&lt;br /&gt;
# runme.postgresql.&lt;br /&gt;
&lt;br /&gt;
# by Manni Wood&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
&lt;br /&gt;
my $csv_file_name = $ARGV[0];&lt;br /&gt;
unless ($csv_file_name) {&lt;br /&gt;
    print STDERR &amp;quot;Please enter the name of a CSV file.\n&amp;quot;;&lt;br /&gt;
    print STDERR &amp;quot;Aborting.\n&amp;quot;;&lt;br /&gt;
    exit 1;&lt;br /&gt;
}&lt;br /&gt;
my $output_file_name = &amp;quot;runme.postgresql&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
open (IN, $csv_file_name) || die &amp;quot;Could not read \&amp;quot;$csv_file_name\&amp;quot;: $!&amp;quot;;&lt;br /&gt;
open (OUT, &amp;quot;&amp;gt;$output_file_name&amp;quot;) || die &amp;quot;Could not write \&amp;quot;$output_file_name\&amp;quot;: $!&amp;quot;;&lt;br /&gt;
# The first line of this file is the field names, which we do *not*&lt;br /&gt;
# want to insert into the database. So read and discard the first line.&lt;br /&gt;
$_ = &amp;lt;IN&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
# Instructions to psql to stop on the first error.&lt;br /&gt;
print OUT &amp;quot;\\set ON_ERROR_STOP 1\n&amp;quot;;&lt;br /&gt;
# Do this all as one transaction.&lt;br /&gt;
print OUT &amp;quot;begin;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
while (&amp;lt;IN&amp;gt;) {&lt;br /&gt;
    # Blank lines can creep into .csv files. Skip them.&lt;br /&gt;
    next if (m/^\s*$/);&lt;br /&gt;
    chomp;&lt;br /&gt;
    my ($id, $name, $description, $price) = parse_csv($_);&lt;br /&gt;
&lt;br /&gt;
    # Make all fields SQL-friendly&lt;br /&gt;
    $id = nullify_field($id);&lt;br /&gt;
    $name = quote_or_nullify_field($name);&lt;br /&gt;
    $description = quote_or_nullify_field($description);&lt;br /&gt;
    $price = nullify_field($price);&lt;br /&gt;
&lt;br /&gt;
    print OUT &amp;quot;insert into products (id, name, description, price) values (&amp;quot; .&lt;br /&gt;
    $id . &amp;quot;, &amp;quot; .&lt;br /&gt;
    $name . &amp;quot;, &amp;quot; .&lt;br /&gt;
    $description . &amp;quot;, &amp;quot; .&lt;br /&gt;
    $price . &amp;quot;);\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
print OUT &amp;quot;commit;\n&amp;quot;;&lt;br /&gt;
close (OUT);&lt;br /&gt;
close (IN);&lt;br /&gt;
&lt;br /&gt;
sub parse_csv {&lt;br /&gt;
    # The goal here is to just go ahead and split on commas,&lt;br /&gt;
    # and then find chunks that start with a &amp;quot; and assume that we've&lt;br /&gt;
    # broken apart a field containing commas; re-join the chunks to&lt;br /&gt;
    # the chunk beginning with &amp;quot; until we find a chunk ending with &amp;quot;.&lt;br /&gt;
    my @chunks;&lt;br /&gt;
    my $chunk;&lt;br /&gt;
    my @fields;&lt;br /&gt;
    my $field;&lt;br /&gt;
    my $line = shift;&lt;br /&gt;
&lt;br /&gt;
    @chunks = split(/,/, $line);&lt;br /&gt;
&lt;br /&gt;
    my $i;&lt;br /&gt;
    for ($i = 0; $i &amp;lt;= $#chunks; ++$i) {&lt;br /&gt;
        $chunk = $chunks[$i];&lt;br /&gt;
        $field = $chunk;&lt;br /&gt;
        # If chunk starts wtih a double-quote but does not end with one,&lt;br /&gt;
        if (substr($chunk, 0, 1) eq '&amp;quot;' &amp;amp;&amp;amp; substr($chunk, -1, 1) ne '&amp;quot;') {&lt;br /&gt;
            # join the current chunk with the next chunk, replacing the&lt;br /&gt;
            # comma that got eliminated during the split on commas&lt;br /&gt;
            ++$i;&lt;br /&gt;
            $chunk = $chunks[$i];&lt;br /&gt;
            $field .= &amp;quot;,&amp;quot; . $chunk;&lt;br /&gt;
            # and continue to do so until you find a chunk that ends with &amp;quot;&lt;br /&gt;
            # or you have run out of chunks.&lt;br /&gt;
            while (substr($chunk, -1, 1) ne '&amp;quot;' &amp;amp;&amp;amp; $i &amp;lt;= $#chunks) {&lt;br /&gt;
                ++$i;&lt;br /&gt;
                $chunk = $chunks[$i];&lt;br /&gt;
                $field .= &amp;quot;,&amp;quot; . $chunk;&lt;br /&gt;
            }&lt;br /&gt;
            # Our goal is to get rid of all field delimitors, so&lt;br /&gt;
            # get rid of the leading double-quote&lt;br /&gt;
            $field = substr($field, 1);&lt;br /&gt;
            # and the trailing double-quote.&lt;br /&gt;
            chop($field);&lt;br /&gt;
        }&lt;br /&gt;
        # If the chunk starts and ends with a double-quote,&lt;br /&gt;
        if (substr($chunk, 0, 1) eq '&amp;quot;' &amp;amp;&amp;amp; substr($chunk, -1, 1) eq '&amp;quot;') {&lt;br /&gt;
            # get rid of the leading double-quote&lt;br /&gt;
            $field = substr($field, 1);&lt;br /&gt;
            # and the trailing double-quote.&lt;br /&gt;
            chop($field);&lt;br /&gt;
        }&lt;br /&gt;
        # In CSV files, double quotes are escaped by doubling them up,&lt;br /&gt;
        # so un-double them.&lt;br /&gt;
        $field =~ s/&amp;quot;&amp;quot;/&amp;quot;/g;&lt;br /&gt;
        # Finally, we have a field that is completely usable, so add it to the&lt;br /&gt;
        # array of fields we will return at the end of this subroutine.&lt;br /&gt;
        push(@fields, $field);&lt;br /&gt;
        # Clear the field for re-use in the next iteration of this loop.&lt;br /&gt;
        $field = &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    return @fields;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub nullify_field {&lt;br /&gt;
    # For SQL fields that do not need to be wrapped in single quotes.&lt;br /&gt;
    # If a field is empty, replace it with the string &amp;quot;null&amp;quot;,&lt;br /&gt;
    # which can safely be used in sql insert statements.&lt;br /&gt;
    my $field = $_[0];&lt;br /&gt;
    if ($field) {&lt;br /&gt;
        return $field;&lt;br /&gt;
    } else {&lt;br /&gt;
        return &amp;quot;null&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub quote_or_nullify_field {&lt;br /&gt;
    # For SQL fields that need to be wrapped in single quotes.&lt;br /&gt;
    # If a field is empty, replace it with the string &amp;quot;null&amp;quot;,&lt;br /&gt;
    # which can safely be used in sql insert statements.&lt;br /&gt;
    # If it is not empty, replace any single quote with double single&lt;br /&gt;
    # quotes (that's how you escape them in SQL) and wrap the whole thing&lt;br /&gt;
    # in single quotes (for use in a SQL insert statement).&lt;br /&gt;
    my $field = $_[0];&lt;br /&gt;
    if ($field) {&lt;br /&gt;
        # Remove backslashes: they cause havoc in SQL.&lt;br /&gt;
        $field =~ s/\\//g;&lt;br /&gt;
        # Repeat single quotes: this is how they are escaped in SQL.&lt;br /&gt;
        $field =~ s/'/''/g;&lt;br /&gt;
        $field = &amp;quot;'&amp;quot; . $field . &amp;quot;'&amp;quot;;&lt;br /&gt;
    } else {&lt;br /&gt;
        $field = &amp;quot;null&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''load_new_products.sh''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
# load_new_products.sh&lt;br /&gt;
#&lt;br /&gt;
# Wrapper script that transforms products.csv into runme.postgresql&lt;br /&gt;
# and feeds runme.postgresql to psql.&lt;br /&gt;
&lt;br /&gt;
# gen_sales_report.sh&lt;br /&gt;
PGUSER=postgres&lt;br /&gt;
PGPASSWORD=postgres&lt;br /&gt;
PGHOST=localhost&lt;br /&gt;
PGPORT=5432&lt;br /&gt;
&lt;br /&gt;
export PGUSER PGPASSWORD PGHOST PGPORT&lt;br /&gt;
&lt;br /&gt;
./create_input_sql.pl products.csv  # outputs runme.postgresql&lt;br /&gt;
&lt;br /&gt;
psql -f runme.postgresql postgres 1&amp;gt; load_new_products.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
#reset PGUSER and PGPASSWORD  &lt;br /&gt;
PGUSER=&amp;quot;&amp;quot;&lt;br /&gt;
PGPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
PGHOST=&amp;quot;&amp;quot;&lt;br /&gt;
PGPORT=&amp;quot;&amp;quot;&lt;br /&gt;
export PGUSER PGPASSWORD PGHOST PGPORT  &lt;br /&gt;
 &lt;br /&gt;
#End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Script per fer els informes: '''gen_sales_report_param.sh''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
# gen_sales_report.sh&lt;br /&gt;
PGUSER=postgres&lt;br /&gt;
PGPASSWORD=postgres&lt;br /&gt;
PGHOST=localhost&lt;br /&gt;
PGPORT=5432&lt;br /&gt;
&lt;br /&gt;
export PGUSER PGPASSWORD PGHOST PGPORT&lt;br /&gt;
&lt;br /&gt;
psql --set start_date=\'$1\' \&lt;br /&gt;
     --set end_date=\'$2\' \&lt;br /&gt;
     -f report_mensual_param.sql postgres&lt;br /&gt;
&lt;br /&gt;
#reset PGUSER and PGPASSWORD  &lt;br /&gt;
PGUSER=&amp;quot;&amp;quot;&lt;br /&gt;
PGPASSWORD=&amp;quot;&amp;quot;&lt;br /&gt;
PGHOST=&amp;quot;&amp;quot;&lt;br /&gt;
PGPORT=&amp;quot;&amp;quot;&lt;br /&gt;
export PGUSER PGPASSWORD PGHOST PGPORT  &lt;br /&gt;
 &lt;br /&gt;
#End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Script '''report_mensual_param.sql''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- generate_monthly_sales_report.postgresql&lt;br /&gt;
-- &lt;br /&gt;
-- Outputs one month's-worth of sales to a CSV file that&lt;br /&gt;
-- is easily imported into spreadsheet software.&lt;br /&gt;
&lt;br /&gt;
\o report.csv&lt;br /&gt;
\a&lt;br /&gt;
\f ,&lt;br /&gt;
select product_id, product_name, product_sale_date from sales where &lt;br /&gt;
product_sale_date *gt;= '2004-10-01' and product_sale_date &amp;lt;= '2004-10-31';&lt;br /&gt;
\o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ús de l'opció \o===&lt;br /&gt;
per enviar el resultat d'una consulta a fitxer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\o [FILE]      send all query results to file or |pipe&lt;br /&gt;
postgres# \o reposrt.txt&lt;br /&gt;
postgres# \o select product_id, product_name, product_sale_date from sales where &lt;br /&gt;
product_sale_date &amp;gt;= '2004-10-01' and product_sale_date &amp;lt;= '2004-10-31';&lt;br /&gt;
postgres# \o &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per obtenir un resultat que sigui aprofitable per a Excel o OpenOffice.org:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\o report.csv&lt;br /&gt;
\a -&amp;gt; toggle between unaligned and aligned output mode&lt;br /&gt;
\f , -&amp;gt; \f [STRING]    show or set field separator for unaligned query output (en aquest cas, una coma)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres# select product_id, product_name, product_sale_date from sales where &lt;br /&gt;
product_sale_date &amp;gt;= '2004-10-01' and product_sale_date &amp;lt;= '2004-10-31';&lt;br /&gt;
postgres# \o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ús de l'opció \SET===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\set [NAME [VALUE]] -&amp;gt; set internal variable, or list all if no parameters&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Durarda==&lt;br /&gt;
2 hores&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>