powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как применить переменные в запросе внутри ХП
7 сообщений из 7, страница 1 из 1
Как применить переменные в запросе внутри ХП
    #35184153
СироП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть вот такая функция, возвращает курсор
Код: plaintext
ref_cur
.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION search_goods(str_find character varying)
  RETURNS refcursor AS
$$
DECLARE
    tmp_table varchar( 16 ) := 'search_tmp';
    ref_cur refcursor;
BEGIN 
    execute 'DROP TABLE IF EXISTS ' || tmp_table || ' CASCADE;';
    execute 'CREATE LOCAL TEMPORARY TABLE search_tmp AS 
        SELECT * FROM "tab1";';
    
    OPEN ref_cur FOR 
      SELECT * FROM tmp_table;
    return ref_cur;
END;
$$
  LANGUAGE 'plpgsql' VOLATILE
  COST  100 ;

Не могу сообразить как правильно в запрос для курсора передавать переменные.
В данном случае это переменная с именем таблицы
Код: plaintext
tmp_table
.

в конструкции:
Код: plaintext
1.
2.
    OPEN ref_cur FOR 
      SELECT * FROM tmp_table;

Эта функция не работает.
Мне понадобится при формировании запроса для курсора применять динамические конструкции и переменные.
Было бы замечательно если бы это возможно было делать через
Код: plaintext
execute
.
Помогите с этим разобратся.
Спасибо.
...
Рейтинг: 0 / 0
Как применить переменные в запросе внутри ХП
    #35184227
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.postgresql.org/docs/8.2/interactive/plpgsql-cursors.html
37.8.2.2. OPEN FOR EXECUTE
...
Рейтинг: 0 / 0
Как применить переменные в запросе внутри ХП
    #35184557
СироП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_serghttp://www.postgresql.org/docs/8.2/interactive/plpgsql-cursors.html
37.8.2.2. OPEN FOR EXECUTE

Переписал так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION search_goods(str_find character varying)
  RETURNS refcursor AS
$$
DECLARE
    tmp_table varchar( 16 ) := 'search_goods_tmp';
    ref_cur refcursor;
BEGIN 
    execute 'DROP TABLE IF EXISTS ' || tmp_table || ' CASCADE;';
    execute 'CREATE LOCAL TEMPORARY TABLE search_goods_tmp AS 
        SELECT * FROM "sprNmcl";';
    OPEN ref_cur FOR EXECUTE  
      'SELECT * FROM ' || tmp_table || ';';
    RETURN ref_cur;
END;
$$
  LANGUAGE 'plpgsql' VOLATILE
  COST  100 ;
ALTER FUNCTION search_goods(character varying) OWNER TO gate;

Вызываю так:
Код: plaintext
1.
2.
select search_goods('123');
fetch all from ref_cur;

в ответ получаю

Код: plaintext
1.
2.
3.
4.
5.
ERROR:  курсор "ref_cur" не существует

********** Ошибка **********

ERROR: курсор "ref_cur" не существует
SQL state: 34000
...
Рейтинг: 0 / 0
Как применить переменные в запросе внутри ХП
    #35184604
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте примерно так
Код: plaintext
1.
2.
3.
4.
begin;
select search_goods('123');
select * from pg_cursors;
fetch all from "<unnamed portal 4>";
...
Рейтинг: 0 / 0
Как применить переменные в запросе внутри ХП
    #35186764
СироП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_sergпопробуйте примерно так
Код: plaintext
1.
2.
3.
4.
begin;
select search_goods('123');
select * from pg_cursors;
fetch all from "<unnamed portal 4>";


Спасибо. Работает вот так:

Код: plaintext
1.
2.
select search_goods('123');
fetch all from "<unnamed portal 4>";

У меня еще пару интересных вопросов.

1. Как можно вызывать функцию и курсор в одну конструкцию, что то вот такое:
Код: plaintext
1.
fetch all from (select search_goods('sd'));
Можно ли вообще так?

2. Наверняка есть способ именовать курсоры статично чтоб не нужно было вообще отлавливать
Код: plaintext
<unnamed portal>?
...
Рейтинг: 0 / 0
Как применить переменные в запросе внутри ХП
    #35187013
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотрите ссылку на документацию, там есть примеры
...
Рейтинг: 0 / 0
Как применить переменные в запросе внутри ХП
    #35189401
СироП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
st_sergсмотрите ссылку на документацию, там есть примеры

Да спасибо, помогло. Работает так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION search_goods(refcursor,str_find character varying)
  RETURNS refcursor AS
$$
DECLARE
    tmp_table varchar( 16 ) := 'search_goods_tmp';
    --ref_cur refcursor;
BEGIN 
    execute 'DROP TABLE IF EXISTS ' || tmp_table || ' CASCADE;';
    execute 'CREATE LOCAL TEMPORARY TABLE ' || tmp_table || ' AS 
        SELECT * FROM "sprNmcl";';
    OPEN $ 1  FOR EXECUTE  
      'SELECT * FROM "sprNmcl" LIMIT 500;';
    RETURN $ 1 ;
END;
$$
  LANGUAGE 'plpgsql' VOLATILE
  COST  100 ;

Вызываю:

Код: plaintext
1.
2.
3.
4.
BEGIN;
SELECT search_goods('fc','');
FETCH ALL IN fc;
COMMIT;
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как применить переменные в запросе внутри ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]