Subject | Re: [firebird-support] Dynamic ORDER BY in SP |
---|---|
Author | Helen Borrie |
Post date | 2007-01-09T21:22:44Z |
At 06:30 AM 10/01/2007, you wrote:
the structure of a DSQL specification....so you can't have a
replaceable output list or ordering or grouping criterion. You can
parameterise WHERE criteria only.
In Fb 1.5 and higher you can construct the entire SELECT statement as
a string and pass that string to EXECUTE STATEMENT. You can
alternatively do what we used to do before we had EXECUTE
STATEMENT: branch your procedure according to the value of some
input argument and write conditional SELECT statements. This
obviously requires you to restrict the allowable values of this input
variable to a condition that your procedure can handle.
specifying a derived output field that is created from an
expression. In v.1.5 you have to use the degree number (position
number) in the ORDER BY clause, or otherwise restate the
expression. (If you are using an alias merely to rename the column,
then you should specify the ordering on the qualified actual column
identifier or the degree number, since there is no expression to restate...)
In v.2.0, you can use the alias identifier directly in the Order By clause.
./heLen
>Hi All,Not possible to do it this way. You can't pass parameters that alter
>
>I would like to be able to pass in an IN_ORDER_BY parameter into the
>SP and have it sort the resultset based on that parameter.
>
>My SP(simplified version):
>
>CREATE PROCEDURE GET_DATA(
> IN_USER_ID integer,
> IN_ORDER_BY varchar(32)
>)
>RETURNS (
> OUT_NAME varchar(256) character set unicode_fss,
> OUT_SIZE integer
>)
>AS
>BEGIN
> FOR
> SELECT
> D.DIR_NAME ITEM_NAME,
> 0 ITEM_SIZE
> FROM DIRS D
> WHERE D.USER_ID = :IN_USER_ID
> ORDER BY :IN_ORDER_BY
> INTO
> OUT_NAME,
> OUT_SIZE
> DO
> BEGIN
> SUSPEND;
> END
>END
the structure of a DSQL specification....so you can't have a
replaceable output list or ordering or grouping criterion. You can
parameterise WHERE criteria only.
In Fb 1.5 and higher you can construct the entire SELECT statement as
a string and pass that string to EXECUTE STATEMENT. You can
alternatively do what we used to do before we had EXECUTE
STATEMENT: branch your procedure according to the value of some
input argument and write conditional SELECT statements. This
obviously requires you to restrict the allowable values of this input
variable to a condition that your procedure can handle.
>Is it possible to get something like this to work:Sure, using one of the approaches mentioned above.
> execute procedure GET_DATA(1, 'ITEM_NAME DESC');
> execute procedure GET_DATA(1, 'ITEM_NAME DESC, ITEM_SIZE ASC');
>I need to be able to ORDER BY column aliases(ITEM_NAME) and not theThat's a different issue. When you alias a column, you are
>actual columns(D.DIR_NAME).
specifying a derived output field that is created from an
expression. In v.1.5 you have to use the degree number (position
number) in the ORDER BY clause, or otherwise restate the
expression. (If you are using an alias merely to rename the column,
then you should specify the ordering on the qualified actual column
identifier or the degree number, since there is no expression to restate...)
In v.2.0, you can use the alias identifier directly in the Order By clause.
./heLen