powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / условия в SQL коде
15 сообщений из 15, страница 1 из 1
условия в SQL коде
    #34349128
Tertium Organum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я все портирую с MSSQL код, и вот ситуация:
Код: plaintext
1.
2.
IF NOT EXISTS (select * from sysobjects o where o.name='mytable') 
        CREATE TABLE mytable(i int, vc varchar( 255 ));
в одну строку создаем таблицу если ее нет. В постгре я щас делаю сначала запрос:
Код: plaintext
1.
2.
3.
4.
        select c.relname
        from pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
        where n.nspname = 'public' and c.relkind = 'r' 
        order by relname
потом в сёвом коде проверяю есть ли среди результата искомая таблица и тада запускаю или нет ее создание.

вобщем такой способ не очень нравица, а вроде как конструкции plsql в коде использовать нельзя.
возможно, не разобрался.
подскажете, как разрулить?
...
Рейтинг: 0 / 0
условия в SQL коде
    #34349218
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tertium Organumя все портирую с MSSQL код, и вот ситуация:
Код: plaintext
1.
2.
IF NOT EXISTS (select * from sysobjects o where o.name='mytable') 
        CREATE TABLE mytable(i int, vc varchar( 255 ));
в одну строку создаем таблицу если ее нет. В постгре я щас делаю сначала запрос:
Код: plaintext
1.
2.
3.
4.
        select c.relname
        from pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
        where n.nspname = 'public' and c.relkind = 'r' 
        order by relname
потом в сёвом коде проверяю есть ли среди результата искомая таблица и тада запускаю или нет ее создание.

вобщем такой способ не очень нравица, а вроде как конструкции plsql в коде использовать нельзя.
возможно, не разобрался.
подскажете, как разрулить?
Я это используя:
Код: plaintext
1.
 DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
.
Т.е.
Код: plaintext
1.
2.
DROP TABLE IF EXISTS tpmb.tvoymat;
CREATE TABLE tpmb.tvoymat();
Не совсем то, конечно, но может поможет.

Другой вариант - создание ХП на pl/pgsql со скриптом создания всего чего тебе надобно. Благо никто ХП не ограничивает на наличие/отсутствие DDL.
...
Рейтинг: 0 / 0
условия в SQL коде
    #34349598
Tertium Organum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это понятно, но у меня НЕ НАДО убивать таблицы если они уже есть :)) данные в них.
а насчет написания ф-ции создания, то моя система создает всю базу с потрохами при старте, если базы нет. в сёвом коде. так что смысла в хп нет, все равно его же и создавать в сях.
надо было:
Код: plaintext
1.
2.
3.
4.
если не есть таблица мой_таблица
  создать таблица мой_таблица
иначе 
  ничего
...
Рейтинг: 0 / 0
условия в SQL коде
    #34350252
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может просто создавать таблицу. А если она уже есть то будет эксепшен, который и отлавливать, и в нем ни чего не делать.
...
Рейтинг: 0 / 0
условия в SQL коде
    #34512022
Sashich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как отловить такой иксепшен, какой он имеет код?
...
Рейтинг: 0 / 0
условия в SQL коде
    #34512453
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может я не оч понял задачу - но вроде вот оно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or replace function test.test_create_tbl() returns void as
$$
begin
	if not exists(
		select * from information_schema.tables 
		where table_schema='test' 
			and table_name='test'	
			and table_type='BASE TABLE') then
		create table test.test(id serial primary key,name text,age int check(age> 0  and age< 150 ));
	end if;
end
$$ language plpgsql;
...
Рейтинг: 0 / 0
условия в SQL коде
    #34512802
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create or replace function mk_tab() returns int
as $$
begin
   create table my_tab(f1 int);
   return  0 ;
exception
   when duplicate_table then
      return - 1 ;
end;
$$ language plpgsql;
37.7.5. Trapping Errors
Appendix A. PostgreSQL Error Codes
...
Рейтинг: 0 / 0
условия в SQL коде
    #34648365
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно я подведу итог?
У меня такая же проблема, есть множество запросов MS SQL в которых используется IF, и при помощи них создаются и удаляются таблицы, и еще много чего разного. И все это нужно перевести в PostgreSQL.
И таким образом, не используя хранимые процедуры, я в принципе не могу воспроизвести конструкцию
IF Условие Действие
так? И единственный выход для меня - это написать свой собственный IF ?

