|
Тема
|
Firebird процедура SELECT * ...
|
|
Автор | Maнoл4o (Нерегистриран) |
Публикувано | 09.05.06 08:59 |
|
Здравейте
Има ли начин да се направи процедура във Firebird която прави SELECT * FROM tableName, а не да се изброяват колоните от таблицата.
Благодаря
| |
Тема
|
Re: Firebird процедура SELECT * ...
[re: Maнoл4o]
|
|
Автор |
NickBass (бас-програмист) |
Публикувано | 09.05.06 09:32 |
|
В PSQL, select заявката задължава използването на INTO:
for select
invoce_no, invoice_date
from
invoices
where
cust_id = :cust_id
into
:inv_no, :inv_date
do
suspend;
Ако PSQL допускаше * и ти връщаше колоните по реда на позицията в таблицата, помисли какво ще се получи при промяна на позициите на колоните в таблицата.

| |
Тема
|
Re: Firebird процедура SELECT * ...
[re: NickBass]
|
|
Автор | Maнoл4o (Нерегистриран) |
Публикувано | 09.05.06 09:54 |
|
Ами в MSSQL и MySQL е допустимо използването на SELECT *.
Не разбирам защо това е проблем тук. А и кои ще тръгне да размества колоните еи така.
А всъщност SELECT * FROM tableName си работи нормално когато не е в процедура.
Би ли дал малко пояснения?
Благодаря
| |
Тема
|
Re: Firebird процедура SELECT * ...
[re: Maнoл4o]
|
|
Автор |
NickBass (бас-програмист) |
Публикувано | 09.05.06 12:09 |
|
Не мога да кажа как стоят нещата в MySQL и MSSQL. Мога само да предполагам, че ако позволяват SELECT * FROM ... в сторната процедура, то тогава самата процедура трябва да позволява връщане на променлив брой колони например.
Иначе опасността от грешката в примера, който ти дадох е реална. Да се разместят местата на колоните въобще не е рядкост, особено ако дадена БД се поддържа от повече девелопери. Прост пример е с отпадането на данъчния номер. Понеже не е необходим вече, някой може да го дропне като колона или просто да го премести най-отдолу хем да не му се пречка, хем да не го трие от всички заявки където фигурира... Нали се сещаш...
---------------------
А всъщност SELECT * FROM tableName си работи нормално когато не е в процедура.
---------------------
Да работи, защото има разлика в синтаксиса и предназначението на PSQL (Procedure SQL) и ISQL. Твоят пример е ISQL заявка, която приложението ти изпраща към сървъра, докато при процедурите и тригерите важат правилата на PSQL. При Firebird концепцията е такава, че PSQL не позволява * в SELECT заявка. Така са решили хората и аз лично съм съгласен с тях, защото дори и да ми позволяваше, аз пак не бих използвал * заради случки като горната.
| |
Тема
|
Re: Firebird процедура SELECT * ...
[re: NickBass]
|
|
Автор | Maнoл4o (Нерегистриран) |
Публикувано | 09.05.06 12:32 |
|
Да съгласен съм с теб и благодаря за изчерпателния отговор.
Моя проблем би се решил и ако има начин връшания резултат от процедурата да не е определен брои колони. Това ми е нужно понеже искам процедурата да прави SELECT от няколко таблици които и се предават като аргументи.
Пак трябва да дам пример с MSSQL. Там процедурата също си има output параметри но връща и recordset които се е получил от SELECT заявката вътре.
Тук може ли да се направи нещо подобно?
| |
Тема
|
Re: Firebird процедура SELECT * ...
[re: Maнoл4o]
|
|
Автор |
NickBass (бас-програмист) |
Публикувано | 09.05.06 15:37 |
|
За съжаление при Firebird (до 1.5.3) няма параметри от тип recordset. Можеш обаче да подадеш имената на таблиците като input параметри и да използваш
EXECUTE STATEMENT в процедурата. Ама..... защо ми се струва, че в твоя случай няма смисъл от сторната процедура. Защо не си генерираш заявката от самата програма? Е.... сигурно има защо, ама така може да си спестиш мъките. 
| |
|
|
|
|