Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
deimos
Зарегистрирован: 15.11.2001 Сообщения: 61 Откуда: Харьков
|
Добавлено: Пт Дек 14 2001 10:26 Заголовок сообщения: Имена таблиц в качестве параметров хранимых процедур |
|
|
Очень нужно написать хранимую процедуру, в которой будет производиться выборка из каких-либо таблиц одинаковой структуры, но вот из какой именно я хочу задать через входной параметр. Можно ли такое вообще реализовать??? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
krakozyabl
Зарегистрирован: 18.03.2002 Сообщения: 138 Откуда: Москва
|
Добавлено: Пт Дек 14 2001 10:53 Заголовок сообщения: Re: Имена таблиц в качестве параметров хранимых процедур |
|
|
Все зависит от твоей базы данных. На MS SQL это сделать можно. Сие называется динамическим запросом к базе данных, который формируется внутри хранимой процедуры. Передаешь туда имя таблицы, далее генеришь строку запроса, а потом командой exec выполняешь его. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
deimos
Зарегистрирован: 15.11.2001 Сообщения: 61 Откуда: Харьков
|
Добавлено: Пт Дек 14 2001 12:26 Заголовок сообщения: Re: Имена таблиц в качестве параметров хранимых процедур |
|
|
а в oracle? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Интересующийся Гость
|
Добавлено: Пт Дек 14 2001 12:52 Заголовок сообщения: Re: Имена таблиц в качестве параметров хранимых процедур |
|
|
вооще-то способов навалом: dbms_sql, execute immediate да и просто DSQL что-то похожее:
L varchar(2000); TYPE CURTYPE IS REF CURSOR; C CURTYPE; R C%ROWTYPE; -- record ................ L:='select || col1_name ||','|| col2_name ||' from '|| table_name ... ;
open C for L; loop fetch C into R; exit when C%notfound; if R.COL1_NAME='Y' then .... end if; exit when C%notfound; end loop; close C;
exception ..... |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
deimos
Зарегистрирован: 15.11.2001 Сообщения: 61 Откуда: Харьков
|
Добавлено: Пт Дек 14 2001 15:22 Заголовок сообщения: Re: Имена таблиц в качестве параметров хранимых процедур |
|
|
Слушай, если ты хорошо знаешь как это делать, помоги мне, а то я что-то не смог использовать то, что ты посоветовал.
Допустим мне нужно написать хранимую процедуру которая получает кол-во строк в таблице, имя которой задается через входной параметр. Напиши мне такую , плс. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Интересующийся Гость
|
Добавлено: Пт Дек 14 2001 20:59 Заголовок сообщения: Имей совесть. Читай доку или примеры. |
|
|
. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
deimos
Зарегистрирован: 15.11.2001 Сообщения: 61 Откуда: Харьков
|
Добавлено: Пн Дек 17 2001 18:03 Заголовок сообщения: Re: А у тебя самого есть совесть??? |
|
|
Послушай, форумы и существуют для того, чтобы помогать, а не читать нотации! Если ты знаешь, то почему бы не сказать? На доку все умеют ссылаться. Если бы у меня не было проблем я бы и не писал здесь! НИ ОДИН ИЗ твойх способов мне не удалось применить. Не работает. Сам подумай: open C for L; будет принимать L как строку 'L' а не как переменную, содержащую запрос. А остальные, предложенные тобой, способы работают толшько в Pro*C.
Что-то здесь не клеится... Толи ты не знаешь, то ли я совсем не понимаю... Ты сам попробуй...!!! И если у тебя все получиться не поленись привести код. Буду ОЧЕНЬ благодарен!!!!! (напоминаю - у меня ORACLE) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Интересующийся Гость
|
Добавлено: Вт Дек 18 2001 13:45 Заголовок сообщения: Есть. |
|
|
Я специально с использованием рефкурсоров сделал, что бы показать, что это работает.
CREATE OR REPLACE PACKAGE my_test AUTHID CURRENT_USER IS PROCEDURE get_number_of_rows( table_name IN VARCHAR2, number_of_rows OUT NUMBER) ; END my_test; / CREATE OR REPLACE PACKAGE BODY my_test IS PROCEDURE get_number_of_rows( table_name IN VARCHAR2, number_of_rows OUT NUMBER) IS TYPE CurTyp IS REF CURSOR; C CurTyp; L VARCHAR2(200); BEGIN L:='select count(*) from ' || table_name ; open C for L; fetch C into number_of_rows; close C; EXCEPTION when others then close C; RAISE; END get_number_of_rows; END my_test; / set serveroutput on DECLARE t_name VARCHAR2(32); n_rows NUMBER; BEGIN t_name := 'EMP'; my_test.get_number_of_rows(t_name, n_rows); dbms_output.put_line('number_of_rows = '||TO_CHAR(n_rows)); end; /
Package created.
Package body created.
number_of_rows = 14
PL/SQL procedure successfully completed.
SQL |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
deimos
Зарегистрирован: 15.11.2001 Сообщения: 61 Откуда: Харьков
|
Добавлено: Вт Дек 18 2001 14:10 Заголовок сообщения: Re: ДА, Действительно Есть. |
|
|
Спасибо, дружищще! Ты мне действительно помог. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
она Гость
|
Добавлено: Чт Авг 07 2003 16:31 Заголовок сообщения: Re: Имена таблиц в качестве параметров хранимых процедур |
|
|
а в psql?? можно ли в Pgsql в _функциях_ использовать селекты с _переменным_ значением таблицы. убилась уже :о( //-------- CREATE FUNCTION count_thread(int4, text) RETURNS int4 AS ' DECLARE id_thread ALIAS FOR $1; table_thread ALIAS FOR $2; cntt int4; BEGIN cntt:=(select count(*) as cnt from table_thread where thread=id_thread); RETURN cntt; END; 'LANGUAGE 'plpgsql'; //----------- если вместо table_thread поставить реальное имя - пашет. а с переменной матерится. хелпми!!!!!! |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|