PostgreSQL/Postgre SQL/ROWTYPE — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
Admin (обсуждение | вклад) м (1 версия) |
(нет различий)
|
Текущая версия на 13:13, 26 мая 2010
ROWTYPE assign through "select into"
<source lang="sql">
postgres=# postgres=# postgres=# CREATE TABLE employee ( postgres(# ID int, postgres(# name varchar(10), postgres(# salary real, postgres(# start_date date, postgres(# city varchar(10), postgres(# region char(1) postgres(# ); CREATE TABLE postgres=# postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (1, "Jason", 40420, "02/01/94", "New York", "W"); INSERT 0 1 postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (2, "Robert",14420, "01/02/95", "Vancouver","N"); INSERT 0 1 postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (3, "Celia", 24020, "12/03/96", "Toronto", "W"); INSERT 0 1 postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (4, "Linda", 40620, "11/04/97", "New York", "N"); INSERT 0 1 postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (5, "David", 80026, "10/05/98", "Vancouver","W"); INSERT 0 1 postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (6, "James", 70060, "09/06/99", "Toronto", "N"); INSERT 0 1 postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (7, "Alison",90620, "08/07/00", "New York", "W"); INSERT 0 1 postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (8, "Chris", 26020, "07/08/01", "Vancouver","N"); INSERT 0 1 postgres=# insert into employee (ID, name, salary, start_date, city, region) postgres-# values (9, "Mary", 60020, "06/09/02", "Toronto", "W"); INSERT 0 1 postgres=# postgres=# select * from employee;
id | name | salary | start_date | city | region
+--------+--------+------------+-----------+--------
1 | Jason | 40420 | 1994-02-01 | New York | W 2 | Robert | 14420 | 1995-01-02 | Vancouver | N 3 | Celia | 24020 | 1996-12-03 | Toronto | W 4 | Linda | 40620 | 1997-11-04 | New York | N 5 | David | 80026 | 1998-10-05 | Vancouver | W 6 | James | 70060 | 1999-09-06 | Toronto | N 7 | Alison | 90620 | 2000-08-07 | New York | W 8 | Chris | 26020 | 2001-07-08 | Vancouver | N 9 | Mary | 60020 | 2002-06-09 | Toronto | W
(9 rows) postgres=# postgres=# CREATE FUNCTION "get_data" (integer) RETURNS text AS " postgres"# DECLARE postgres"# -- Declare an alias for the function argument, postgres"# eid ALIAS FOR $1; postgres"# found_employee employee%ROWTYPE; postgres"# BEGIN postgres"# SELECT INTO found_employee * FROM employee WHERE id = eid; postgres"# RETURN found_employee.name || "" "" || found_employee.city; postgres"# END; postgres"# " LANGUAGE "plpgsql"; CREATE FUNCTION postgres=# postgres=# select get_data(id) from employee;
get_data
Jason New York Robert Vancouver Celia Toronto Linda New York David Vancouver James Toronto Alison New York Chris Vancouver Mary Toronto
(9 rows) postgres=# postgres=# drop function get_data (integer); DROP FUNCTION postgres=# drop table employee; DROP TABLE postgres=# postgres=# postgres=#
</source>
Using the FOR loop with %ROWTYPE
<source lang="sql">
postgres=# postgres=# postgres=# CREATE TABLE "books" ( postgres(# "id" integer NOT NULL, postgres(# "title" text NOT NULL, postgres(# "author_id" integer, postgres(# "subject_id" integer, postgres(# Constraint "books_id_pkey" Primary Key ("id") postgres(# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "books_id_pkey" for table "books" CREATE TABLE postgres=# postgres=# postgres=# insert into books values (7808, "Java", 4156, 9); INSERT 0 1 postgres=# insert into books values (4513, "Javascript", 1866, 15); INSERT 0 1 postgres=# insert into books values (4267, "C#", 2001, 15); INSERT 0 1 postgres=# insert into books values (1608, "Oracle", 1809, 2); INSERT 0 1 postgres=# insert into books values (1590, "Sql Server", 1809, 2); INSERT 0 1 postgres=# insert into books values (25908, "Postgre SQL", 15990, 2); INSERT 0 1 postgres=# insert into books values (1501, "Python", 2031, 2); INSERT 0 1 postgres=# insert into books values (190, "Java by API", 16, 6); INSERT 0 1 postgres=# insert into books values (1234, "2D", 25041, 3); INSERT 0 1 postgres=# insert into books values (2038, "C", 1644, 0); INSERT 0 1 postgres=# insert into books values (156, "C++", 115, 9); INSERT 0 1 postgres=# insert into books values (41473, "Programming Python", 7805, 4); INSERT 0 1 postgres=# insert into books values (41477, "Learning Python", 7805, 4); INSERT 0 1 postgres=# insert into books values (41478, "Perl Cookbook", 7806, 4); INSERT 0 1 postgres=# insert into books values (41472, "Practical PostgreSQL", 1212, 4); INSERT 0 1 postgres=# postgres=# select * from books;
id | title | author_id | subject_id
+----------------------+-----------+------------
7808 | Java | 4156 | 9 4513 | Javascript | 1866 | 15 4267 | C# | 2001 | 15 1608 | Oracle | 1809 | 2 1590 | Sql Server | 1809 | 2 25908 | Postgre SQL | 15990 | 2 1501 | Python | 2031 | 2 190 | Java by API | 16 | 6 1234 | 2D | 25041 | 3 2038 | C | 1644 | 0 156 | C++ | 115 | 9 41473 | Programming Python | 7805 | 4 41477 | Learning Python | 7805 | 4 41478 | Perl Cookbook | 7806 | 4 41472 | Practical PostgreSQL | 1212 | 4
(15 rows) postgres=# postgres=# postgres=# -- Using the FOR loop with %ROWTYPE postgres=# postgres=# CREATE FUNCTION extract_title (integer) RETURNS text AS " postgres"# DECLARE postgres"# postgres"# -- Declare an alias for function argument. postgres"# sub_id ALIAS FOR $1; postgres"# postgres"# -- Declare a variable to hold book titles and set its default postgres"# -- value to a new line. postgres"# text_output TEXT :=""\n""; postgres"# postgres"# -- Declare a variable to hold rows from the postgres"# -- books table. postgres"# row_data books%ROWTYPE; postgres"# postgres"# BEGIN postgres"# postgres"# -- Iterate through the results of a query. postgres"# FOR row_data IN SELECT * FROM books postgres"# WHERE subject_id = sub_id ORDER BY title LOOP postgres"# postgres"# -- Insert the title of a matching book into the text_output variable. postgres"# text_output := text_output || row_data.title || ""\n""; postgres"# END LOOP; postgres"# postgres"# -- Return the list of books. postgres"# RETURN text_output; postgres"# END; postgres"# " LANGUAGE "plpgsql"; ERROR: function "extract_title" already exists with same argument types postgres=# postgres=# postgres=# SELECT extract_title(2);
extract_title
Sql Server
(1 row) postgres=# postgres=# postgres=# drop table books; DROP TABLE postgres=# postgres=#
</source>
Using the %ROWTYPE attribute
<source lang="sql">
postgres=# postgres=# postgres=# CREATE TABLE "authors" ( postgres(# "id" integer NOT NULL, postgres(# "last_name" text, postgres(# "first_name" text, postgres(# Constraint "authors_pkey" Primary Key ("id") postgres(# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "authors_pkey" for table "authors" CREATE TABLE postgres=# postgres=# postgres=# insert into authors values (1111, "Martin", "Jason"); INSERT 0 1 postgres=# insert into authors values (1212, "Worsley", "Robert"); INSERT 0 1 postgres=# insert into authors values (15990, "Mathews", "John"); INSERT 0 1 postgres=# insert into authors values (25041, "Smith", "Williams"); INSERT 0 1 postgres=# insert into authors values (16, "Alcott", "May"); INSERT 0 1 postgres=# insert into authors values (4156, "King", "Stephen"); INSERT 0 1 postgres=# insert into authors values (1866, "Herbert", "Margaret"); INSERT 0 1 postgres=# insert into authors values (1644, "Hogarth", "Celia"); INSERT 0 1 postgres=# insert into authors values (2031, "Brown", "Wise"); INSERT 0 1 postgres=# insert into authors values (115, "Poe", "Allen"); INSERT 0 1 postgres=# insert into authors values (7805, "Lutz", "Mark"); INSERT 0 1 postgres=# insert into authors values (7806, "Rice", "Tom"); INSERT 0 1 postgres=# insert into authors values (1533, "Black", "Chris"); INSERT 0 1 postgres=# insert into authors values (1717, "Brite", "Linda"); INSERT 0 1 postgres=# insert into authors values (2112, "Larry", "Edward"); INSERT 0 1 postgres=# insert into authors values (2001, "Clarke", "Alison"); INSERT 0 1 postgres=# insert into authors values (1213, "Green", "Mary"); INSERT 0 1 postgres=# postgres=# select * from authors;
id | last_name | first_name
+-----------+------------
1111 | Martin | Jason 1212 | Worsley | Robert 15990 | Mathews | John 25041 | Smith | Williams 16 | Alcott | May 4156 | King | Stephen 1866 | Herbert | Margaret 1644 | Hogarth | Celia 2031 | Brown | Wise 115 | Poe | Allen 7805 | Lutz | Mark 7806 | Rice | Tom 1533 | Black | Chris 1717 | Brite | Linda 2112 | Larry | Edward 2001 | Clarke | Alison 1213 | Green | Mary
(17 rows) postgres=# postgres=# postgres=# postgres=# -- Using the %ROWTYPE attribute postgres=# postgres=# CREATE FUNCTION get_author (integer) RETURNS text AS " postgres"# DECLARE postgres"# postgres"# -- Declare an alias for the function argument, postgres"# -- which should be the id of the author. postgres"# author_id ALIAS FOR $1; postgres"# postgres"# found_author authors%ROWTYPE; postgres"# postgres"# BEGIN postgres"# SELECT INTO found_author * FROM authors WHERE id = author_id; postgres"# postgres"# -- Return the first postgres"# RETURN found_author.first_name || "" "" || found_author.last_name; postgres"# postgres"# END; postgres"# " LANGUAGE "plpgsql"; CREATE FUNCTION postgres=# postgres=# -- Results of the new get_author() function postgres=# postgres=# SELECT get_author(1212);
get_author
Robert Worsley
(1 row) postgres=# postgres=# postgres=# drop table authors; DROP TABLE postgres=# postgres=#
</source>