Обсуждение: Re: Simple, but VERYuseful enhancement for psql command - or am I

Поиск
Список
Период
Сортировка

Re: Simple, but VERYuseful enhancement for psql command - or am I

От
Nick Barr
Дата:
Ben wrote:
> I'm designing a fairly involved database system. As part fo the process, I
> use the \i [FILE] command a great deal. I set up fairly involved queries,
> sometimes simply for the purpose of shortening column names so the output
> is reasonable. For example:
>
> SELECT longname AS abbr,othername as "V" FROM table WHERE how;
>
> ...a bunch of these can result in a single-line output on the console,
> which is a lot easier to deal with than a dump of the actual field names
> which wraps around and makes you scroll back and forth trying to line up
> the names with the values.
>
> Now, in my case, I'm dealing with specific orders. So the WHERE clause
> might be:
>
> ...WHERE zorder=104788;
>
> Which works fine. But, I have to edit the file every time I'm working with
> a different order, which is repetative and annoying, something computers
> are supposed to save us from. :)
>
> However, you can't leave it out; \i [FILE] expects the query to be
> complete, ready to go to the server. As far as I can tell.
>
> So - how about a command to read a file into the input lines withOUT
> sending it yet, so that its ready to type the last part, such as:
>
>    104788;
>
> In other words, the file would end here:
>
> ...WHERE zorder=104788;
>                ^
>                |
>                |
> ...then I could just type the number, hit enter, and off it would go.
>
> Or even if it has to be complete, right now, you can use \i [FILE] and it
> runs, but you can't edit the thing with the line review editing tools...
> it shows the \i [FILE] command, not what the command read. That would work
> too, even if it caused a dummy read the first time you used it.
>
> Input, anyone?
>
> --Ben
>

I am not sure about this exactly, but a workaround could be using
temporary sequences. I use these a lot in some of my more involved DB
setup scripts.

So for instance in the top level file you have:

-------------------
CREATE SEQUENCE temp_zorder_num_seq;
SELECT setval('temp_zorder_num_seq', 104788);

\i Somefile.sql

DROP SEQUENCE
-------------------

The in any \i file you can just use:

-------------------
INSERT INTO some_table (zorder_num, ...) VALUES
(currval('temp_zorder_num_seq'), ...);
-------------------

All you have to change is the setval at the top of the script. Make sure
you drop the sequences though ;-).


HTH

Nick


Re: Simple,

От
"John Sidney-Woollett"
Дата:
Better would be to match Oracle's sqlPlus feature, DEFINE.

The gist of which is that you can create a SQL statement with an "&" (or
other 'defined' character) in it. If DEFINE is ON, then the interpreter
prompts you for the value when it encounters the "&". After getting the
value it then processes the SQL statement.

Here is an example using sqlPlus:

SQL*Plus: Release 9.2.0.1.0 - Production on Fri Feb 27 14:11:18 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Connected to:
Oracle9i Release 9.2.0.1.0 - Production
JServer Release 9.2.0.1.0 - Production

SQL> select wdresourceid from wdresource where wdresourceid = &my_res_id;
Enter value for my_res_id: 615
old   1: select wdresourceid from wdresource where wdresourceid = &my_res_id
new   1: select wdresourceid from wdresource where wdresourceid = 615

WDRESOURCEID
------------
         615

SQL> select wdresourceid from wdresource where wdresourceid = &my_res_id;
Enter value for my_res_id: 1
old   1: select wdresourceid from wdresource where wdresourceid = &my_res_id
new   1: select wdresourceid from wdresource where wdresourceid = 1

no rows selected

You also need the ability to switch off the DEFINE operation in case you
are using a SQL script which contains "&" characters which you don't want
the interpreter to treat as a define.

This would be a cool and useful feature, if it could be implemented in
psql...

John Sidney-Woollett

