Kapoor, Nishikant wrote:

> [Sorry for cross-posting.]
>
> This is in continuation with the above mentioned subject - I am trying to
> find the 'display data order' for the returned resultset. The following
> thread very well answers my question:
>
>  http://lists.mysql.com/mysql/185626
>
> a) SET @row=0;
> b) SELECT (@row:[EMAIL PROTECTED]) AS row, ename, empno FROM emp ORDER BY 
empno;
>
> +-----+--------+-------+
> | row | ename  | empno |
> +-----+--------+-------+
> |   1 | SMITH  |  7369 |
> |   2 | ALLEN  |  7499 |
> |   3 | WARD   |  7521 |
> |   4 | JONES  |  7566 |
> |   5 | MARTIN |  7654 |
> +-----+--------+-------+
>
> However, I am trying to use it in a perl script instead of from command
> line, and I am not sure how exactly to do it. I need to execute both
> statements a & b together ...

You cannot execute them together. You must execute them one at a time, in the same connection.

> ... or else I get
>
> +-----+--------+-------+
> | row | ename  | empno |
> +-----+--------+-------+
> |NULL | SMITH  |  7369 |
> |NULL | ALLEN  |  7499 |
> |NULL | WARD   |  7521 |
> |NULL | JONES  |  7566 |
> |NULL | MARTIN |  7654 |
> +-----+--------+-------+

If you are getting this, you've made a mistake in your perl code. It's hard to say what, though, as you haven't shown us your code.

Hmmm. User variables are connection specific. Are you making the mistake of opening and closing a connection for each query? That's unneccessary, and it adds a lot of overhead.

> How can I execute both (a) and (b) in my perl script?

The same way you would execute any two statements, one at a time.  Something 
like:

  $conn->do('SET @row=0');
  my $sql = 'SELECT @row:[EMAIL PROTECTED] as row, <fields> FROM <tables> WHERE 
...';
  my $sth = $conn->prepare($sql);
  $sth->execute();
  return $sth->fetchall_arrayref( {} );

> Thanks for any help.
> Nishi

Mathias wrote:

> Hi,
> You don"t need to use @row in perl,
> just use :
>
> $n=0;
> while (fetch..) {
> $n++;
> print "$n"."$ename ...\n";
>
> }

That would work.

Kapoor, Nishikant wrote:

> I could, but I am assigning the entire resultset in one shot to another
> construct as follows:
>
> my $str  = "SELECT [EMAIL PROTECTED]:[EMAIL PROTECTED] as row, <fields> FROM 
<tables> WHERE ...";
> my $sth = $conn->prepare($st);
> $sth->execute();
> return $sth->fetchall_arrayref( {} );
>
> Thanks,
> -Nishi

You are returning an arrayref! One row in your results equals one row in your array -- in the same order! Arrays are indexed, so display data order is already built into your array. Display position = array position + 1. Why do you need a redundant field in each row?

Harald Fuchs wrote:

> Just change the last line to
>
>   my $n = 0;
>   return [ map { [ ++$n, @$_ ] } @{$sth->fetchall_arrayref} ];
>
> What's the problem?

Are you sure?  I get "Can't coerce array into hash at...".

Mathias wrote:

> Then alter your table to add an auto_increment column, update it and play
> your query without @row.
>
> Mathias

No, no, no! This is what we call using a shotgun to kill a gnat. It also doesn't yield the order of the query results.

Michael

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to