Through rowsets
---------------
Key: CORE-5583
URL: http://tracker.firebirdsql.org/browse/CORE-5583
Project: Firebird Core
Issue Type: New Feature
Components: API / Client Library, Engine
Reporter: Denis
Through rowsets
Requirements:
* Through rowset must have 64-bit integer identifier
(further "ROWSET_ID") representing it;
* Manipulations with a through rowset are allowed within
the BEGIN...END block only;
* Through rowset can be used as parameter in invokes
and returns of stored procedures and/or execute blocks
by own ROWSET_ID only;
* The lifetime of through rowset depends on method
and location of the declaration;
* Through rowset (own ROWSET_ID) can be checked for NULL
or rowset can be cleared by assignment ROWSET_ID to NULL;
* Through rowset can be assigned to another through rowset
with same domain by operator "=" and in this case,
another rowset will get a copy of data and new ROWSET_ID;
Futures:
* Reducing the overhead of transfer rowsets in/from SP or EB
as opposing of transfer by SUSPEND and recursive invokes
of stored procedure;
* Using non-overlapping rowsets with same name as opposing
of temporary tables;
================================================
Defenition sintax of domain that can be used
to transaction-wide through rowset declaration:
================================================
CREATE DOMAIN <through_rowset_domain_name>
AS ROWSET (<temporary_table-like_fields_&_constraints_definition>);
================================================
Instance declaration sintax of through rowset in
stored procedure, trigger or execute block, that
can be used for transaction-wide through rowsets:
================================================
DECLARE VARIABLE <through_rowset_name> <through_rowset_domain_name>;
Example:
--------
CREATE DOMAIN SomeRowsetDomain
AS ROWSET
(
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(200) NOT NULL UNIQUE
);
SET TERM ^;
CREATE OR ALTER PROCEDURE procCalc
(
someRowset SomeRowsetDomain
)
AS
BEGIN
-- change the through rowset "someRowset"
END^
SET TERM ;^
SET TERM ^;
CREATE OR ALTER PROCEDURE procResult
(
someRowset SomeRowsetDomain
)
RETURNS
(
id INTEGER,
name VARCHAR(200)
)
AS
BEGIN
EXECUTE PROCEDURE procCalc (:someRowset);
FOR
SELECT id, name
FROM :someRowset
ORDER BY id
INTO: id, name
DO
SUSPEND;
END^
SET TERM ^;
-- through rowset initialization
EXECUTE BLOCK
(
id INTEGER NOT NULL,
name VARCHAR(200) NOT NULL
)
RETURNS
(
-- return ROWSET_ID to client
someRowset SomeRowsetDomain
)
AS
BEGIN
INSERT INTO :someRowset (id, name) VALUES (:id, :name);
END
-- Multiple execution of client's query in same transaction
-- to fill the through rowset by ROWSET_ID.
-- Client can use this to manually fill the through rowset
-- from a UI grid
EXECUTE BLOCK
(
someRowset SomeRowsetDomain NOT NULL,
id INTEGER NOT NULL,
name VARCHAR(200) NOT NULL
)
AS
BEGIN
INSERT INTO :someRowset (id, name) VALUES (:id, :name);
END
-- Obtaining the result
SELECT * FROM procResult(:someRowset)
or
EXECUTE BLOCK
(
someRowset SomeRowsetDomain
)
RETURNS
(
id INTEGER,
name VARCHAR(200)
)
AS
BEGIN
EXECUTE PROCEDURE procCalc (:someRowset);
FOR
SELECT id, name
FROM :someRowset
ORDER BY id
INTO: id, name
DO
SUSPEND;
END
================================================
Instance declaration sintax of through rowset in
stored procedure, trigger or execute block, that
can be used for Trigger/EB/SP-wide through rowsets.
In this case, through rowset can not be used as
input/output parameter and it's lifetime limited
by a runtime of SP/EB/Trigger (similar to cursor)
================================================
DECLARE VARIABLE <through_rowset_name>
AS ROWSET (<temporary_table-like_fields_&_constraints_definition>);
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Firebird-Devel mailing list, web interface at
https://lists.sourceforge.net/lists/listinfo/firebird-devel