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

Читаю описание динамического SQL в документации по версии 8.1
(http://www.postgresql.org/docs/8.1/static/ecpg-dynamic.html)

Вот что там написано:
====================================
...........
...........
A more powerful way to execute arbitrary SQL statements is to prepare them once and execute the prepared statement as often as you like. It is also possible to prepare a generalized version of a statement and then execute specific versions of it by substituting parameters. When preparing the statement, write question marks where you want to substitute parameters later. For example:

EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = "INSERT INTO test1 VALUES(?, ?);";
EXEC SQL END DECLARE SECTION;

EXEC SQL PREPARE mystmt FROM :stmt;
...
EXEC SQL EXECUTE mystmt USING 42, 'foobar';
====================================

Но ведь это же бессмыслица какая-то
Смысл динамического SQL в том, что я могу подготавливать (prepare) и потом выполнять (execute) любые заранее неизвестные запросы.
В том числе, с заранее неизвестным набором входных параметров.

Т.е. я хочу, чтобы было (как в Sybase и в Interbase например) так:
вызываем prepare и передаем туда произвольный текст запроса в виде строки, в ответ получаем структуру входных параметров (количество и тип каждого) и структуру выходной таблицы (если это select).

Правильно ли я понимаю, что в postgres такой возможности нет ?
Да, на всякий случай, речь про интерфейс из Си (или Си++).

Мы с postgres не работаем пока, просто смотрим в его сторону.
И видим вот такие удивительные недоделки....

Любителей postgres прошу не обижаться :)
Я не в том смысле, что, мол, Postgres - Г....,
я хочу узнать ответ на свой "вопрос - это есть или этого нет ? " !!
...
Рейтинг: 0 / 0
Динамический SQL в PostgreSQL
    #33441920
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
блин выж читаете!
1) читайте все
2) читаете не все? см 1)

авторНо ведь это же бессмыслица какая-то
Смысл динамического SQL в том, что я могу подготавливать (prepare) и потом выполнять (execute) любые заранее неизвестные запросы.
любые заранее неизвестные запросы вы можете выполнить и так без prepare, а то что вы там делали с другими базами и как в них чего записывается это уже их проблемы и их библиотеки для работы с ними же.

авторПравильно ли я понимаю, что в postgres такой возможности нет ?
Да, на всякий случай, речь про интерфейс из Си (или Си++).

возможность есть даже из этого примера видно что ее не может не быть.

авторМы с postgres не работаем пока, просто смотрим в его сторону.
И видим вот такие удивительные недоделки....
самое интересное вас еще и не 1 человек! я всегда думал что 1 голова хорошо а n (где n > 2) лучше

PS
еще раз внимательно (возможно со словарем прочитайте еще раз то что вы уже "читали") и помедитируйте если не выйдет я могу сказать для чего это все нужно.
...
Рейтинг: 0 / 0
Динамический SQL в PostgreSQL
    #33442032
sml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sml
Гость
Очень жаль, что в Вашем, vfabr, ответе нет ничего кроме эмоций.
Вероятно, я недостаточно подробно описал, что я хочу получить.
Если упростить все, насколько это возможно, то я хочу написать на Си
функцию такого вида:
int prepareAndExecute( const char *sql, int noParams, ... )
{
....
}

здесь:
sql - текст SQL-запроса со знаками ? на местах параметров
noParams - число параметров
... - аргументы, задающие типы и значения параметров

Пример вызова этой функции:
prepareAndExecute(
"select from T where F1=? and F2=?",
2,
MY_TYPE_INT, 100,
MY_TYPE_CHAR, "aaa" )

"select...." - текст запроса
2 - число параметров
MY_TYPE_INT, MY_TYPE_CHAR - это некие мои константы,
которые означают типы параметров запроса
100 и "aaa" - значения параметров запроса

Функция должна выполнить указанный запрос с указанными параметрами.

Вопрос: могу ли я такую функцию реализовать, использую библиотеки postgres ?
Вопрос "для чего это нужно" прошу в этой теме не обсуждать, т.к. это тема другая.

Из приведенных в документации примеров я пока вижу, что это невозможно.

Я не исключаю своей тупости и слепоты и прошу Вас, vfabr,
дать ссылку на какой-либо док, где нужная мне возможность была бы описана.