SQL>
Nick Barr said:
> Ben wrote:
>> I'm designing a fairly involved database system. As part fo the process,
>> I
>> use the \i [FILE] command a great deal. I set up fairly involved
>> queries,
>> sometimes simply for the purpose of shortening column names so the
>> output
>> is reasonable. For example:
>>
>> SELECT longname AS abbr,othername as "V" FROM table WHERE how;
>>
>> ...a bunch of these can result in a single-line output on the console,
>> which is a lot easier to deal with than a dump of the actual field names
>> which wraps around and makes you scroll back and forth trying to line up
>> the names with the values.
>>
>> Now, in my case, I'm dealing with specific orders. So the WHERE clause
>> might be:
>>
>> ...WHERE zorder=104788;
>>
>> Which works fine. But, I have to edit the file every time I'm working
>> with
>> a different order, which is repetative and annoying, something computers
>> are supposed to save us from. :)
>>
>> However, you can't leave it out; \i [FILE] expects the query to be
>> complete, ready to go to the server. As far as I can tell.
>>
>> So - how about a command to read a file into the input lines withOUT
>> sending it yet, so that its ready to type the last part, such as:


Re: Simple, but VERYuseful enhancement for psql command - or am I

От
Jeff Eckermann
Дата:
--- Nick Barr <nicky@chuckie.co.uk> wrote:
> Ben wrote:
> > I'm designing a fairly involved database system.
> As part fo the process, I
> > use the \i [FILE] command a great deal. I set up
> fairly involved queries,
> > sometimes simply for the purpose of shortening
> column names so the output
> > is reasonable. For example:
> >
> > SELECT longname AS abbr,othername as "V" FROM
> table WHERE how;
> >
> > ...a bunch of these can result in a single-line
> output on the console,
> > which is a lot easier to deal with than a dump of
> the actual field names
> > which wraps around and makes you scroll back and
> forth trying to line up
> > the names with the values.

"man psql" is a good thing.  Especially the section on
variables, in Ben's case.  In summary, you can set a
variable in a psql session by "\set variablename
value", and refer to it in a query by ":variablename".
 This works for any value or identifier, i.e. psql
substitutes the variable value for the name before
sending the sql to the backend.  Works when used in
script files too.  I have used this a lot, and it's
handy.

Also, you may want to look at the "\x" command, and
its variations.  This will output column name/value
pairs down the page, which can be handy for viewing
large records.

> >
> > Now, in my case, I'm dealing with specific orders.
> So the WHERE clause
> > might be:
> >
> > ...WHERE zorder=104788;
> >
> > Which works fine. But, I have to edit the file
> every time I'm working with
> > a different order, which is repetative and
> annoying, something computers
> > are supposed to save us from. :)
> >
> > However, you can't leave it out; \i [FILE] expects
> the query to be
> > complete, ready to go to the server. As far as I
> can tell.
> >
> > So - how about a command to read a file into the
> input lines withOUT
> > sending it yet, so that its ready to type the last
> part, such as:
> >
> >    104788;
> >
> > In other words, the file would end here:
> >
> > ...WHERE zorder=104788;
> >                ^
> >                |
> >                |
> > ...then I could just type the number, hit enter,
> and off it would go.
> >
> > Or even if it has to be complete, right now, you
> can use \i [FILE] and it
> > runs, but you can't edit the thing with the line
> review editing tools...
> > it shows the \i [FILE] command, not what the
> command read. That would work
> > too, even if it caused a dummy read the first time
> you used it.
> >
> > Input, anyone?
> >
> > --Ben
> >
>
> I am not sure about this exactly, but a workaround
> could be using
> temporary sequences. I use these a lot in some of my
> more involved DB
> setup scripts.
>
> So for instance in the top level file you have:
>
> -------------------
> CREATE SEQUENCE temp_zorder_num_seq;
> SELECT setval('temp_zorder_num_seq', 104788);
>
> \i Somefile.sql
>
> DROP SEQUENCE
> -------------------
>
> The in any \i file you can just use:
>
> -------------------
> INSERT INTO some_table (zorder_num, ...) VALUES
> (currval('temp_zorder_num_seq'), ...);
> -------------------
>
> All you have to change is the setval at the top of
> the script. Make sure
> you drop the sequences though ;-).
>
>
> HTH
>
> Nick
>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
>                http://archives.postgresql.org


__________________________________
Do you Yahoo!?
Get better spam protection with Yahoo! Mail.
http://antispam.yahoo.com/tools