...will display single row. But TIBQuery will return null dataset (even without field names).And TIBQuery does it the correct way.
I haven't tested these codes themselves. But other codes work in that way. I think writing stored procedures in the second way is better for (possible) later compatibility.The correct way is to work with suspend. That's not just a compatibility issue, that's the correct way.
Use SUSPEND to return a row of data from a procedure to its caller.
If you write a SELECT that should return some rows, you need to use the same syntax as with stored procedures. That means that you must declare the columns in RETURNS clause, use INTO or assignment to supply values to those fields and use SUSPEND to inform the client that record is available.