ЗЫ Пишу SQL-транслятор, который позволит 1С 7.7 работать с PostgreSQL, со всеми вытекающими ограничениями.
...
Рейтинг: 0 / 0
условия в SQL коде
    #34648468
kamerad1981
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sashichа как отловить такой иксепшен, какой он имеет код?
А какое это имеет значение, если таблица уже создана или была создана запросом то и пользуйся ей, а если она не создается по каким-либо другим причинам, то if тут тоже не поможет.
К тому же если пользоваться стандартной библиотекой, то при возникновении ошибки к тебе придет ее текст, а не только код.
...
Рейтинг: 0 / 0
условия в SQL коде
    #34648571
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для больших извращенцев, инсталлирующих через psql консоль, могу предложить такое решение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
\! rm test_out.sql
\t
\o test_out.sql
SELECT CASE WHEN Count(*) =  1  THEN ''::VARCHAR
            ELSE 'CREATE TABLE mytable15(i int, vc varchar(255));'
       END
FROM   pg_tables
WHERE  tablename = 'mytable15'
UNION ALL
SELECT CASE WHEN Count(*) =  1  THEN ''::VARCHAR
            ELSE '\i mytable16_creation_script.sql'
       END
FROM   pg_tables
WHERE  tablename = 'mytable16';
\o
\t
\i test_out.sql

P.s.
Не ругайте сильно :)
...
Рейтинг: 0 / 0
условия в SQL коде
    #34648621
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конкретизирую проблему:

В ODBC есть функция SQLExecDirect("SQL запрос")
Собственно, выполняет SQL запрос. Для MS SQL этот запрос выглядит примерно так:
IF условие Действие
Причем условия и действия - самые разные, не только создание таблиц.
И вот эту структуру надо перенести на PostgreSQL, причем не хотелось бы каждый раз делать шаги
1) Создаем процедуру, внутри которой IF
2) Выполняем
3) Удаляем за ненадобностью
А вот если бы удалось написать хранимую процедуру
_IF(условие, действие)
где Условие и Действие - текстовые переменные, то это было бы вообще замечательно
Это реально?
...
Рейтинг: 0 / 0
условия в SQL коде
    #34648625
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может как-то так попробовать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
--drop function test.exec_if_not_exists(text,text)
create or replace function test.exec_if_not_exists(p_query_exists text,p_query_exec text) returns bool as 
$$
declare
	i int;
begin
	execute p_query_exists;
	get diagnostics i=row_count;
	--raise notice 'row_count=%',i;
	if i> 0  then 
		return false;
	else
		execute(p_query_exec); 
		return true;
	end if; 
end
$$ language plpgsql;
comment on function test.exec_if_not_exists(text,text) is 'если выполнение запроса, текст которого даётся первым параметром не 
возвращает строк - то выполняется строка sql задаваемая вторым параметром.';

select test.exec_if_not_exists(
'select * from information_schema.tables where table_type=''BASE TABLE'' and table_catalog=''cito'' and table_name=''test_if_exists'''::text,
	'create table test_if_exists(id serial primary key,descr text unique not null)'::text);
/*
drop table test_if_exists;
select * from test_if_exists;
select * from information_schema.tables where table_type='BASE TABLE' and table_catalog='cito' and table_name='test_if_exists';
*/
...
Рейтинг: 0 / 0
условия в SQL коде
    #34648640
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZashibisКонкретизирую проблему:

В ODBC есть функция SQLExecDirect("SQL запрос")
Собственно, выполняет SQL запрос. Для MS SQL этот запрос выглядит примерно так:
IF условие Действие
Причем условия и действия - самые разные, не только создание таблиц.
И вот эту структуру надо перенести на PostgreSQL, причем не хотелось бы каждый раз делать шаги
1) Создаем процедуру, внутри которой IF
2) Выполняем
3) Удаляем за ненадобностью
А вот если бы удалось написать хранимую процедуру
_IF(условие, действие)
где Условие и Действие - текстовые переменные, то это было бы вообще замечательно
Это реально?

во - это как раз то, что я написал в предыдущем топике :). или почти то по крайней мере :)
...
Рейтинг: 0 / 0
условия в SQL коде
    #34648647
Фотография Zashibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ооо! Да вы просто спасли мою шкуру :)
Это именно то что надо!
Пожалуй я осяду на этом форуме, пока пишу этот проект :)
...
Рейтинг: 0 / 0
условия в SQL коде
    #34651648
Фотография aov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обращайтесь если что - можно на oleg@sbs-it.zp.ua.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / условия в SQL коде
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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