Пожалуйста, всех желающих ответить на эту тему,
очень прошу понять ее постановку, прежде чем отвечать.
...
Рейтинг: 0 / 0
Динамический SQL в PostgreSQL
    #33442143
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.postgresql.org/docs/8.1/static/client-interfaces.html
...
Рейтинг: 0 / 0
Динамический SQL в PostgreSQL
    #33442212
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.postgresql.org/docs/8.1/static/libpq-exec.html
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Динамический SQL в PostgreSQL
    #33442344
-me-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sml
сли упростить все, насколько это возможно, то я хочу написать на Си функцию такого вида:
int prepareAndExecute( const char *sql, int noParams, ... )

см. PQprepare, PQexecPrepared, PQexecParams
sml
Т.е. я хочу, чтобы было (как в Sybase и в Interbase например) так:
вызываем prepare и передаем туда произвольный текст запроса в виде строки, в ответ получаем структуру входных параметров (количество и тип каждого) и структуру выходной таблицы (если это select).

Такая возможность (получитьрезультаты разбора) есть на уровне frontend/backend протокола v3:
43.2.3. Extended Query
The Describe message (statement variant) specifies the name of an existing prepared statement (or an empty string for the unnamed prepared statement). The response is a ParameterDescription message describing the parameters needed by the statement, followed by a RowDescription message describing the rows that will be returned when the statement is eventually executed (or a NoData message if the statement will not return rows).

но в libpq пока(?) нет ф-и типа PGresult * PQdescribe(PGconn * conn, const char * stmtName, int * nParams, Oid ** paramTypeOids);
28.3. Command Execution Functions
At present, there is no way to determine the actual data type inferred for any parameters whose types are not specified in paramTypes[]. This is a libpq omission that will probably be rectified in a future release.

Хотя, если извратиться, то можно и самому дописать недостающее :) (чтоб погрязнуть в сырцах и отладке )
(пример на Ruby, использует модифицированый драйвер ruby-postgres и подправленную libpq - ну, да, да, мне было нехрен делать :) )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
def explain(conn, stmt_name)
  printf "Prepared Statement: <%s> ", stmt_name
  (param_oids, result) = conn.describe(stmt_name)
  print "OIDS(#{param_oids.join(',')}) Returns:["
  result.fields.each_with_index { |f, i| print "(#{f}:#{result.type(i)})" }
  print  "]\n"
end
conn = PGconn.new
conn.exec("BEGIN")
conn.exec("CREATE TABLE item (item_id serial, name text)")
# вызов пойдет через PQexecParams
conn.exec("INSERT INTO item (name) VALUES ($1)", 'first_test_item')
# пример Prepare/Describe
conn.exec("prepare t1_s (text, int ) as select * from item where name like $1 or item_id = $2 ")
conn.exec("prepare t2_s (text) as insert into  item (name) values ($1)")
explain(conn, 't1_s')
explain(conn, 't2_s')
conn.exec("EXECUTE t2_s ('test_item')")
pp conn.query("EXECUTE t1_s ('test_item', 1)")
conn.exec("ROLLBACK")
Результат:
Код: plaintext
1.
2.
3.
Prepared Statement: <t1_s> OIDS( 25 , 23 ) Returns:[(item_id: 23 )(name: 25 )]
Prepared Statement: <t2_s> OIDS( 25 ) Returns:[]
[[ 1 , "first_test_item"], [ 2 , "test_item"]]

Так что все в прЫнцыпе можно :)
...
Рейтинг: 0 / 0
Динамический SQL в PostgreSQL
    #33442353
-me-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ешшо пример - используется PQprepare (в драйвере):
Код: plaintext
1.
2.
3.
4.
conn.prepare("t1_s", "select * from item where name like $1 or item_id = $2 ")
explain(conn, "t1_s")
-- результат --
Prepared Statement: <t1_s> OIDS( 25 , 23 ) Returns:[(item_id: 23 )(name: 25 )]
...
Рейтинг: 0 / 0
Динамический SQL в PostgreSQL
    #33442595
sml
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sml
Гость
понятно
Всем спасибо
Нужна именно возможность получить (как результат prepare) от SQL-сервера описание
структуры его входных параметров и структуры выходных данных.
Первого, как я понял, сейчас официально нет...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Динамический SQL в PostgreSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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