Обсуждение: Inserting Using RowType

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

Inserting Using RowType

От
Greg Lindstrom
Дата:
Is it possible to INSERT data into a table using a rowtype data type?  I
have a long (~5000 byte, 300 field) record *which I did not design* that
needs to be loaded into a table.  In my plsql function I accept a line
from a data file.  I have declared a ib837 variable to be of
my_table%rowtype and go about assigning each field to the ib837 record
using substr on the input field (yes, that's 329 rows, sigh).  What I
would then like to do is:

INSERT INTO my_table ib837;

Where the ib837 is of type my_table%rowtype.  Is this possible?  Is
there another -- easier/better -- way to load these record into the
table?  The input record is fixed-width, though it does not contain all
of the fields in the table (I add a timestamp and an id column).

Thanks for your help,
--greg

--
Greg Lindstrom               501 975.4859 (office)
Senior Programmer            501 219-4455 (fax)
NovaSys Health               greg.lindstrom@novasyshealth.com
Little Rock, Arkansas

"We are the music makers, and we are the dreamers of dreams."  W.W.


Re: Inserting Using RowType

От
John DeSoi
Дата:
On Apr 27, 2005, at 12:19 PM, Greg Lindstrom wrote:

> What I would then like to do is:
>
> INSERT INTO my_table ib837;
>
> Where the ib837 is of type my_table%rowtype.  Is this possible?  Is
> there another -- easier/better -- way to load these record into the
> table?  The input record is fixed-width, though it does not contain
> all of the fields in the table (I add a timestamp and an id column).
>


ib837 does have all the fields of my_table if you defined it as
my_table%rowtype (even if you did not assign them all). So you could
use this:

INSERT INTO my_table VALUES (ib837.*);


John DeSoi, Ph.D.
http://pgedit.com/
Power Tools for PostgreSQL


Re: Inserting Using RowType

От
Michael Fuhr
Дата:
On Wed, Apr 27, 2005 at 11:19:04AM -0500, Greg Lindstrom wrote:
>
> Is it possible to INSERT data into a table using a rowtype data type?  I
> have a long (~5000 byte, 300 field) record *which I did not design* that
> needs to be loaded into a table.  In my plsql function I accept a line
> from a data file.  I have declared a ib837 variable to be of
> my_table%rowtype and go about assigning each field to the ib837 record
> using substr on the input field (yes, that's 329 rows, sigh).  What I
> would then like to do is:
>
> INSERT INTO my_table ib837;

PostgreSQL 8.0 has better support for composite types than previous
versions.  For example, the following works for me in 8.0.2:

INSERT INTO my_table VALUES (ib837.*);

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

Re: Inserting Using RowType

От
Tom Lane
Дата:
Greg Lindstrom <greg.lindstrom@novasyshealth.com> writes:
> What I would then like to do is:

> INSERT INTO my_table ib837;

The trick is to get it to "burst" the rowtype value into separate columns.
I don't think you could get it to do that before 8.0, but this works
as of 8.0:

regression=# \d int8_tbl
   Table "public.int8_tbl"
 Column |  Type  | Modifiers
--------+--------+-----------
 q1     | bigint |
 q2     | bigint |

regression=# create function foo(bigint,bigint) returns void as $$
regression$# declare myrow int8_tbl;
regression$# begin
regression$#   myrow.q1 = $1;
regression$#   myrow.q2 = $2;
regression$#   insert into int8_tbl select (x).* from (select myrow as x) ss;
regression$#   return;
regression$# end$$ language plpgsql;
CREATE FUNCTION

            regards, tom lane

Re: Inserting Using RowType

От
Tom Lane
Дата:
Michael Fuhr <mike@fuhr.org> writes:
> PostgreSQL 8.0 has better support for composite types than previous
> versions.  For example, the following works for me in 8.0.2:

> INSERT INTO my_table VALUES (ib837.*);

Ya know, for some reason I was convinced that wouldn't work, but it
does ... certainly a lot cleaner than the hack I just posted ...

            regards, tom lane

Re: Inserting Using RowType

От
Michael Fuhr
Дата:
On Wed, Apr 27, 2005 at 02:08:33PM -0400, Tom Lane wrote:
> Michael Fuhr <mike@fuhr.org> writes:
> >
> > INSERT INTO my_table VALUES (ib837.*);
>
> Ya know, for some reason I was convinced that wouldn't work, but it
> does ... certainly a lot cleaner than the hack I just posted ...

Hmmm...so does it work by design or by accident?  I assume that if
it were by accident, your response would have been "Yeah, but...."

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

Re: Inserting Using RowType

От
Tom Lane
Дата:
Michael Fuhr <mike@fuhr.org> writes:
> On Wed, Apr 27, 2005 at 02:08:33PM -0400, Tom Lane wrote:
>> Michael Fuhr <mike@fuhr.org> writes:
>>> INSERT INTO my_table VALUES (ib837.*);
>>
>> Ya know, for some reason I was convinced that wouldn't work, but it
>> does ... certainly a lot cleaner than the hack I just posted ...

> Hmmm...so does it work by design or by accident?  I assume that if
> it were by accident, your response would have been "Yeah, but...."

No, it's by design --- in fact now I remember having made it happen
in 8.0.  But the ol hindbrain was remembering how things Used Ta Be.

            regards, tom lane